# -*- coding: utf-8 -*-

from pydantic import BaseModel, ConfigDict, Field, field_validator
from fastapi import Query

from app.core.base_schema import BaseSchema


class GenDBTableSchema(BaseModel):
    """数据库中的表信息（跨方言统一结构）。
    - 供“导入表结构”与“同步结构”环节使用。
    """

    model_config = ConfigDict(from_attributes=True)

    database_name: str | None = Field(default=None, description='数据库名称')
    table_name: str | None = Field(default=None, description='表名称')
    table_type: str | None = Field(default=None, description='表类型')
    table_comment: str | None = Field(default=None, description='表描述')


class GenTableColumnSchema(BaseModel):
    """代码生成业务表字段创建模型（原始字段+生成配置）。
    - 从根本上解决问题：所有字段都设置了合理的默认值，避免None值问题
    """
    model_config = ConfigDict(from_attributes=True)

    table_id: int = Field(default=0, description='归属表编号')
    column_name: str = Field(default='', description='列名称')
    column_comment: str | None = Field(default='', description='列描述')
    column_type: str = Field(default='varchar(255)', description='列类型')
    column_length: str | None = Field(default='', description='列长度')
    column_default: str | None = Field(default='', description='列默认值')
    is_pk: bool = Field(default=False, description='是否主键（True是 False否）')
    is_increment: bool = Field(default=False, description='是否自增（True是 False否）')
    is_nullable: bool = Field(default=True, description='是否允许为空（True是 False否）')
    is_unique: bool = Field(default=False, description='是否唯一（True是 False否）')
    python_type: str | None = Field(default='str', description='python类型')
    python_field: str | None = Field(default='', description='python字段名')
    is_insert: bool = Field(default=True, description='是否为插入字段（True是 False否）')
    is_edit: bool = Field(default=True, description='是否编辑字段（True是 False否）')
    is_list: bool = Field(default=True, description='是否列表字段（True是 False否）')
    is_query: bool = Field(default=True, description='是否查询字段（True是 False否）')
    query_type: str | None = Field(default=None, description='查询方式（等于、不等于、大于、小于、范围）')
    html_type: str | None = Field(default='input', description='显示类型（文本框、文本域、下拉框、复选框、单选框、日期控件）')
    dict_type: str | None = Field(default='', description='字典类型')
    sort: int = Field(default=0, description='排序')


class GenTableColumnOutSchema(GenTableColumnSchema, BaseSchema):
    """
    业务表字段输出模型
    """
    model_config = ConfigDict(from_attributes=True)

    super_column: str | None = Field(default='0', description='是否为基类字段（1是 0否）')


class GenTableSchema(BaseModel):
    """代码生成业务表更新模型（扩展聚合字段）。
    - 聚合：`columns`字段包含字段列表；`pk_column`主键字段；子表结构`sub_table`。
    """
    """代码生成业务表基础模型（创建/更新共享字段）。
    - 说明：`params`为前端结构体，后端持久化为`options`的JSON。
    """
    model_config = ConfigDict(from_attributes=True)

    table_name: str= Field(..., description='表名称')
    table_comment: str | None = Field(default=None, description='表描述')
    class_name: str | None = Field(default=None, description='实体类名称')
    package_name: str | None = Field(default=None, description='生成包路径')
    module_name: str | None = Field(default=None, description='生成模块名')
    business_name: str | None = Field(default=None, description='生成业务名')
    function_name: str | None = Field(default=None, description='生成功能名')
    sub_table_name: str | None = Field(default=None, description='关联子表的表名')
    sub_table_fk_name: str | None = Field(default=None, description='子表关联的外键名')
    parent_menu_id: int | None = Field(default=None, description='所属父级分类,生成页面时候生成菜单使用')
    description: str | None = Field(default=None, max_length=255, description="描述")

    columns: list['GenTableColumnOutSchema'] | None = Field(default=None, description='表列信息')

    @field_validator('table_name')
    @classmethod
    def table_name_update(cls, v: str) -> str:
        """更新表名称"""
        if not v:
            raise ValueError('表名称不能为空')
        return v


class GenTableOutSchema(GenTableSchema, BaseSchema):
    """业务表输出模型（面向控制器/前端）。
    """
    model_config = ConfigDict(from_attributes=True)

    pk_column: GenTableColumnOutSchema | None = Field(default=None, description='主键信息')
    sub_table: GenTableSchema | None = Field(default=None, description='子表信息')
    sub: bool | None = Field(default=None, description='是否为子表')


class GenTableQueryParam:
    """代码生成业务表查询参数
    - 支持按`table_name`、`table_comment`进行模糊检索（由CRUD层实现like）。
    - 空值将被忽略，不参与过滤。
    """

    def __init__(
        self,
        table_name: str | None = Query(None, description="表名称"),
        table_comment: str | None = Query(None, description="表注释"),
    ) -> None:
        # 模糊查询字段
        self.table_name = table_name
        self.table_comment = table_comment


class GenTableColumnQueryParam:
    """代码生成业务表字段查询参数
    - `column_name`按like规则模糊查询（透传到CRUD层）
    """

    def __init__(
        self,
        column_name: str | None = Query(None, description="列名称"),
    ) -> None:
        # 模糊查询字段：约定("like", 值)格式，便于CRUD解析
        self.column_name = ("like", column_name)
