from fastapi import APIRouter, Depends, HTTPException
from pydantic import BaseModel, Field
from typing import List

from model.tier_settings_model import TierSettingsModel
from utils.auth_helper import requires_permission, assert_actor_match
from utils.turnstile_helper import verify_turnstile

router = APIRouter(prefix="/admin/tier-settings", tags=["Admin Tier Settings"])


class TierRulePayload(BaseModel):
    code: str
    minPaidQty: int = Field(ge=0)
    order: int = Field(ge=1)


class UpdateTierSettingsPayload(BaseModel):
    actorId: str
    defaultTier: str
    tiers: List[TierRulePayload]


@router.get("", dependencies=[Depends(requires_permission("staff_management"))])
async def get_tier_settings():
    try:
        data = TierSettingsModel.get_settings()
        return {"success": True, "data": data}
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))


@router.put("", dependencies=[Depends(verify_turnstile)])
async def update_tier_settings(
    payload: UpdateTierSettingsPayload,
    current_user=Depends(requires_permission("staff_management"))
):
    try:
        actor_id = current_user["id"]
        actor_name = current_user.get("name", "")
        assert_actor_match(current_user, payload.actorId)

        data = TierSettingsModel.update_settings(
            default_tier=payload.defaultTier,
            tiers=[item.model_dump() for item in payload.tiers],
        )

        return {
            "success": True,
            "data": data,
            "actedBy": {
                "id": actor_id,
                "name": actor_name,
            }
        }
    except ValueError as e:
        raise HTTPException(status_code=400, detail=str(e))
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))