from datetime import datetime
from typing import Optional

from pydantic import BaseModel

from app.models import ProjectStatus, ReferentialType


class ReferentialItemCreate(BaseModel):
    type: ReferentialType
    code: str
    label: str
    value_numeric: Optional[float] = None
    value_text: Optional[str] = None
    unit: Optional[str] = None
    active: bool = True
    version: str = "v1"


class ReferentialItemRead(ReferentialItemCreate):
    id: int
    created_at: datetime
    updated_at: datetime


class PostalCodeCreate(BaseModel):
    postal_code: str
    commune: str
    insee_code: Optional[str] = None
    department_code: Optional[str] = None
    region: Optional[str] = None
    active: bool = True


class PostalCodeRead(PostalCodeCreate):
    id: int
    updated_at: datetime


class SavedProjectCreate(BaseModel):
    public_id: str
    status: ProjectStatus = ProjectStatus.DRAFT
    applicant_type: Optional[str] = None
    postal_code: Optional[str] = None
    commune: Optional[str] = None
    work_type: Optional[str] = None
    estimated_amount_ht: Optional[float] = None
    estimated_amount_ttc: Optional[float] = None
    aid_estimate: Optional[float] = None
    source: Optional[str] = "field"
    payload_json: str = "{}"


class SavedProjectUpdate(BaseModel):
    status: Optional[ProjectStatus] = None
    applicant_type: Optional[str] = None
    postal_code: Optional[str] = None
    commune: Optional[str] = None
    work_type: Optional[str] = None
    estimated_amount_ht: Optional[float] = None
    estimated_amount_ttc: Optional[float] = None
    aid_estimate: Optional[float] = None
    source: Optional[str] = None
    payload_json: Optional[str] = None


class SavedProjectRead(SavedProjectCreate):
    id: int
    created_at: datetime
    updated_at: datetime


class FieldInputEventCreate(BaseModel):
    project_public_id: Optional[str] = None
    field_name: str
    event_type: str
    value_length: Optional[int] = None
    error_code: Optional[str] = None
    step: Optional[str] = None
    source: Optional[str] = "field"


class StatsSummary(BaseModel):
    total_projects: int
    drafts: int
    simulations: int
    saved_projects: int
    archived: int
    total_input_events: int
    top_error_field: Optional[str] = None
