package xtools.boot.api.model.dto;

import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import xtools.base.config.BaseParams;
import xtools.base.exception.CommonException;
import xtools.boot.api.enums.BootError;
import xtools.boot.api.enums.ResultType;
import xtools.boot.api.exection.BizError;

import java.util.Objects;

/**
 * <p>Title : Result</p>
 * <p>Description : Result</p>
 * <p>DevelopTools : Idea_x64_v2026.1</p>
 * <p>DevelopSystem : macOS Sequoia 15.7.5</p>
 * <p>Company : org.xujun</p>
 *
 * @author : XuJun
 * @version : 5.0.0
 * @date : 2025/12/22 14:07
 */
@Data
public final class Result<T> implements BaseParams {

    @Schema(description = "是否成功")
    private boolean success;

    @Schema(description = "响应代码")
    private int code;

    @Schema(description = "提示信息")
    private Object msg;

    @Schema(description = "响应数据")
    private T data;

    /**
     * 构造函数
     */
    public Result() {
    }

    /**
     * 构造函数
     *
     * @param success 是否成功
     * @param code    响应代码
     * @param msg     提示信息
     * @param data    响应数据
     */
    public Result(boolean success, int code, Object msg, T data) {
        this.success = success;
        this.code = code;
        this.msg = msg;
        this.data = data;
    }

    /**
     * 构造函数
     *
     * @param type 响应类型
     * @param data 数据
     */
    public Result(ResultType type, T data) {
        this.success = type.success();
        this.code = type.code();
        this.msg = type.msg() + CP_COMMA + type.desc();
        this.data = data;
    }

    /**
     * 请求成功
     *
     * @return 结果
     */
    public static Result<Object> ok() {
        return new Result<>(ResultType.OK, null);
    }

    /**
     * 请求成功
     *
     * @param data 数据
     * @param <T>  泛型
     * @return 结果
     */
    public static <T> Result<T> ok(T data) {
        return new Result<>(ResultType.OK, data);
    }

    /**
     * 请求成功,业务失败
     *
     * @param code 业务错误码
     * @param msg  业务错误信息
     * @return 响应结果
     */
    public static Result<Object> fail(int code, Object msg) {
        if (code < CP_NUM1000) {
            throw CommonException.create(BootError.RESULT_CODE, code);
        }
        return new Result<>(true, code, msg, null);
    }

    /**
     * 请求参数缺失 | 参数格式错误(如:期望数字却传了字符串) | 参数类型不匹配 | JSON/XML格式错误 | 必填参数为空
     *
     * @return 响应结果
     */
    public static <T> Result<T> badRequest() {
        return new Result<>(ResultType.BAD_REQUEST, null);
    }

    /**
     * 请求参数缺失 | 参数格式错误(如:期望数字却传了字符串) | 参数类型不匹配 | JSON/XML格式错误 | 必填参数为空
     *
     * @param msg 错误信息
     * @return 响应结果
     */
    public static <T> Result<T> badRequest(Object msg) {
        ResultType type = ResultType.BAD_REQUEST;
        return new Result<>(type.success(), type.code(), msg, null);
    }

    /**
     * 获取数据
     *
     * @return 数据
     */
    public T data() {
        if (Objects.equals(success, false) || !Objects.equals(code, CP_NUM200)) {
            throw new BizError(Objects.isNull(msg) ? "业务处理失败" : String.valueOf(msg));
        }
        return data;
    }

}