from datetime import datetime, date
from typing import Optional
from pydantic import BaseModel, model_validator

from app.services.surat_verify import sign_surat


class SuratCreate(BaseModel):
    subject: str
    perihal: str
    company_id: int
    vendor_id: Optional[int] = None
    category_id: int
    tanggal: Optional[date] = None
    body: Optional[str] = None
    tembusan: Optional[str] = None
    needs_director_sig: bool = False
    needs_manager_sig: bool = False
    wet_signature: bool = False
    task_id: Optional[int] = None


class SuratUpdate(BaseModel):
    subject: Optional[str] = None
    perihal: Optional[str] = None
    company_id: Optional[int] = None
    vendor_id: Optional[int] = None
    category_id: Optional[int] = None
    tanggal: Optional[date] = None
    body: Optional[str] = None
    tembusan: Optional[str] = None
    needs_director_sig: Optional[bool] = None
    needs_manager_sig: Optional[bool] = None
    wet_signature: Optional[bool] = None
    task_id: Optional[int] = None


class SuratOut(BaseModel):
    id: int
    no_surat: str
    subject: str
    perihal: str
    company_id: int
    vendor_id: Optional[int]
    category_id: int
    tanggal: Optional[date]
    body: Optional[str]
    tembusan: Optional[str]
    needs_director_sig: bool
    needs_manager_sig: bool
    wet_signature: bool
    is_approved: bool
    approved_by: Optional[int]
    approved_at: Optional[datetime]
    created_by: Optional[int]
    rejected_reason: Optional[str] = None
    task_id: Optional[int]
    created_at: datetime
    updated_at: datetime
    verify_sig: str = ""
    model_config = {"from_attributes": True}

    @model_validator(mode="after")
    def _sign(self):
        self.verify_sig = sign_surat(self.id, self.no_surat)
        return self


class SuratVerifyOut(BaseModel):
    """Public verify payload — deliberately excludes body/tembusan so
    scanning the QR can't be used to read a letter's actual content."""
    no_surat: str
    subject: str
    perihal: str
    tanggal: Optional[date]
    is_approved: bool
    approved_at: Optional[datetime]
    company_name: Optional[str]
    vendor_name: Optional[str]


class SuratListOut(BaseModel):
    id: int
    no_surat: str
    subject: str
    perihal: str
    company_id: int
    vendor_id: Optional[int]
    category_id: int
    tanggal: Optional[date]
    is_approved: bool
    task_id: Optional[int]
    created_at: datetime
    model_config = {"from_attributes": True}
