"""
Medicine autosuggest search route.
"""

from fastapi import APIRouter, Depends, Query
from sqlalchemy.orm import Session
from sqlalchemy import func

from src.database.connection import get_db_dependency
from src.database.models import Medicine, DosageCache

router = APIRouter(prefix="/api/v1/drugs")


@router.get("/search")
async def search_medicines(
    q: str = Query(..., min_length=1, description="Search query for product name"),
    limit: int = Query(10, ge=1, le=50),
    db: Session = Depends(get_db_dependency),
):
    """
    Autosuggest API: search medicines by product_name.
    Returns up to `limit` results, prioritising prefix matches over partial matches.
    """
    query = q.strip()
    if not query:
        return {"data": [], "error": None}

    # Phase 1: prefix matches (starts with)
    prefix_results = (
        db.query(Medicine, DosageCache)
        .outerjoin(DosageCache, Medicine.id == DosageCache.medicine_id)
        .filter(Medicine.product_name.ilike(f"{query}%"))
        .order_by(Medicine.product_name)
        .limit(limit)
        .all()
    )

    results = [_format_result(med, cache) for med, cache in prefix_results]

    # Phase 2: if we haven't filled the limit, add partial (contains) matches
    if len(results) < limit:
        remaining = limit - len(results)
        seen_ids = {r["id"] for r in results}

        contains_results = (
            db.query(Medicine, DosageCache)
            .outerjoin(DosageCache, Medicine.id == DosageCache.medicine_id)
            .filter(
                Medicine.product_name.ilike(f"%{query}%"),
                ~Medicine.product_name.ilike(f"{query}%"),  # exclude prefix matches
            )
            .order_by(Medicine.product_name)
            .limit(remaining)
            .all()
        )

        for med, cache in contains_results:
            if med.id not in seen_ids:
                results.append(_format_result(med, cache))

    return {"data": results, "error": None}


def _format_result(med: Medicine, cache: DosageCache | None) -> dict:
    """Build a single autosuggest item."""
    if cache and cache.confidence_score and cache.confidence_score >= 0.80:
        dosage = cache.dosage_code or "BD"
        frequency = cache.frequency or "Twice daily"
        dose_schedule = cache.dose_schedule
        preference = cache.meal_preference or "As advised"
    else:
        dosage = "BD"
        frequency = "Twice daily"
        dose_schedule = "1-0-1"
        preference = "As advised"

    return {
        "id": med.id,
        "name": med.product_name,
        "composition": med.salt_composition or "",
        "category": med.product_form or "",
        "dosage": dosage,
        "frequency": frequency,
        "dose_schedule": dose_schedule,
        "preference": preference,
    }
