from fastapi import Query
from datetime import datetime
from typing import Optional, List, Union, Dict
from pydantic import BaseModel, Field, ConfigDict
from src.apps.base.schemas.common import (
    BaseSchema,
    AddressCreateRequestSchema,
    AddressUpdateRequestSchema,
    AddressSchema,
)
from .merchant_common import MerchantSchema, MerchantContactBase


class MerchantContactSchema(MerchantContactBase):
    model_config = ConfigDict(from_attributes=True)
    
    id: int = Field(description="Id of merchant contact resource")
    contact_id: Optional[str] = Field(default=None, description="Merchant contact unique id")
    addresses: Optional[List[AddressSchema]] = Field(
        default=None,
        description="Customer's available addresses list"
    )
    created_at: Optional[datetime] = Field(
        default=None,
        description="Created date and time as unix timestamp"
    )
    updated_at: Optional[datetime] = Field(
        default=None,
        description="Updated date and time as unix timestamp"
    )
    deleted_at: Optional[datetime] = Field(
        default=None,
        description="Deleted date and time as unix timestamp"
    )


class MerchantContactCreateSchema(MerchantContactBase):
    model_config = ConfigDict(
        from_attributes=True,
        json_schema_extra={
            "example": {
                "email": "michaelhussy@yopmail.com",
                "name": "Michael Hussy",
                "phone": "+1 871 71123",
            }
        }
    )
    
    address: Optional[AddressCreateRequestSchema] = Field(
        default=None,
        description="Merchant contact address"
    )


class MerchantContactUpdateSchema(MerchantContactBase):
    model_config = ConfigDict(
        from_attributes=True,
        json_schema_extra={
            "example": {
                "phone": "+9176787678",
                "name": "John Doe",
                "is_active": True,
            }
        }
    )
    
    address: Optional[AddressUpdateRequestSchema] = Field(
        default=None,
        description="Customer's billing address"
    )


class MerchantContactFilterSchema(BaseModel):
    search: Optional[str] = Query(
        default=None, description="Search by name, phone, email etc"
    )
    is_active: Optional[int] = Query(
        default=1, description="Active status of merchant contact"
    )
