from fastapi import APIRouter, Depends, HTTPException
from sqlalchemy.orm import Session
from typing import List
from app.database import get_db
from app.models.position_type import PositionType
from app.schemas.position_type import PositionTypeCreate, PositionTypeUpdate, PositionTypeResponse

router = APIRouter(prefix="/api/position-types", tags=["Position Types"])

@router.get("/", response_model=List[PositionTypeResponse])
def get_all(db: Session = Depends(get_db)):
    return db.query(PositionType).order_by(PositionType.id).all()

@router.post("/", response_model=PositionTypeResponse)
def create(data: PositionTypeCreate, db: Session = Depends(get_db)):
    existing = db.query(PositionType).filter(PositionType.code == data.code).first()
    if existing:
        raise HTTPException(status_code=400, detail="Code sudah ada!")
    pt = PositionType(**data.model_dump())
    db.add(pt)
    try:
        db.commit()
        db.refresh(pt)
    except Exception:
        db.rollback()
        raise HTTPException(status_code=500, detail="Gagal membuat tipe posisi")
    return pt

@router.put("/{pt_id}", response_model=PositionTypeResponse)
def update(pt_id: int, data: PositionTypeUpdate, db: Session = Depends(get_db)):
    pt = db.query(PositionType).filter(PositionType.id == pt_id).first()
    if not pt:
        raise HTTPException(status_code=404, detail="Tidak ditemukan")
    for key, value in data.model_dump(exclude_unset=True).items():
        setattr(pt, key, value)
    try:
        db.commit()
        db.refresh(pt)
    except Exception:
        db.rollback()
        raise HTTPException(status_code=500, detail="Gagal mengupdate tipe posisi")
    return pt

@router.delete("/{pt_id}")
def delete(pt_id: int, db: Session = Depends(get_db)):
    pt = db.query(PositionType).filter(PositionType.id == pt_id).first()
    if not pt:
        raise HTTPException(status_code=404, detail="Tidak ditemukan")
    db.delete(pt)
    try:
        db.commit()
    except Exception:
        db.rollback()
        raise HTTPException(status_code=500, detail="Gagal menghapus tipe posisi")
    return {"message": "Position type dihapus"}
