#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
模块名称：login_template.py
模块描述：登录模板 Pydantic 模式定义

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

from datetime import datetime
from typing import Optional, List, Dict, Any
from pydantic import BaseModel, Field, ConfigDict


def to_camel(string: str) -> str:
    """Convert snake_case to camelCase"""
    components = string.split('_')
    return components[0] + ''.join(x.title() for x in components[1:])


class TemplateStepDefinition(BaseModel):
    """
    模板步骤定义模式

    定义单个模板步骤的结构（与用例步骤类似）。

    Attributes:
        order (int): 步骤顺序
        name (str): 步骤名称
        action (str): 动作类型
        params (dict): 动作参数
        expected (str): 预期结果
    """

    order: int = Field(..., ge=1, description="步骤顺序")
    name: str = Field(..., min_length=1, max_length=200, description="步骤名称")
    action: str = Field(..., description="动作类型")
    params: Dict[str, Any] = Field(default_factory=dict, description="动作参数")
    expected: str = Field(default="", description="预期结果")


class LoginTemplateBase(BaseModel):
    """
    登录模板基础模式

    包含模板的公共字段。
    """

    name: str = Field(..., min_length=1, max_length=200, description="模板名称")
    description: str = Field(default="", max_length=1000, description="模板描述")
    template_type: str = Field(default="login", description="模板类型: login/navigation/custom")
    target_system: str = Field(default="统一管理平台", description="目标系统名称")
    base_url: str = Field(default="https://192.168.5.44", description="目标系统基础 URL（历史默认，实际以系统配置 TARGET_URL 为准）")
    steps: List[TemplateStepDefinition] = Field(default_factory=list, description="登录/导航步骤")
    is_default: bool = Field(default=False, description="是否为默认模板")


class LoginTemplateCreate(LoginTemplateBase):
    """
    创建登录模板请求模式

    用于接收创建模板的请求数据。

    Example:
        >>> template_data = LoginTemplateCreate(
        ...     name="统一管理平台登录模板",
        ...     template_type="login",
        ...     steps=[
        ...         TemplateStepDefinition(order=1, name="访问登录页面", action="navigate", params={"url": "https://192.168.5.44"})
        ...     ]
        ... )
    """
    pass


class LoginTemplateUpdate(BaseModel):
    """
    更新登录模板请求模式

    用于接收更新模板的请求数据，所有字段可选。
    """

    name: Optional[str] = Field(None, min_length=1, max_length=200, description="模板名称")
    description: Optional[str] = Field(None, max_length=1000, description="模板描述")
    template_type: Optional[str] = Field(None, description="模板类型: login/navigation/custom")
    target_system: Optional[str] = Field(None, description="目标系统名称")
    base_url: Optional[str] = Field(None, description="目标系统基础 URL")
    steps: Optional[List[TemplateStepDefinition]] = Field(None, description="登录/导航步骤")
    is_default: Optional[bool] = Field(None, description="是否为默认模板")
    status: Optional[str] = Field(None, description="状态: active/disabled")


class LoginTemplateResponse(LoginTemplateBase):
    """
    登录模板响应模式

    用于返回模板数据给客户端。
    序列化时自动转换为 camelCase 以匹配前端 TypeScript 类型。

    Attributes:
        id (str): 模板ID
        status (str): 状态
        created_at (datetime): 创建时间
        updated_at (datetime): 更新时间
    """

    model_config = ConfigDict(
        from_attributes=True,
        alias_generator=to_camel,
        populate_by_name=True,
    )

    id: str = Field(..., description="模板ID")
    status: str = Field(default="active", description="状态")
    created_at: Optional[datetime] = Field(None, description="创建时间")
    updated_at: Optional[datetime] = Field(None, description="更新时间")


class LoginTemplateListResponse(BaseModel):
    """
    登录模板列表响应模式

    用于返回模板列表。
    """

    model_config = ConfigDict(
        alias_generator=to_camel,
        populate_by_name=True,
    )

    total: int = Field(..., description="总数")
    items: List[LoginTemplateResponse] = Field(default_factory=list, description="模板列表")