from fastapi import APIRouter, Depends, Query
from sqlalchemy.orm import Session

from app.api.deps import get_current_user, require_admin
from app.db.session import get_db
from app.schemas.phase4 import (
    CommissionCalculateRequest,
    CommissionCalculateResponse,
    CommissionRuleCreate,
    CommissionRuleResponse,
    CommissionRuleUpdate,
)
from app.schemas.user_context import CurrentUser
from app.services.commission_service import CommissionService

router = APIRouter()


@router.get("/rules", response_model=list[CommissionRuleResponse])
def list_commission_rules(
    current_user: CurrentUser = Depends(require_admin),
    db: Session = Depends(get_db),
):
    return CommissionService(db).list_rules(current_user.agency_id)


@router.post("/rules", response_model=CommissionRuleResponse)
def create_commission_rule(
    payload: CommissionRuleCreate,
    current_user: CurrentUser = Depends(require_admin),
    db: Session = Depends(get_db),
):
    return CommissionService(db).create_rule(current_user.agency_id, payload.model_dump())


@router.patch("/rules/{rule_id}", response_model=CommissionRuleResponse)
def update_commission_rule(
    rule_id: int,
    payload: CommissionRuleUpdate,
    current_user: CurrentUser = Depends(require_admin),
    db: Session = Depends(get_db),
):
    return CommissionService(db).update_rule(current_user.agency_id, rule_id, payload.model_dump(exclude_unset=True))


@router.delete("/rules/{rule_id}")
def delete_commission_rule(
    rule_id: int,
    current_user: CurrentUser = Depends(require_admin),
    db: Session = Depends(get_db),
):
    CommissionService(db).delete_rule(current_user.agency_id, rule_id)
    return {"ok": True}


@router.post("/calculate", response_model=CommissionCalculateResponse)
def calculate_commission(
    payload: CommissionCalculateRequest,
    current_user: CurrentUser = Depends(get_current_user),
    db: Session = Depends(get_db),
):
    return CommissionService(db).calculate(current_user.agency_id, **payload.model_dump())
