from datetime import datetime
from typing import Optional, List

from fastapi import Form
from pydantic import BaseModel, Field, constr
from enum import Enum


class AuthTypeEnum(str, Enum):
    phone = "phone"
    google = "google"


class CustomerBase(BaseModel):
    name: constr(min_length=1, max_length=255)
    phone: constr(min_length=3, max_length=50)
    comment: Optional[str] = Field(default=None, max_length=1024)
    auth_type: AuthTypeEnum = AuthTypeEnum.phone


class CustomerCreate(CustomerBase):
    password: constr(min_length=6, max_length=255)



class CustomerUpdate:
    def __init__(
        self,
        name: Optional[str] = Form(None),
        phone: Optional[str] = Form(None),
        password: Optional[str] = Form(None),
        comment: Optional[str] = Form(None),
        banned: Optional[bool] = Form(None),
    ):
        self.name = name
        self.phone = phone
        self.password = password
        self.comment = comment
        self.banned = banned


class CustomerResponse(BaseModel):
    customer_id: int
    name: str
    phone: str
    comment: Optional[str] = None
    date_added: datetime
    date_modify: datetime
    ip: Optional[str] = None
    logo: Optional[str] = None
    auth_type: AuthTypeEnum
    banned: bool

    model_config = {
        "from_attributes": True
    }

class CustomerResponseWrapper(BaseModel):
    data: Optional[CustomerResponse]
    status: bool

class CustomerListResponseWrapper(BaseModel):
    data: List[CustomerResponse]
    status: bool
    total: int
    limit: int
    page: int

class DashboardSchema(BaseModel):
    total_quantity: int
    new_quantity: int


class CustomerOutSchema(BaseModel):
    customer_id: int
    name: str
    phone: str
    comment: Optional[str] = None
    logo: Optional[str] = None
    ip: Optional[str] = None
    auth_type: str
    banned: bool
    date_added: datetime
    date_modify: datetime

    class Config:
        orm_mode = True


class DataSchema(BaseModel):
    items: List[CustomerOutSchema]
    dashboard: Optional[DashboardSchema] = None


class CustomerListResponse(BaseModel):
    data: List[CustomerOutSchema]
    dashboard: Optional[DashboardSchema] = None
    total: int
    page: int
    limit: int
    status: bool
class CreateCustomerResponse(BaseModel):
    data: CustomerOutSchema
    Status: bool