# _*_ coding : UTF-8 _*_
# @Time : 2025/03/03 00:03
# @UpdateTime : 2025/03/03 00:03
# @Author : sonder
# @File : generate.py
# @Software : PyCharm
# @Comment : 本程序
from datetime import datetime

from config.constant import MYSQL_TO_TORTOISE_TYPE


class Generate:
    """
    代码生成成工具
    """

    @classmethod
    def convert_mysql_type(cls, mysql_type: str):
        """
        将 MySQL 字段类型转换为 Tortoise-ORM 的字段类型。

        :param mysql_type: MySQL 的字段类型，如 "varchar(255)"、"int(11)" 等
        :return: Tortoise-ORM 对应的字段类型，如 "CharField"、"IntField" 等
        """
        # 提取字段的基本类型（去掉括号及长度信息）
        base_type = mysql_type.split("(")[0].lower()

        # 处理特殊情况：tinyint(1) -> BooleanField
        if base_type == "tinyint":
            if "(1)" in mysql_type:  # tinyint(1) 视为 Boolean
                return "BooleanField", None
            return "IntField", None  # 其他 tinyint 作为 IntField 处理
        max_length = None
        if "(" in mysql_type and base_type in {"char", "varchar"}:
            max_length = int(mysql_type.split("(")[1].split(")")[0])  # 提取最大长度

        field_type = MYSQL_TO_TORTOISE_TYPE.get(base_type, "TextField")
        return field_type, max_length

    @classmethod
    def prepare_template_data(cls, table_info, columns):
        TYPE_DEFINE = {
            "int": 0,
            "str": "",
            "bool": False,
            "float": 0.0,
            "datetime": "",
            "list": [],
            "dict": {},
            "set": set(),
            "tuple": (),
            "bytes": b"",
            "None": 'null',
        }
        PYTHON_TO_TS = {
            "int": "number",
            "float": "number",
            "str": "string",
            "bool": "boolean",
            "datetime": "string",
            "Optional[int]": "number | null",
            "Optional[str]": "string | null",
            "Optional[bool]": "boolean | null",
            "Optional[float]": "number | null",
            "Optional[datetime]": "string | null",
            "List[int]": "number[]",
            "List[str]": "string[]",
            "List[bool]": "boolean[]",
            "List[datetime]": "string[]",
            "Dict[str, Any]": "Record<string, any>",
            "Any": "any",
        }
        common_column = ["id", "del_flag", "create_by", "update_by", "create_time", "update_time"]
        """组织数据，供 Jinja2 渲染"""
        return {
            "author": table_info.get('author', ""),
            "prefix": table_info["prefix"],
            "table_name": table_info["table_name"],
            "class_name": table_info["class_name"],
            "table_comment": table_info.get("table_comment", ""),
            "description": table_info.get("description", ""),
            "name": table_info.get('class_name', "").lower(),
            "permission_id": table_info.get('permission_id', ""),
            "columns": [
                {
                    "python_name": col["python_name"],
                    "field_type": cls.convert_mysql_type(col["column_type"])[0],
                    "max_length": cls.convert_mysql_type(col["column_type"])[1],
                    "is_common": col["python_name"] in common_column,
                    "is_nullable": not col["is_required"],
                    "is_unique": col.get("is_unique", False),
                    "default": col.get("default", None),
                    "column_comment": col.get("column_comment", ""),
                    "column_name": col["column_name"],
                    "is_required": col.get("is_required", False),
                    "is_edit": col.get("is_edit", False),
                    "is_list": col.get("is_list", False),
                    "is_query": col.get("is_query", False),
                    "is_insert": col.get("is_insert", False),
                    "is_hide": col.get("is_hide", False),
                    "query_way": col.get("query_way", "="),
                    "show_type": col.get("show_type", "input"),
                    "python_type": col.get("python_type", "str"),
                    "define": TYPE_DEFINE.get(col.get("python_type", "str"), None),
                    "typescript_type": PYTHON_TO_TS.get(col.get("python_type", "str"), "any"),
                }
                for col in columns
                if col["python_name"] and col["column_type"]
            ],
            "current_time": datetime.now().strftime("%Y/%m/%d %H:%M:%S")
        }
