from __future__ import annotations
from datetime import datetime
from typing import Any
from pydantic import BaseModel, field_validator


# ── 字段 ──────────────────────────────────────────────────────
VALID_FIELD_TYPES = {
    "text", "textarea", "email", "tel", "number", "date",
    "select", "radio", "checkbox", "file", "rating", "address", "hidden"
}

class FieldOption(BaseModel):
    label: str
    value: str

class ContactFormFieldIn(BaseModel):
    field_type: str
    label: str
    name: str
    placeholder: str = ""
    is_required: bool = False
    options: list[FieldOption] = []
    sort_order: int = 0
    validation: dict = {}

    @field_validator("field_type")
    @classmethod
    def validate_type(cls, v: str) -> str:
        if v not in VALID_FIELD_TYPES:
            raise ValueError(f"field_type 必须是 {VALID_FIELD_TYPES} 之一")
        return v

class ContactFormFieldOut(BaseModel):
    id: int
    field_type: str
    label: str
    name: str
    placeholder: str
    is_required: bool
    options: list[FieldOption]
    sort_order: int
    validation: dict

    model_config = {"from_attributes": True}


# ── 表单 ──────────────────────────────────────────────────────
class ContactFormIn(BaseModel):
    name: str
    title: str = ""
    success_message: str = "感谢您的提交，我们将尽快回复。"
    notification_emails: list[str] = []
    admin_email_subject: str = "新表单提交：{{form_title}}"
    admin_email_body: str = ""
    confirm_email_enabled: bool = False
    confirm_email_subject: str = "感谢您的提交"
    confirm_email_body: str = ""
    is_active: bool = True
    fields: list[ContactFormFieldIn] = []

class ContactFormOut(BaseModel):
    id: int
    name: str
    title: str
    success_message: str
    notification_emails: list[str]
    admin_email_subject: str
    admin_email_body: str
    confirm_email_enabled: bool
    confirm_email_subject: str
    confirm_email_body: str
    is_active: bool
    fields: list[ContactFormFieldOut] = []
    created_at: datetime

    model_config = {"from_attributes": True}

class ContactFormListOut(BaseModel):
    id: int
    name: str
    title: str
    is_active: bool
    created_at: datetime

    model_config = {"from_attributes": True}

# Store 端只暴露字段结构，不含邮件配置
class ContactFormPublicOut(BaseModel):
    id: int
    title: str
    success_message: str
    fields: list[ContactFormFieldOut]

    model_config = {"from_attributes": True}


# ── 提交 ──────────────────────────────────────────────────────
class ContactFormSubmissionIn(BaseModel):
    data: dict[str, Any]

class ContactFormReplyOut(BaseModel):
    id: int
    body: str
    sent_at: datetime

    model_config = {"from_attributes": True}

class ContactFormSubmissionOut(BaseModel):
    id: int
    form_id: int
    data: dict[str, Any]
    submitter_email: str | None
    submitter_name: str | None
    status: str
    ip_address: str | None
    created_at: datetime
    replies: list[ContactFormReplyOut] = []

    model_config = {"from_attributes": True}

class ContactFormSubmissionListOut(BaseModel):
    id: int
    form_id: int
    submitter_email: str | None
    submitter_name: str | None
    status: str
    created_at: datetime

    model_config = {"from_attributes": True}

class ContactFormReplyIn(BaseModel):
    body: str


class AllSubmissionsListOut(BaseModel):
    id: int
    form_id: int
    form_name: str
    submitter_email: str | None
    submitter_name: str | None
    status: str
    created_at: datetime

    model_config = {"from_attributes": True}


class PaginatedAllSubmissions(BaseModel):
    items: list[AllSubmissionsListOut]
    total: int
    page: int
    page_size: int


# ── 分页 ──────────────────────────────────────────────────────
class PaginatedSubmissions(BaseModel):
    items: list[ContactFormSubmissionListOut]
    total: int
    page: int
    page_size: int
