"""Phrase suggestions for the wizard's bottom line and problem discussions."""

from __future__ import annotations

from datetime import date

from fastapi import APIRouter, Depends, HTTPException
from psycopg import Connection

from .. import engine
from ..auth import User, current_user, require_center
from ..db import get_conn
from ..phrases import FIELDS, suggest

router = APIRouter(tags=["phrases"])


def _int_list(value: str | None) -> list[int]:
    try:
        return [int(v) for v in (value or "").split(",") if v.strip()]
    except ValueError as e:
        raise HTTPException(422, "problem_types must be comma-separated integers") from e


@router.get("/phrases")
def get_phrases(
    center_id: int,
    field: str,
    problem_type: int | None = None,
    problem_types: str | None = None,
    likelihood: int | None = None,
    size_max: float | None = None,
    locations: str | None = None,
    valid_date: date | None = None,
    q: str | None = None,
    limit: int = 12,
    conn: Connection = Depends(get_conn),
    user: User = Depends(current_user),
):
    require_center(user, center_id)
    if field not in FIELDS:
        raise HTTPException(422, f"field must be one of {', '.join(FIELDS)}")
    if field == "problem" and problem_type is None:
        raise HTTPException(422, "problem_type is required for problem phrases")
    locs = [loc.strip() for loc in (locations or "").split(",") if loc.strip()]
    if any(not engine.parse_location(loc) for loc in locs):
        raise HTTPException(422, "locations must look like 'north upper'")
    return suggest(
        conn, center_id, field, problem_type=problem_type, problem_types=_int_list(problem_types),
        likelihood=likelihood, size_max=size_max, locations=locs, valid_date=valid_date, q=q, limit=limit,
    )
