"""
Admin Router — Court management, hearing scheduling, case oversight.
Role: 'admin' or 'judge' (for FYP demo purposes, admin plays the judge role).
"""
from fastapi import APIRouter, Depends, Request, Form, HTTPException
from fastapi.responses import HTMLResponse, RedirectResponse
from fastapi.templating import Jinja2Templates
from sqlalchemy.orm import Session
from pathlib import Path
from typing import Optional

from ..models.models import User, Case, Appointment
from ..models.fyp2_models import CourtFiling, Hearing, DraftedPetition
from ..services.database import get_db
from ..services.auth_service import get_current_user
from ..services.hearing_service import schedule_hearing, complete_hearing, adjourn_hearing
from ..services.filing_service import update_filing_status, COURT_TYPES, DISTRICTS
from ..services.notification_service import notify_hearing_scheduled, notify_case_resolved
from ..utils import utcnow

router = APIRouter()
BASE_DIR = Path(__file__).resolve().parent.parent.parent
templates = Jinja2Templates(directory=str(BASE_DIR / "frontend" / "templates"))


def require_admin(user: User = Depends(get_current_user)) -> User:
    """Allow admin and lawyer roles to access court management."""
    if user.role not in ("admin", "lawyer"):
        raise HTTPException(status_code=403, detail="Access restricted")
    return user


# ── Admin Dashboard ──────────────────────────────────────────────────────────

@router.get("/dashboard", response_class=HTMLResponse)
async def admin_dashboard(request: Request, user=Depends(require_admin), db: Session = Depends(get_db)):
    total_users   = db.query(User).count()
    total_cases   = db.query(Case).count()
    total_filings = db.query(CourtFiling).count()
    today = utcnow().strftime("%Y-%m-%d")
    hearings_today = db.query(Hearing).filter(
        Hearing.status == "scheduled",
        Hearing.scheduled_date == today,
    ).count()
    recent_cases  = db.query(Case).order_by(Case.created_at.desc()).limit(10).all()
    return templates.TemplateResponse("admin/dashboard.html", {
        "request": request,
        "user": user,
        "total_users": total_users,
        "total_cases": total_cases,
        "total_filings": total_filings,
        "hearings_today": hearings_today,
        "recent_cases": recent_cases,
    })


# ── Court Management ─────────────────────────────────────────────────────────

@router.get("/court", response_class=HTMLResponse)
async def court_management(request: Request, user=Depends(require_admin), db: Session = Depends(get_db)):
    """View all filed cases awaiting hearing scheduling."""
    filings = (
        db.query(CourtFiling)
        .order_by(CourtFiling.filing_date.desc())
        .all()
    )
    hearings = (
        db.query(Hearing)
        .order_by(Hearing.scheduled_date.asc())
        .all()
    )
    return templates.TemplateResponse("admin/court.html", {
        "request": request,
        "user": user,
        "filings": filings,
        "hearings": hearings,
        "court_types": COURT_TYPES,
        "districts": DISTRICTS,
    })


@router.post("/schedule-hearing")
async def schedule_hearing_route(
    request: Request,
    case_id: int = Form(...),
    filing_id: int = Form(...),
    scheduled_date: str = Form(...),
    scheduled_time: str = Form(...),
    hearing_type: str = Form("first_hearing"),
    judge_name: str = Form(""),
    user=Depends(require_admin),
    db: Session = Depends(get_db),
):
    """Schedule a virtual hearing and create the video room."""
    hearing = schedule_hearing(
        db=db,
        case_id=case_id,
        filing_id=filing_id,
        scheduled_date=scheduled_date,
        scheduled_time=scheduled_time,
        hearing_type=hearing_type,
        judge_name=judge_name or user.full_name,
    )

    # Notify client
    case = db.query(Case).filter(Case.id == case_id).first()
    if case:
        notify_hearing_scheduled(
            db=db,
            client_user_id=case.client_id,
            lawyer_user_id=None,
            hearing_date=scheduled_date,
            hearing_time=scheduled_time,
            hearing_id=hearing.id,
            case_id=case_id,
        )

    return RedirectResponse(url="/admin/court", status_code=303)


# ── Hearing Management ───────────────────────────────────────────────────────

@router.get("/hearing/{hearing_id}", response_class=HTMLResponse)
async def hearing_detail(
    hearing_id: int, request: Request,
    user=Depends(require_admin), db: Session = Depends(get_db)
):
    hearing = db.query(Hearing).filter(Hearing.id == hearing_id).first()
    if not hearing:
        raise HTTPException(status_code=404, detail="Hearing not found")
    case = db.query(Case).filter(Case.id == hearing.case_id).first()
    return templates.TemplateResponse("admin/hearing_detail.html", {
        "request": request,
        "user": user,
        "hearing": hearing,
        "case": case,
    })


@router.post("/hearing/{hearing_id}/complete")
async def mark_hearing_complete(
    hearing_id: int,
    outcome_notes: str = Form(""),
    user=Depends(require_admin),
    db: Session = Depends(get_db),
):
    hearing = complete_hearing(db, hearing_id, outcome_notes)
    if hearing:
        # Update case status to resolved
        case = db.query(Case).filter(Case.id == hearing.case_id).first()
        if case:
            case.status = "resolved"
            case_ref = getattr(case, "case_reference_no", f"Case #{case.id}")
            db.commit()
            notify_case_resolved(db, case.client_id, case_ref, case.id)
    return RedirectResponse(url="/admin/court", status_code=303)


@router.post("/hearing/{hearing_id}/adjourn")
async def adjourn_hearing_route(
    hearing_id: int,
    next_date: str = Form(...),
    next_time: str = Form(...),
    user=Depends(require_admin),
    db: Session = Depends(get_db),
):
    hearing = adjourn_hearing(db, hearing_id, next_date, next_time)
    if hearing and hearing.next_hearing_id:
        next_h = db.query(Hearing).filter(Hearing.id == hearing.next_hearing_id).first()
        case = db.query(Case).filter(Case.id == hearing.case_id).first()
        if next_h and case:
            notify_hearing_scheduled(
                db=db,
                client_user_id=case.client_id,
                lawyer_user_id=None,
                hearing_date=next_h.scheduled_date,
                hearing_time=next_h.scheduled_time,
                hearing_id=next_h.id,
                case_id=case.id,
            )
    return RedirectResponse(url="/admin/court", status_code=303)


# ── Update filing status ─────────────────────────────────────────────────────

@router.post("/filing/{filing_id}/status")
async def update_filing(
    filing_id: int,
    status: str = Form(...),
    user=Depends(require_admin),
    db: Session = Depends(get_db),
):
    update_filing_status(db, filing_id, status)
    return RedirectResponse(url="/admin/court", status_code=303)
