"""CRUD вимог ШТУ — Admin."""
from __future__ import annotations

import streamlit as st

from services.requirements import (
    add_requirement,
    get_all_requirements,
    get_classes,
    update_requirement,
)
from ui.guard import require_role

require_role("Admin")

st.title("Адміністратор — Вимоги ШТУ")

_OPERATORS = [">=", "<=", "=", "yes-no"]


@st.cache_data(ttl=300)
def _load_reqs() -> list[dict]:
    return get_all_requirements()


@st.cache_data(ttl=300)
def _load_classes():
    return get_classes()


tab_list, tab_add = st.tabs(["Перелік вимог", "Нова вимога"])

with tab_list:
    reqs = _load_reqs()
    display_cols = ["code", "class", "operator", "threshold", "mandatory", "criticality", "deadline_days"]
    st.dataframe(
        [{k: r[k] for k in display_cols} for r in reqs],
        use_container_width=True,
        hide_index=True,
    )

    st.divider()
    st.subheader("Редагувати вимогу")
    code_map = {r["code"]: r for r in reqs}
    sel_code = st.selectbox("Оберіть вимогу", list(code_map.keys()))
    sel = code_map[sel_code]

    with st.form("edit_req"):
        threshold = st.text_input("Поріг", value=sel["threshold"])
        operator = st.selectbox("Оператор", _OPERATORS, index=_OPERATORS.index(sel["operator"]))
        criticality = st.slider("Критичність", 1, 5, value=int(sel["criticality"]))
        mandatory = st.checkbox("Обов'язкова", value=bool(sel["mandatory"]))
        deadline_days = st.number_input("Термін усунення (днів)", min_value=1, value=int(sel["deadline_days"]))
        recommendation = st.text_area("Рекомендація", value=sel["recommendation"])

        if st.form_submit_button("Зберегти"):
            update_requirement(
                sel["id"], threshold, operator, criticality,
                mandatory, int(deadline_days), recommendation,
            )
            st.cache_data.clear()  # скидаємо кеш після мутації
            st.success(f"Вимогу {sel_code} збережено.")

with tab_add:
    st.subheader("Нова вимога")
    classes = _load_classes()
    class_map = {tc.code: tc.id for tc in classes}

    with st.form("add_req"):
        new_code = st.text_input("Код вимоги (напр. I.1.10)")
        new_class = st.selectbox("Клас", list(class_map.keys()))
        new_threshold = st.text_input("Поріг")
        new_operator = st.selectbox("Оператор", _OPERATORS)
        new_criticality = st.slider("Критичність", 1, 5, value=1)
        new_mandatory = st.checkbox("Обов'язкова")
        new_deadline = st.number_input("Термін усунення (днів)", min_value=1, value=30)
        new_rec = st.text_area("Рекомендація")

        if st.form_submit_button("Додати"):
            if not new_code.strip() or not new_threshold.strip():
                st.error("Заповніть код та поріг вимоги.")
            else:
                add_requirement(
                    new_code.strip(), class_map[new_class], new_threshold.strip(),
                    new_operator, new_mandatory, new_criticality, int(new_deadline), new_rec,
                )
                st.cache_data.clear()
                st.success(f"Вимогу {new_code.strip()} додано.")
