from datetime import datetime
from typing import Any

from pydantic import BaseModel, Field


class CVIn(BaseModel):
    title: str = "CV base"
    content_md: str = ""
    structured: dict[str, Any] = Field(default_factory=dict)
    is_base: bool = True


class CVOut(BaseModel):
    id: int
    title: str
    content_md: str
    structured: dict[str, Any] = {}
    is_base: bool
    file_path: str | None = None
    created_at: datetime | None = None
    updated_at: datetime | None = None

    model_config = {"from_attributes": True}


class CVImproveIn(BaseModel):
    cv_id: int
    instructions: str = ""
    language: str = "es"


class CVAdaptIn(BaseModel):
    cv_id: int
    job_id: int
    language: str = "es"
    include_cover_letter: bool = True


class CVVersionOut(BaseModel):
    id: int
    cv_id: int
    job_id: int | None = None
    kind: str
    language: str
    content_md: str
    cover_letter_md: str = ""
    notes: str = ""
    review_status: str | None = "draft"
    base_snapshot_md: str | None = ""
    sections_json: dict[str, Any] | None = None
    created_at: datetime | None = None

    model_config = {"from_attributes": True}


class CVReviewIn(BaseModel):
    accept_all: bool = False
    accepted_section_ids: list[str] = Field(default_factory=list)
    content_md: str | None = None  # edición manual completa
    cover_letter_md: str | None = None
    approve: bool = False  # True = listo para enviar


class CVReviewOut(BaseModel):
    version: CVVersionOut
    base_sections: list[dict[str, Any]] = []
    proposed_sections: list[dict[str, Any]] = []
    ready_to_send: bool = False


class ApplyPrepareOut(BaseModel):
    job_id: int
    url: str
    adapter: str
    mode: str  # assisted | semi_auto
    checklist: list[str]
    cv_markdown: str | None = None
    cover_letter: str | None = None
    prefill: dict[str, Any] = {}


class ApplyRunIn(BaseModel):
    job_id: int
    cv_version_id: int | None = None
    confirm_submit: bool = False


class ApplyRunOut(BaseModel):
    status: str
    adapter: str
    message: str
    log: list[str] = []
    screenshot_path: str | None = None


class ScrapeRunOut(BaseModel):
    id: int
    source: str
    status: str
    fetched: int
    created: int
    updated: int
    errors: str | None = None
    started_at: datetime | None = None
    finished_at: datetime | None = None

    model_config = {"from_attributes": True}


class ManualJobIn(BaseModel):
    title: str
    company: str = ""
    location: str = ""
    remote: bool = True
    url: str
    description: str = ""
    source: str = "manual"
    salary_min: int | None = None
    salary_max: int | None = None
    salary_currency: str | None = "USD"
    tags: list[str] = []


class SettingsOut(BaseModel):
    llm_provider: str
    openai_model: str
    ollama_model: str
    ollama_base_url: str = ""
    ollama_ok: bool = False
    cursor_enabled: bool = False
    scrape_interval_minutes: int
    apply_auto_submit_global: bool
    has_openai_key: bool
    single_process_ui: bool = True
