"""Розклад аудитів — CRUD для Admin."""
from __future__ import annotations

from datetime import date

import streamlit as st

from services.assessment import get_companies
from services.audit import (
    add_audit_event,
    delete_audit_event,
    get_audit_schedule,
    update_audit_event,
)
from ui.guard import require_role

require_role("Admin")

_STATUSES = ["planned", "done", "cancelled"]
_STATUS_UA = {"planned": "Заплановано", "done": "Виконано", "cancelled": "Скасовано"}

st.title("Розклад аудитів")


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


@st.cache_data(ttl=300)
def _load_companies():
    return get_companies()


tab_list, tab_add = st.tabs(["Розклад", "Новий аудит"])

with tab_list:
    schedule = _load_schedule()

    if not schedule:
        st.info("Запланованих аудитів ще немає.")
    else:
        st.dataframe(
            [{"ID": e["id"], "Компанія": e["company"], "Дата": str(e["planned_date"]),
              "Статус": _STATUS_UA.get(e["status"], e["status"]), "Нотатка": e["note"]}
             for e in schedule],
            use_container_width=True, hide_index=True,
        )

        st.divider()
        st.subheader("Редагувати / видалити")
        event_options = {f"#{e['id']} — {e['company']} ({e['planned_date']})": e for e in schedule}
        sel_label = st.selectbox("Оберіть запис", list(event_options.keys()))
        sel = event_options[sel_label]

        with st.form("edit_audit"):
            new_date = st.date_input("Дата аудиту", value=sel["planned_date"])
            new_status = st.selectbox(
                "Статус", _STATUSES,
                index=_STATUSES.index(sel["status"]) if sel["status"] in _STATUSES else 0,
                format_func=lambda s: _STATUS_UA.get(s, s),
            )
            new_note = st.text_input("Нотатка", value=sel["note"])
            col_save, col_del = st.columns(2)
            save = col_save.form_submit_button("Зберегти", type="primary")
            delete = col_del.form_submit_button("Видалити", type="secondary")

        if save:
            update_audit_event(sel["id"], new_date, new_status, new_note)
            st.cache_data.clear()
            st.success("Запис оновлено.")
        if delete:
            delete_audit_event(sel["id"])
            st.cache_data.clear()
            st.success("Запис видалено.")

with tab_add:
    st.subheader("Новий аудит")
    companies = _load_companies()
    if not companies:
        st.warning("Компаній у системі ще немає.")
    else:
        company_map = {c.name: c.id for c in companies}
        with st.form("add_audit"):
            company_name = st.selectbox("Компанія", list(company_map.keys()))
            planned = st.date_input("Дата аудиту", value=date.today())
            note = st.text_input("Нотатка")
            if st.form_submit_button("Додати", type="primary"):
                add_audit_event(company_map[company_name], planned, note)
                st.cache_data.clear()
                st.success(f"Аудит для {company_name} на {planned} заплановано.")
