from enum import Enum
from pydantic import BaseModel, Field, EmailStr, validator
from bson import ObjectId
from datetime import datetime
from typing import Optional, List

class Status(str, Enum):
    ACTIVE = "active"
    INACTIVE = "inactive"
    MAINTENANCE = "maintenance"

class Address(BaseModel):
    street: str
    city: str
    state: str
    postal_code: str
    country: str

class VendorType(str, Enum):
    VENDOR = "vendor"
    DEALER = "dealer"
    MANUFACTURER = "manufacturer"
    SERVICE_CENTER = "service_center"

class VendorBase(BaseModel):
    vendor_name: str
    address: Address
    phone: str
    contact_person_name: str
    email: EmailStr
    vendor_type: VendorType
    license_number: str
    tax_id: Optional[str] = None
    website: Optional[str] = None
    logo: Optional[str] = None
    status: Status = Status.ACTIVE

class VendorCreate(VendorBase):
    account_id: str = ""
    user_id: str = ""
    vendor_id: Optional[str] = None
    v_id: Optional[int] = None

class Vendor(BaseModel):
    id: str = Field(default=None, alias="_id")
    vendor_name: str
    address: Address
    phone: str
    contact_person_name: str
    email: str
    vendor_type: str
    license_number: str
    tax_id: Optional[str]
    website: Optional[str]
    logo: Optional[str]
    status: Optional[str]
    created_date: datetime
    updated_date: datetime
    vendor_id: Optional[str]
    v_id: Optional[int]

    class Config:
        arbitrary_types_allowed = True
        json_encoders = {ObjectId: str}
        allow_population_by_field_name = True

class VendorResponse(Vendor):
    pass

class VendorResponseList(BaseModel):
    total_count: int
    vendors: List[VendorResponse]

class VendorUpdate(BaseModel):
    vendor_name: Optional[str] = Field(None, min_length=2, max_length=100)
    address: Optional[Address] = None
    phone: Optional[str] = Field(None, min_length=5, max_length=20)
    contact_person_name: Optional[str] = Field(None, min_length=2, max_length=50)
    email: Optional[EmailStr] = None
    vendor_type: Optional[VendorType] = None
    logo: Optional[str] = None
    license_number: Optional[str] = Field(None, min_length=2, max_length=50)
    tax_id: Optional[str] = Field(None, min_length=2, max_length=50)
    website: Optional[str] = None
    status: Status = Field(default=Status.ACTIVE)