"""Pydantic models for projects, papers, and criteria."""
from __future__ import annotations

from datetime import datetime

from pydantic import BaseModel


class Project(BaseModel):
    id: int | None = None
    name: str
    description: str = ""
    created_at: datetime | None = None


class Paper(BaseModel):
    id: int | None = None
    project_id: int
    title: str = ""
    abstract: str = ""
    citation: str = ""


class Criterion(BaseModel):
    id: int | None = None
    project_id: int
    category: str  # e.g., "Population", "Intervention"
    text: str
    description: str = ""
    criterion_type: str = "exclude"  # "include" or "exclude"
    is_active: bool = True
    source: str = "human"  # "human" or "ai_generated"
    ai_confidence: float | None = None
    ai_rationale: str | None = None
    title_abstract_assessable: bool = True
    notes: str | None = None
    created_at: datetime | None = None
    modified_at: datetime | None = None


class ScreeningResult(BaseModel):
    paper_id: int
    ai_score: float | None = None
    ai_score_min: float | None = None
    ai_score_max: float | None = None
    ai_decision: str | None = None  # "include" or "exclude"
    ai_reasoning: str | None = None
    assigned_clusters: list[str] = []
    score_list: list[float] = []


class Cluster(BaseModel):
    id: int | None = None
    project_id: int
    cluster_type: str  # "include" or "exclude"
    cluster_name: str
    cluster_description: str = ""
    related_criteria: str = "Other"


class ScreeningJob(BaseModel):
    """Represents an async screening job for the API."""
    id: str
    project_id: int
    status: str = "pending"  # pending, running, completed, failed, cancelled
    progress: float = 0.0  # 0.0 to 1.0
    stage: str = ""
    papers_total: int = 0
    papers_processed: int = 0
    error: str | None = None
    created_at: datetime | None = None
    completed_at: datetime | None = None
    results: list[ScreeningResult] = []
    clusters: list[Cluster] = []
