"""Pydantic schemas for the tenant-side support ticket module (INDL-57)."""
from datetime import datetime
from uuid import UUID

from pydantic import BaseModel, ConfigDict, Field, field_validator


def _validate_non_blank(value: str, field_name: str) -> str:
    if not value.strip():
        raise ValueError(f"{field_name} cannot be blank")
    return value


class SupportTicketCreate(BaseModel):
    """Request body for POST /support/tickets.

    extra="forbid" blocks mass assignment of tenant_id / status /
    ticket_number / created_by_user_id — those are always server-assigned
    (OWASP API3 / PRD SEC-03).
    """

    model_config = ConfigDict(extra="forbid")

    subject: str = Field(..., min_length=1, max_length=200)
    description: str = Field(..., min_length=1, max_length=5000)

    @field_validator("subject")
    @classmethod
    def _validate_subject(cls, v: str) -> str:
        return _validate_non_blank(v, "Subject")

    @field_validator("description")
    @classmethod
    def _validate_description(cls, v: str) -> str:
        return _validate_non_blank(v, "Description")


class SupportTicketReplyCreate(BaseModel):
    """Request body for POST /support/tickets/{id}/messages."""

    model_config = ConfigDict(extra="forbid")

    body: str = Field(..., min_length=1, max_length=5000)

    @field_validator("body")
    @classmethod
    def _validate_body(cls, v: str) -> str:
        return _validate_non_blank(v, "Reply body")


class SupportTicketListItemResponse(BaseModel):
    model_config = ConfigDict(from_attributes=True)

    id: UUID
    ticket_number: str
    subject: str
    status: str
    created_at: datetime
    last_message_at: datetime


class SupportTicketMessageResponse(BaseModel):
    model_config = ConfigDict(from_attributes=True)

    id: UUID
    author_user_id: UUID
    author_role_snapshot: str
    author_name: str
    body: str
    created_at: datetime


class SupportTicketDetailResponse(BaseModel):
    model_config = ConfigDict(from_attributes=True)

    id: UUID
    ticket_number: str
    subject: str
    status: str
    created_at: datetime
    messages: list[SupportTicketMessageResponse] = []
