from fastapi import Query
from datetime import datetime
from typing import Optional, List, Union, Dict
from pydantic import BaseModel, Field, field_validator, ConfigDict
from src.apps.base.schemas.common import BaseSchema, AddressCreateRequestSchema, AddressUpdateRequestSchema
from .merchant_common import MerchantSchema, MerchantLocationBase
from src.apps.base.utils import regexp
from src.core.utils.enums import MerchantBulkActions


class MerchantLocationSchema(MerchantLocationBase):
    model_config = ConfigDict(from_attributes=True)
    
    id: int = Field(description="Id of merchant contact resource")
    created_at: Optional[datetime] = Field(
        default=None,
        description="Created date and time as unix timestamp"
    )
    updated_at: Optional[datetime] = Field(
        default=None,
        description="Created date and time as unix timestamp"
    )
    deleted_at: Optional[datetime] = Field(
        default=None,
        description="Created date and time as unix timestamp"
    )


class MerchantLocationCreateSchema(MerchantLocationBase):
    model_config = ConfigDict(from_attributes=True)
    
    address: Optional[AddressCreateRequestSchema] = Field(
        default=None,
        description="Address relationship field"
    )


class MerchantLocationUpdateSchema(MerchantLocationBase):
    model_config = ConfigDict(from_attributes=True)
    
    address: Optional[AddressUpdateRequestSchema] = Field(
        default=None,
        description="Address relationship field"
    )


class MerchantLocationFilterSchema(BaseSchema):
    model_config = ConfigDict(from_attributes=True)
    
    search: str = Query(default="", description="Single search for merchant contacts")
    is_active: int = Query(
        default=0, description="Merchant location filter with active/not active"
    )


class MerchantAccountBulkActions(BaseModel):
    action: MerchantBulkActions = Field(
        description="Type of action which needs to be performed."
    )
    ids: List[str] = Field(
        description="An array of merchant_ids of the items that you want to perform actions for"
    )

    @field_validator("ids")
    @classmethod
    def validate_ids(cls, v):
        max_limit = 10
        if v is None or len(v) == 0:
            raise ValueError(f"Please provide atleast one merchant ids")
        if len(v) > max_limit:
            raise ValueError(
                f"You can provide atmost of {max_limit} merchant ids at once"
            )
        for item in v:
            if not regexp.test(item, regexp.MERCHANT_UNIQUE_ID):
                raise ValueError(f"'{item}' is not a valid merchant ids")
        return v
