from fastapi import APIRouter, Depends, HTTPException
from sqlalchemy.orm import Session
from typing import List, Optional
from datetime import date
from app.database import get_db
from app.models.unavailability import Unavailability
from app.schemas.unavailability import UnavailabilityCreate, UnavailabilityResponse, UnavailabilityUpdate

router = APIRouter(prefix="/api/unavailabilities", tags=["Unavailabilities"])

def enrich(u: Unavailability) -> UnavailabilityResponse:
    # Auto nonaktif kalau date_range sudah lewat
    is_active = u.is_active
    if u.unavail_type == 'date_range' and u.date_to and u.date_to < date.today():
        is_active = False

    return UnavailabilityResponse(
        id=u.id,
        asim_id=u.asim_id,
        asim_name=u.asim.full_name if u.asim else None,
        asim_no=u.asim.no_asim if u.asim else None,
        unavail_type=u.unavail_type,
        day_of_week=u.day_of_week,
        mass_time=str(u.mass_time)[:5] if u.mass_time else None,
        date_from=u.date_from,
        date_to=u.date_to,
        reason=u.reason,
        status=u.status,
        is_active=is_active,
        created_at=u.created_at,
    )

@router.get("/", response_model=List[UnavailabilityResponse])
def get_all(asim_id: Optional[int] = None, status: Optional[str] = None, db: Session = Depends(get_db)):
    q = db.query(Unavailability)
    if asim_id:
        q = q.filter(Unavailability.asim_id == asim_id)
    if status:
        q = q.filter(Unavailability.status == status)
    return [enrich(u) for u in q.order_by(Unavailability.created_at.desc()).all()]

@router.post("/", response_model=UnavailabilityResponse)
def create(data: UnavailabilityCreate, db: Session = Depends(get_db)):
    from datetime import time as time_type
    mass_time = None
    if data.mass_time:
        h, m = data.mass_time.split(':')
        mass_time = time_type(int(h), int(m))

    u = Unavailability(
        asim_id=data.asim_id,
        unavail_type=data.unavail_type,
        day_of_week=data.day_of_week,
        mass_time=mass_time,
        date_from=data.date_from,
        date_to=data.date_to,
        reason=data.reason,
        status=data.status or 'pending',
        is_active=True,
    )
    db.add(u)
    try:
        db.commit()
        db.refresh(u)
    except Exception:
        db.rollback()
        raise HTTPException(status_code=500, detail="Gagal menyimpan data unavailability")
    return enrich(u)

@router.put("/{unavail_id}", response_model=UnavailabilityResponse)
def update_status(unavail_id: int, data: UnavailabilityUpdate, db: Session = Depends(get_db)):
    u = db.query(Unavailability).filter(Unavailability.id == unavail_id).first()
    if not u:
        raise HTTPException(status_code=404, detail="Tidak ditemukan")
    u.status = data.status
    try:
        db.commit()
        db.refresh(u)
    except Exception:
        db.rollback()
        raise HTTPException(status_code=500, detail="Gagal memperbarui status unavailability")
    return enrich(u)

@router.delete("/{unavail_id}/deactivate")
def deactivate(unavail_id: int, db: Session = Depends(get_db)):
    u = db.query(Unavailability).filter(Unavailability.id == unavail_id).first()
    if not u:
        raise HTTPException(status_code=404, detail="Tidak ditemukan")
    db.delete(u)
    try:
        db.commit()
    except Exception:
        db.rollback()
        raise HTTPException(status_code=500, detail="Gagal menghapus unavailability")
    return {"message": "Unavailability dihapus"}

@router.delete("/{unavail_id}")
def delete(unavail_id: int, db: Session = Depends(get_db)):
    u = db.query(Unavailability).filter(Unavailability.id == unavail_id).first()
    if not u:
        raise HTTPException(status_code=404, detail="Tidak ditemukan")
    db.delete(u)
    try:
        db.commit()
    except Exception:
        db.rollback()
        raise HTTPException(status_code=500, detail="Gagal menghapus data unavailability")
    return {"message": "Dihapus"}