"""CRUD вимог ШТУ для Admin UI — без Streamlit."""
from __future__ import annotations

from sqlmodel import Session, delete as sql_delete, select

from db.session import get_engine
from models import AssessmentResults, Requirements, TechnologyClasses


def get_all_requirements() -> list[dict]:
    with Session(get_engine()) as s:
        classes = {tc.id: tc.code for tc in s.exec(select(TechnologyClasses)).all()}
        reqs = s.exec(select(Requirements).order_by(Requirements.code)).all()
        return [
            {
                "id": r.id,
                "code": r.code,
                "class": classes.get(r.class_id, "?"),
                "class_id": r.class_id,
                "operator": r.operator,
                "threshold": r.threshold,
                "mandatory": r.mandatory,
                "criticality": r.criticality,
                "deadline_days": r.deadline_days,
                "recommendation": r.recommendation or "",
            }
            for r in reqs
        ]


def get_classes() -> list[TechnologyClasses]:
    with Session(get_engine()) as s:
        return s.exec(select(TechnologyClasses).order_by(TechnologyClasses.code)).all()


def update_requirement(
    req_id: int,
    threshold: str,
    operator: str,
    criticality: int,
    mandatory: bool,
    deadline_days: int,
    recommendation: str,
) -> None:
    with Session(get_engine()) as s:
        req = s.get(Requirements, req_id)
        if req is None:
            raise ValueError(f"Requirement {req_id} not found")
        req.threshold = threshold
        req.operator = operator
        req.criticality = criticality
        req.mandatory = mandatory
        req.deadline_days = deadline_days
        req.recommendation = recommendation or None
        s.add(req)
        s.commit()


def add_requirement(
    code: str,
    class_id: int,
    threshold: str,
    operator: str,
    mandatory: bool,
    criticality: int,
    deadline_days: int,
    recommendation: str,
) -> int:
    req = Requirements(
        code=code,
        class_id=class_id,
        threshold=threshold,
        operator=operator,
        mandatory=mandatory,
        criticality=criticality,
        deadline_days=deadline_days,
        recommendation=recommendation or None,
    )
    with Session(get_engine()) as s:
        s.add(req)
        s.commit()
        s.refresh(req)
        return req.id


def delete_requirement(req_id: int) -> None:
    # Спочатку залежні рядки (FK), потім сам запис
    with Session(get_engine()) as s:
        s.exec(sql_delete(AssessmentResults).where(AssessmentResults.requirement_id == req_id))
        req = s.get(Requirements, req_id)
        if req:
            s.delete(req)
        s.commit()
