from fastapi import Query
from datetime import datetime
from typing import Optional, List, Union, Dict
from pydantic.main import BaseModel
from pydantic.types import Json
from pydantic import Field
from src.core.utils.enums import SettingsInputFieldTypes
from src.apps.base.schemas.common import BaseSchema
from .merchant_common import MerchantSchema, MerchantContactBase


# Shared properties
class MerchantSettingsBase(BaseSchema):
    key: Optional[str] = Field(
        description="Key of MerchantSettings. The primary identifier"
    )
    value: Optional[str] = Field(
        description="Form Value, inclusive of alphabetical characters only",
        default=None,
    )
    label: Optional[str] = Field(
        description="Form label, inclusive of alphabetical characters only",
        default=None,
    )
    group: Optional[str] = Field(
        description="A valid string, can be used for categorizing settings."
    )
    field_name: Optional[str] = Field(description="An unique and valid form input name")
    field_type: Optional[SettingsInputFieldTypes] = Field(
        description="HTML input field type"
    )
    field_options: Optional[Json] = Field(
        description="Optional key value pairs as an JSON object, Used when HTML input type is selct or multiselect, for storing options mapping as key value pairs"
    )
    has_lock: Optional[bool] = Field(
        description="Does this setting have lock feature enabled?"
    )
    is_locked: Optional[bool] = Field(
        description="Is this setting locked? Only applicable if has_lock is enabled"
    )
    display_order: Optional[int] = Field(description="Display order of this setting")


class MerchantSettingsSchema(MerchantSettingsBase):
    id: int = Field(description="Id of MerchantSettings resource")
    merchant: Optional[MerchantSchema] = Field(
        description="Merchant of this MerchantSettings resource"
    )


class MerchantSettingsCreateRequestSchema(MerchantSettingsBase):
    pass


class MerchantSettingsUpdateRequestSchema(BaseSchema):
    id: int = Field(description="Id of MerchantSettings resource")
    label: Optional[str] = Field(
        description="Form label, inclusive of alphabetical characters only"
    )
    value: Optional[str] = Field(
        description="Form Value, inclusive of alphabetical characters only"
    )
    has_lock: Optional[bool] = Field(
        description="Does this setting have lock feature enabled?"
    )
    field_options: Optional[Union[List[Dict], str]] = Field(description="Field Options")
    is_locked: Optional[bool] = Field(
        description="Is this setting locked? Only applicable if has_lock is enabled"
    )
