package com.haha.common.constant;

import com.haha.common.exception.BusinessExceptionAssert;
import com.haha.common.vo.Result;
import lombok.Getter;

/**
 * 返回码信息
 *
 * @author skyline
 */
@Getter
public enum ResponseEnum implements BusinessExceptionAssert {
    SUCCESS(200, "ok"),
    FAILED(500, "failed"),

    HTTP_STATUS_200(200, "ok"),
    HTTP_STATUS_202(202, "accepted"),
    HTTP_STATUS_400(400, "request error"),
    HTTP_STATUS_401(401, "no authentication"),
    HTTP_STATUS_403(403, "no authorities"),
    HTTP_STATUS_500(500, "server error"),

    DB_ERROR(999, "数据异常"),
    PARAMS_ERROR(1000, "参数异常"),

    // ==================== 通用业务错误码 ====================

    /** 资源不存在 */
    NOT_FOUND(404, "资源不存在"),
    /** 参数不能为空 */
    PARAM_REQUIRED(400, "参数不能为空"),
    /** 参数格式错误 */
    PARAM_FORMAT_ERROR(400, "参数格式错误"),
    /** 无权操作 */
    FORBIDDEN(403, "无权操作"),
    /** 操作失败 */
    OPERATION_FAILED(500, "操作失败"),
    /** 状态不允许操作 */
    STATUS_NOT_ALLOWED(400, "当前状态不允许此操作"),

    // ==================== 业务实体缺失 ====================

    /** 用户不存在 */
    USER_NOT_FOUND(404, "用户不存在"),
    /** 订单不存在 */
    ORDER_NOT_FOUND(404, "订单不存在"),
    /** 门店不存在 */
    SHOP_NOT_FOUND(404, "门店不存在"),
    /** 公告不存在 */
    ANNOUNCEMENT_NOT_FOUND(404, "公告不存在"),
    /** 角色不存在 */
    ROLE_NOT_FOUND(404, "角色不存在"),
    /** 字典类型不存在 */
    DICT_TYPE_NOT_FOUND(404, "字典类型不存在"),
    /** 字典数据不存在 */
    DICT_DATA_NOT_FOUND(404, "字典数据不存在"),
    /** 字典编码已存在 */
    DICT_CODE_DUPLICATE(400, "字典编码已存在"),
    /** 字典项值已存在 */
    DICT_ITEM_VALUE_DUPLICATE(400, "该字典下已存在相同的字典项值"),
    /** 系统内置字典不允许删除 */
    DICT_SYSTEM_NO_DELETE(400, "系统内置字典不允许删除"),
    /** 导入数据不能为空 */
    IMPORT_DATA_EMPTY(400, "导入数据不能为空"),
    /** 签到记录不存在 */
    CHECKIN_NOT_FOUND(404, "签到记录不存在"),
    /** 申请记录不存在 */
    APPLY_NOT_FOUND(404, "申请记录不存在"),
    /** 设备无商品信息 */
    DEVICE_NO_PRODUCTS(404, "该设备暂无商品信息"),

    // ==================== 微信小程序 ====================

    WX_MP_LOGIN_ERROR(301, "微信登录异常"),

    // ==================== 微信支付 ====================

    WX_PAY_AMOUNT_ERROR(300001, "微信支付金额异常"),

    // ==================== 登录 权限 ====================

    LOGIN_FAILED(10001, "用户名或密码错误"),
    NO_PERMISSION(10002, "无访问权限");

    private final Integer code;
    private final String message;

    ResponseEnum(Integer code, String message) {
        this.code = code;
        this.message = message;
    }

    /**
     * 根据此枚举生成Result错误响应
     */
    public <T> Result<T> toResult() {
        return Result.error(this.code, this.message);
    }

    /**
     * 根据此枚举生成Result错误响应，覆盖消息
     */
    public <T> Result<T> toResult(String message) {
        return Result.error(this.code, message);
    }
}
