from datetime import datetime
from typing import List, Optional

from fastapi import APIRouter, Depends, File, HTTPException, Response, UploadFile
from sqlmodel import Session, select

from app.db import get_session
from app.models import ReferentialItem
from app.schemas import ReferentialItemCreate, ReferentialItemRead
from app.services.import_export import read_tabular_file, records_to_csv_bytes, validate_required_columns

router = APIRouter(prefix="/referentials", tags=["referentials"])


@router.post("", response_model=ReferentialItemRead)
def create_referential_item(payload: ReferentialItemCreate, session: Session = Depends(get_session)):
    item = ReferentialItem(**payload.dict())
    session.add(item)
    session.commit()
    session.refresh(item)
    return item


@router.get("", response_model=List[ReferentialItemRead])
def list_referential_items(type: Optional[str] = None, active: Optional[bool] = None, session: Session = Depends(get_session)):
    query = select(ReferentialItem)
    if type:
        query = query.where(ReferentialItem.type == type)
    if active is not None:
        query = query.where(ReferentialItem.active == active)
    return session.exec(query.order_by(ReferentialItem.type, ReferentialItem.code)).all()


@router.post("/import")
async def import_referentials(file: UploadFile = File(...), session: Session = Depends(get_session)):
    try:
        content = await file.read()
        records = read_tabular_file(content, file.filename or "")
        validate_required_columns(records, {"type", "code", "label"})
    except ValueError as exc:
        raise HTTPException(status_code=400, detail=str(exc))

    imported = 0
    for record in records:
        item = ReferentialItem(
            type=record["type"],
            code=str(record["code"]),
            label=str(record["label"]),
            value_numeric=float(record["value_numeric"]) if record.get("value_numeric") else None,
            value_text=record.get("value_text") or None,
            unit=record.get("unit") or None,
            active=str(record.get("active", "true")).lower() != "false",
            version=str(record.get("version") or "v1"),
            updated_at=datetime.utcnow(),
        )
        session.add(item)
        imported += 1
    session.commit()
    return {"imported": imported}


@router.get("/export")
def export_referentials(format: str = "csv", session: Session = Depends(get_session)):
    if format != "csv":
        raise HTTPException(status_code=400, detail="Format attendu: csv")

    items = session.exec(select(ReferentialItem)).all()
    records = [
        {
            "id": item.id,
            "type": item.type,
            "code": item.code,
            "label": item.label,
            "value_numeric": item.value_numeric,
            "value_text": item.value_text,
            "unit": item.unit,
            "active": item.active,
            "version": item.version,
        }
        for item in items
    ]
    return Response(content=records_to_csv_bytes(records), media_type="text/csv", headers={"Content-Disposition": "attachment; filename=referentials.csv"})
