"""
Pydantic models for the Deep Analysis Agent (reasoner structured output).
"""

from typing import List
from pydantic import BaseModel, Field, field_validator

from .constants import REASONER_QUERIES_MAX, REASONER_QUERIES_MIN
from .sql_safety import normalize_llm_sql, validate_llm_sql


class InvestigativeQuery(BaseModel):
    """One 1-liner hypothesis and one clean, schema-stuck SQL query."""

    hypothesis: str = Field(description="Exactly one short sentence (1-liner); no bullets or paragraphs")
    query: str = Field(description="Single MS SQL SELECT query; only tables/columns from the schema, clean and valid")

    @field_validator("query", mode="before")
    @classmethod
    def _normalize_query_whitespace(cls, v: object) -> object:
        if v is None or not isinstance(v, str):
            return v
        return normalize_llm_sql(v)

    @field_validator("query")
    @classmethod
    def _query_readonly_single_select(cls, v: str) -> str:
        msg = validate_llm_sql(v)
        if msg:
            raise ValueError(msg)
        return v


class ReasonerQueriesBatch(BaseModel):
    """Between REASONER_QUERIES_MIN and REASONER_QUERIES_MAX investigative SQL queries per run."""

    queries: List[InvestigativeQuery] = Field(
        description=f"Between {REASONER_QUERIES_MIN} and {REASONER_QUERIES_MAX} investigative SQL queries for this run",
        min_length=REASONER_QUERIES_MIN,
        max_length=REASONER_QUERIES_MAX,
    )
