<?php

namespace App\Lottery;

/**
 * HTTP JSON 业务码 `code`（与 `ApiResponse`、docs/04 §10 对齐）。
 *
 * 区间约定：0 成功；1000–1999 钱包；2000–2999 下注；8000–8999 SSO/权限；9000–9999 系统。
 * 新增错误时在此登记，业务代码引用本枚举，勿散落魔法数字。
 */
enum ErrorCode: int
{
    /* ========== 成功 ========== */

    /** 业务成功（与 `ApiResponse::success` 默认一致） */
    case Success = 0;

    /* ========== 1000–1999 钱包 / 转账 ========== */

    /** PRD：余额不足 */
    case WalletInsufficientBalance = 1001;

    /** PRD：处理中（转账） */
    case WalletTransferPending = 1002;

    /** PRD：金额超出限制 */
    case WalletAmountExceedsLimit = 1003;

    /** 后台关闭玩家转入（lottery_settings.wallet.transfer_in_enabled=false） */
    case WalletTransferInDisabled = 1004;

    /**
     * PRD：钱包查询等场景下请求参数无效；当前用于 `currency` 非法（与 1003 语义区分）。
     */
    case WalletInvalidCurrency = 1005;

    /** 后台关闭玩家转出 */
    case WalletTransferOutDisabled = 1006;

    /** 彩票钱包已冻结，不可划转 */
    case WalletLotteryFrozen = 1007;

    /** 金额非法：须为正整数最小货币单位 */
    case WalletInvalidAmount = 1008;

    /** 主站钱包接口拒绝或不可用（扣款/加款失败） */
    case WalletExternalRejected = 1009;

    /** 幂等键与已有订单冲突（金额/币种/方向不一致） */
    case WalletIdempotentConflict = 1010;

    /** 信用盘玩家不可主站钱包划转 */
    case WalletCreditPlayerNoTransfer = 1011;

    /* ========== 2000–2999 下注 / 注单（PRD 保留，业务未实现时亦可提前登记） ========== */

    /** PRD：当期已封盘 */
    case DrawClosed = 2001;

    /** PRD：玩法已关闭 */
    case PlayModeClosed = 2002;

    /** PRD：下注语境余额不足（可与 1001 同语义） */
    case BetInsufficientBalance = 2003;

    /** 下注号码格式或长度不合法 */
    case BetInvalidNumber = 2004;

    /** 下注玩法不支持或参数缺失 */
    case BetInvalidPlayInput = 2005;

    /** 当前期号不存在或不是可下注期号 */
    case BetInvalidDraw = 2006;

    /** 当前玩法不存在或暂不支持下注 */
    case BetPlayUnsupported = 2007;

    /**
     * 预览后玩法/赔率/封顶等配置版本已切换，需重新预览再提交。
     */
    case BetConfigStale = 2008;

    /** 同 client_trace_id 重试，但原订单已退款/不可回放 */
    case BetIdempotentReplayRejected = 2009;

    /** 风险池额度不足，号码已售罄 */
    case RiskPoolSoldOut = 4001;

    /** 配置版本不是草稿，无法整表替换 items 或发布 */
    case ConfigVersionNotDraft = 2101;

    /** items 中存在未知 play_code（未在 play_types 登记） */
    case ConfigUnknownPlayCode = 2102;

    /** 赔率 / 目录币种未启用或不可下注 */
    case ConfigCurrencyInvalid = 2103;

    /** 不能删除当前生效（active）的配置版本 */
    case ConfigVersionCannotDeleteActive = 2104;

    /* ========== 8000–8999 玩家 SSO / Bearer 鉴权 ========== */

    /** 无 Bearer / 格式错误 / token 为空 */
    case PlayerAuthorizationInvalid = 8001;

    /** JWT 无效或过期、dev: 格式错误、缺少站点或玩家标识等 */
    case PlayerTokenInvalid = 8002;

    /** 库中无对应玩家（未建档） */
    case PlayerNotRegistered = 8003;

    /** 未配置 `MAIN_SITE_SSO_JWT_SECRET`（通常 HTTP 503） */
    case PlayerSsoSecretNotConfigured = 8004;

    /** 账号已冻结或禁止登录（status ≠ active） */
    case PlayerAccountSuspended = 8005;

    /** 原生登录：账号或密码错误 */
    case PlayerCredentialsInvalid = 8006;

    /** 原生登录：失败次数过多已锁定 */
    case PlayerLoginLocked = 8007;

    /** 原生登录：非彩票账号密码登录类型 */
    case PlayerNativeLoginRequired = 8008;

    /** 原生登录：验证码错误或过期 */
    case PlayerCaptchaInvalid = 8009;

    /* ========== 8100–8199 管理端 API ========== */

    /** 未登录或 Token 无效 */
    case AdminUnauthenticated = 8110;

    /** 登录：验证码错误或过期 */
    case AdminCaptchaInvalid = 8111;

    /** 登录：账号或密码不匹配（对外统一措辞） */
    case AdminCredentialsInvalid = 8112;

    /** 登录：账号已禁用 */
    case AdminAccountDisabled = 8113;

    /** 已登录但无 RBAC 权限 */
    case AdminForbidden = 8114;

    /* ========== 9000–9999 系统 / 框架 ========== */

    /** 表单或 Query 校验失败（ValidationException → 422） */
    case ValidationFailed = 9001;

    /** 模型或路由不存在 */
    case NotFound = 9004;

    /** `abort(4xx)` 等客户端类 Http 异常归类 */
    case ClientHttpError = 9010;

    /** 请求过于频繁 */
    case TooManyRequests = 9031;

    /** 未分类服务端异常 */
    case InternalError = 9999;
}
