from pydantic import BaseModel, Field, field_validator, ConfigDict
from typing import Optional
from datetime import datetime
from enum import Enum


class SettingType(str, Enum):
    STRING = "STRING"
    NUMBER = "NUMBER"
    BOOLEAN = "BOOLEAN"
    JSON = "JSON"


class PlatformsettingBase(BaseModel):
    setting_key: str = Field(..., min_length=1, max_length=255)
    setting_value: str = Field(..., min_length=1)
    setting_type: SettingType
    description: Optional[str] = None

    @field_validator("setting_key")
    @classmethod
    def validate_setting_key(cls, v: str) -> str:
        if not v or not v.strip():
            raise ValueError("Setting key cannot be empty")
        return v.strip()

    @field_validator("setting_value")
    @classmethod
    def validate_setting_value(cls, v: str) -> str:
        if not v or not v.strip():
            raise ValueError("Setting value cannot be empty")
        return v.strip()


class PlatformsettingCreate(PlatformsettingBase):
    pass


class PlatformsettingUpdate(BaseModel):
    setting_key: Optional[str] = Field(None, min_length=1, max_length=255)
    setting_value: Optional[str] = Field(None, min_length=1)
    setting_type: Optional[SettingType] = None
    description: Optional[str] = None

    @field_validator("setting_key")
    @classmethod
    def validate_setting_key(cls, v: Optional[str]) -> Optional[str]:
        if v is not None and (not v or not v.strip()):
            raise ValueError("Setting key cannot be empty")
        return v.strip() if v else None

    @field_validator("setting_value")
    @classmethod
    def validate_setting_value(cls, v: Optional[str]) -> Optional[str]:
        if v is not None and (not v or not v.strip()):
            raise ValueError("Setting value cannot be empty")
        return v.strip() if v else None


class PlatformsettingResponse(PlatformsettingBase):
    id: str
    created_at: datetime
    updated_at: datetime

    model_config = ConfigDict(from_attributes=True)