#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
模块名称：report_template.py
模块描述：功能测试报告模板配置数据库模型定义

作者：czj
创建日期：2026-08-13
最后修改：2026-08-13
"""

import json
from datetime import datetime
from typing import Optional
from sqlalchemy import String, DateTime, Integer, Text, Boolean
from sqlalchemy.orm import Mapped, mapped_column

from app.database import Base


class ReportTemplate(Base):
    """
    功能测试报告模板配置数据库模型

    存储报告模板配置，包括章节开关、Word样式、图表样式、报告默认值。
    支持多模板管理，其中一个模板可标记为默认。

    Attributes:
        id (int): 主键，自增
        name (str): 模板名称
        is_default (bool): 是否默认模板（全局唯一为 True）
        config (str): 完整配置 JSON 字符串
        created_at (datetime): 创建时间
        updated_at (datetime): 更新时间
    """

    __tablename__ = "report_templates"

    id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True, comment="主键")
    name: Mapped[str] = mapped_column(String(100), nullable=False, comment="模板名称")
    description: Mapped[str] = mapped_column(String(200), nullable=True, default="", comment="模板描述")
    is_default: Mapped[bool] = mapped_column(Boolean, nullable=False, default=False, comment="是否默认模板")
    config: Mapped[str] = mapped_column(Text, nullable=False, default="{}", comment="完整配置JSON字符串")
    created_at: Mapped[Optional[datetime]] = mapped_column(
        DateTime, default=datetime.now, comment="创建时间"
    )
    updated_at: Mapped[Optional[datetime]] = mapped_column(
        DateTime, default=datetime.now, onupdate=datetime.now, comment="更新时间"
    )

    def __repr__(self) -> str:
        return f"<ReportTemplate(id={self.id}, name='{self.name}', is_default={self.is_default})>"

    def to_dict(self) -> dict:
        """转为完整字典，config 反序列化为 dict"""
        from app.services.functional.config import DATE_FORMAT
        return {
            "id": self.id,
            "name": self.name,
            "description": self.description or "",
            "is_default": self.is_default,
            "config": json.loads(self.config) if self.config else {},
            "created_at": self.created_at.strftime(DATE_FORMAT) if self.created_at else None,
            "updated_at": self.updated_at.strftime(DATE_FORMAT) if self.updated_at else None,
        }

    def to_list_item(self) -> dict:
        """转为列表项，不含 config 详情"""
        from app.services.functional.config import DATE_FORMAT
        return {
            "id": self.id,
            "name": self.name,
            "description": self.description or "",
            "is_default": self.is_default,
            "updated_at": self.updated_at.strftime(DATE_FORMAT) if self.updated_at else None,
        }