from datetime import datetime
from typing import Any

from pydantic import BaseModel, field_validator


class FieldConfigSchema(BaseModel):
    id: int | None = None
    field_name: str
    field_key: str
    field_type: str
    field_icon: str | None = None
    field_options: list[str] | None = None
    default_value: str | None = None
    is_required: bool = False
    sort_order: int = 0
    description: str | None = None
    validation_rules: dict[str, Any] | None = None

    @field_validator("field_key")
    @classmethod
    def validate_field_key(cls, v):
        if not v.replace("_", "").isalnum():
            raise ValueError("field_key must contain only letters, numbers, and underscores")
        return v.lower()


class DataModelCreate(BaseModel):
    name: str
    key: str
    icon: str = "📊"
    description: str | None = None
    type: str = "user"
    status: str = "enabled"
    fields: list[FieldConfigSchema] = []

    @field_validator("key")
    @classmethod
    def validate_key(cls, v):
        if not v.replace("_", "").isalnum():
            raise ValueError("key must contain only letters, numbers, and underscores")
        return v.lower()


class DataModelUpdate(BaseModel):
    name: str | None = None
    icon: str | None = None
    description: str | None = None
    status: str | None = None
    fields: list[FieldConfigSchema] | None = None


class DataModelResponse(BaseModel):
    id: int
    name: str
    key: str
    icon: str
    description: str | None
    type: str
    status: str
    fields: list[FieldConfigSchema]
    created_at: datetime
    updated_at: datetime

    class Config:
        from_attributes = True
