from typing import List
from fastapi import APIRouter, Depends, status
from sqlalchemy.orm import Session
from app.core.database import get_db
from app.models.employee import Employee
from app.models.benefit import Benefit
from app.schemas.benefit import BenefitCreate, BenefitUpdate, BenefitOut
from app.helpers.crud import get_or_404

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


@router.get("/employees/{employee_id}/benefits", response_model=List[BenefitOut])
def get_employee_benefits(employee_id: str, db: Session = Depends(get_db)):
    get_or_404(db, Employee, employee_id, "Employee")
    return (
        db.query(Benefit)
        .filter(Benefit.employee_id == employee_id)
        .order_by(Benefit.benefit_date)
        .all()
    )


@router.post(
    "/employees/{employee_id}/benefits",
    response_model=BenefitOut,
    status_code=status.HTTP_201_CREATED,
)
def create_benefit(employee_id: str, body: BenefitCreate, db: Session = Depends(get_db)):
    get_or_404(db, Employee, employee_id, "Employee")
    benefit = Benefit(
        employee_id=employee_id,
        benefit_date=body.benefit_date,
        monthly_benefit=body.monthly_benefit,
        description=body.description,
        status="active",
    )
    db.add(benefit)
    db.commit()
    db.refresh(benefit)
    return benefit


@router.get("/benefits/{benefit_id}", response_model=BenefitOut)
def get_benefit(benefit_id: str, db: Session = Depends(get_db)):
    return get_or_404(db, Benefit, benefit_id, "Benefit")


@router.put("/benefits/{benefit_id}", response_model=BenefitOut)
def update_benefit(benefit_id: str, body: BenefitUpdate, db: Session = Depends(get_db)):
    benefit = get_or_404(db, Benefit, benefit_id, "Benefit")
    for field, value in body.model_dump(exclude_none=True).items():
        setattr(benefit, field, value)
    db.commit()
    db.refresh(benefit)
    return benefit


@router.delete("/benefits/{benefit_id}", status_code=status.HTTP_204_NO_CONTENT)
def delete_benefit(benefit_id: str, db: Session = Depends(get_db)):
    benefit = get_or_404(db, Benefit, benefit_id, "Benefit")
    db.delete(benefit)
    db.commit()
