import traceback

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

from model.tier_settings_model import TierSettingsModel
from model.user_model import UserModel
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]


class SetCustomerTierPayload(BaseModel):
    actorId: str
    userId: str
    tier: str  # "Silver"|"Gold"|"Diamond" or "" to clear override


@router.get("", dependencies=[Depends(requires_permission("customer_tier_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("customer_tier_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))


@router.put("/customer-tier", dependencies=[Depends(verify_turnstile)])
async def set_customer_tier(
    payload: SetCustomerTierPayload,
    current_user=Depends(requires_permission("customer_tier_management"))
):
    try:
        assert_actor_match(current_user, payload.actorId)
        result = UserModel.admin_set_customer_tier(payload.userId, payload.tier)
        return {
            "success": True,
            "data": result,
            "actedBy": {
                "id": current_user["id"],
                "name": current_user.get("name", ""),
            }
        }
    except ValueError as e:
        raise HTTPException(status_code=400, detail=str(e))
    except Exception as e:
        traceback.print_exc()
        raise HTTPException(status_code=500, detail=str(e))
