"""
Hearing Router — Virtual Hearing Room join endpoints.
Accessible to all authenticated users (client, lawyer, admin/judge).
"""
from fastapi import APIRouter, Depends, Request, HTTPException
from fastapi.responses import HTMLResponse
from fastapi.templating import Jinja2Templates
from sqlalchemy.orm import Session
from pathlib import Path

from ..models.models import Case, User
from ..models.fyp2_models import Hearing
from ..services.database import get_db
from ..services.auth_service import get_current_user
from ..services.hearing_service import get_join_url

router = APIRouter()
BASE_DIR = Path(__file__).resolve().parent.parent.parent
templates = Jinja2Templates(directory=str(BASE_DIR / "frontend" / "templates"))


@router.get("/{hearing_id}/join", response_class=HTMLResponse)
async def join_hearing(
    hearing_id: int,
    request: Request,
    user: User = Depends(get_current_user),
    db: Session = Depends(get_db),
):
    """
    Join a virtual hearing room.
    Generates a participant token (Daily.co) or returns plain URL (Jitsi).
    """
    hearing = db.query(Hearing).filter(Hearing.id == hearing_id).first()
    if not hearing:
        raise HTTPException(status_code=404, detail="Hearing not found")

    if hearing.status == "cancelled":
        raise HTTPException(status_code=410, detail="This hearing has been cancelled")

    case = db.query(Case).filter(Case.id == hearing.case_id).first()

    # Clients may only join hearings of their own cases
    if user.role == "client" and (not case or case.client_id != user.id):
        raise HTTPException(status_code=403, detail="This hearing is not for your case")

    # Judge/admin gets the Zoom host start_url; others get the regular join_url
    is_host  = user.role in ("admin", "lawyer")  # client joins as participant
    join_url = get_join_url(hearing, is_host=is_host)

    return templates.TemplateResponse("hearing/hearing_room.html", {
        "request": request,
        "user": user,
        "hearing": hearing,
        "case": case,
        "join_url": join_url,
        "is_host": is_host,
        "room_provider": hearing.room_provider,
    })


@router.get("/{hearing_id}/info")
async def hearing_info(
    hearing_id: int,
    user: User = Depends(get_current_user),
    db: Session = Depends(get_db),
):
    """JSON endpoint — returns hearing details for API clients."""
    hearing = db.query(Hearing).filter(Hearing.id == hearing_id).first()
    if not hearing:
        raise HTTPException(status_code=404, detail="Hearing not found")
    if user.role == "client":
        case = db.query(Case).filter(Case.id == hearing.case_id).first()
        if not case or case.client_id != user.id:
            raise HTTPException(status_code=403, detail="This hearing is not for your case")
    return {
        "id": hearing.id,
        "case_id": hearing.case_id,
        "scheduled_date": hearing.scheduled_date,
        "scheduled_time": hearing.scheduled_time,
        "hearing_type": hearing.hearing_type,
        "judge_name": hearing.judge_name,
        "status": hearing.status,
        "room_provider": hearing.room_provider,
        "room_url": hearing.zoom_join_url,
        "outcome_notes": hearing.outcome_notes,
    }
