from datetime import datetime

from fastapi import APIRouter, Depends, Request
from fastapi.responses import HTMLResponse
from fastapi.templating import Jinja2Templates
from sqlalchemy.orm import Session, joinedload

from dependencies import get_current_user, get_db
from models.aktivitaet import Aktivitaet
from models.kontakt import Kontakt
from models.veranstaltung import Veranstaltung
from services import kontakt_service

router = APIRouter()
templates = Jinja2Templates(directory="templates")


def _toggle_url(meine_todos: bool, meine_akt: bool, meine_kontakte: bool) -> str:
    parts = []
    if meine_todos:
        parts.append("meine_todos=true")
    if meine_akt:
        parts.append("meine_akt=true")
    if meine_kontakte:
        parts.append("meine_kontakte=true")
    return "/?" + "&".join(parts) if parts else "/"


@router.get("/", response_class=HTMLResponse)
async def dashboard(
    request: Request,
    meine_todos: bool = False,
    meine_akt: bool = False,
    meine_kontakte: bool = False,
    user=Depends(get_current_user),
    db: Session = Depends(get_db),
):
    stats = kontakt_service.statistik(db)
    stats["aktivitaeten"] = db.query(Aktivitaet).count()
    stats["veranstaltungen"] = db.query(Veranstaltung).count()

    akt_q = db.query(Aktivitaet).options(joinedload(Aktivitaet.kontakt))
    if meine_akt:
        akt_q = akt_q.filter(Aktivitaet.zugewiesen_an == user.kuerzel)
    letzte_aktivitaeten = akt_q.order_by(Aktivitaet.datum.desc()).limit(10).all()

    k_q = db.query(Kontakt).filter(Kontakt.typ == "person", Kontakt.ist_blacklisted == False)
    if meine_kontakte:
        k_q = k_q.filter(Kontakt.betreuer == user.kuerzel)
    neuste_kontakte = k_q.order_by(Kontakt.erfasst_am.desc()).limit(8).all()

    # Todos: offene Aufgaben mit Faelligkeitsdatum, sortiert nach Dringlichkeit
    wv_q = (
        db.query(Aktivitaet)
        .options(joinedload(Aktivitaet.kontakt))
        .filter(Aktivitaet.status != "erledigt", Aktivitaet.faellig_am.isnot(None))
    )
    if meine_todos:
        wv_q = wv_q.filter(Aktivitaet.zugewiesen_an == user.kuerzel)
    wiedervorlagen = wv_q.order_by(Aktivitaet.faellig_am.asc()).limit(15).all()

    return templates.TemplateResponse("pages/dashboard.html", {
        "request": request,
        "user": user,
        "active_page": "dashboard",
        "stats": stats,
        "letzte_aktivitaeten": letzte_aktivitaeten,
        "neuste_kontakte": neuste_kontakte,
        "wiedervorlagen": wiedervorlagen,
        "heute": datetime.now(),
        "meine_todos": meine_todos,
        "meine_akt": meine_akt,
        "meine_kontakte": meine_kontakte,
        # Toggle-URLs pro Kachel
        "url_todos_alle":      _toggle_url(False, meine_akt, meine_kontakte),
        "url_todos_meine":     _toggle_url(True,  meine_akt, meine_kontakte),
        "url_akt_alle":        _toggle_url(meine_todos, False, meine_kontakte),
        "url_akt_meine":       _toggle_url(meine_todos, True,  meine_kontakte),
        "url_kontakte_alle":   _toggle_url(meine_todos, meine_akt, False),
        "url_kontakte_meine":  _toggle_url(meine_todos, meine_akt, True),
    })
