from datetime import date, datetime
from typing import Any

from pydantic import BaseModel


class SearchHit(BaseModel):
    party_name: str
    party_nif: str | None
    party_role: str | None
    process_id: str
    process_number: str
    tribunal: str
    source: str
    date_filed: date
    company_id: str
    company_name: str
    similarity: float


class SearchResponse(BaseModel):
    query: str
    total: int
    items: list[SearchHit]


class CompetitorMetrics(BaseModel):
    company_id: str
    legal_name: str
    nif: str
    monitoring_type: str
    risk_score: int | None
    # Quando um scraper passou por aqui. Sem isto, risco nulo é ambíguo entre
    # "não tem nada" e "nunca foi procurada".
    data_coverage_end: datetime | None = None
    total_processes: int
    last_30d: int
    last_6m: int
    trend_pct: float | None  # (last_30d - prev_30d) / prev_30d * 100; None if prev is 0


class CompetitorRanking(BaseModel):
    items: list[CompetitorMetrics]


class AnalysisRequest(BaseModel):
    nif: str | None = None
    name: str | None = None


class AnalysisMetrics(BaseModel):
    total_processes: int
    last_30d: int
    last_6m: int
    by_source: dict[str, int]
    timeline: list[dict[str, Any]]
    risk_score: int
    risk_reasons: list[str]


class AnalysisResponse(BaseModel):
    company_id: str
    nif: str
    legal_name: str
    monitoring_type: str
    metrics: AnalysisMetrics
    created: bool  # true if this call created a new company row
