from fastapi import APIRouter, Depends, HTTPException
from sqlalchemy.orm import Session
from typing import List
from app.database import get_db
from app.models.area import Area
from app.schemas.area import AreaCreate, AreaUpdate, AreaResponse
from app.core.security import require_pengurus

router = APIRouter(prefix="/api/areas", tags=["Areas"])


@router.get("/", response_model=List[AreaResponse])
def get_all(db: Session = Depends(get_db)):
    return db.query(Area).filter(Area.is_active == True).order_by(Area.sort_order, Area.id).all()


@router.post("/", response_model=AreaResponse)
def create(data: AreaCreate, db: Session = Depends(get_db), _: object = Depends(require_pengurus)):
    area = Area(**data.model_dump())
    db.add(area)
    try:
        db.commit()
        db.refresh(area)
    except Exception:
        db.rollback()
        raise HTTPException(status_code=500, detail="Gagal menyimpan area baru")
    return area


@router.put("/{area_id}", response_model=AreaResponse)
def update(area_id: int, data: AreaUpdate, db: Session = Depends(get_db), _: object = Depends(require_pengurus)):
    area = db.query(Area).filter(Area.id == area_id).first()
    if not area:
        raise HTTPException(status_code=404, detail="Area tidak ditemukan")
    for key, value in data.model_dump(exclude_unset=True).items():
        setattr(area, key, value)
    try:
        db.commit()
        db.refresh(area)
    except Exception:
        db.rollback()
        raise HTTPException(status_code=500, detail="Gagal memperbarui data area")
    return area


@router.delete("/{area_id}")
def delete(area_id: int, db: Session = Depends(get_db), _: object = Depends(require_pengurus)):
    area = db.query(Area).filter(Area.id == area_id).first()
    if not area:
        raise HTTPException(status_code=404, detail="Area tidak ditemukan")
    db.delete(area)
    try:
        db.commit()
    except Exception:
        db.rollback()
        raise HTTPException(status_code=500, detail="Gagal menghapus area")
    return {"message": "Area dihapus"}
