package com.spot.resp;

import com.spot.enums.MessageCode;
import lombok.Data;

import java.io.Serializable;

/**
 * API 统一响应结果
 *
 * @author jean
 * @date 2026-05-06
 */
@Data
public class ApiResultVo<T> implements Serializable {

    private static final long serialVersionUID = 1L;

    /** 响应码 */
    private String code;

    /** 响应消息 */
    private String message;

    /** 响应数据 */
    private T data;

    public ApiResultVo() {
    }

    public ApiResultVo(String code, String message, T data) {
        this.code = code;
        this.message = message;
        this.data = data;
    }

    /**
     * 成功响应（无数据）
     *
     * @param lang 语言标识
     * @param <T>  数据类型
     * @return 成功响应对象
     */
    public static <T> ApiResultVo<T> success(String lang) {
        return new ApiResultVo<>(MessageCode.SUCCESS.getCode(), MessageCode.SUCCESS.getMessage(lang), null);
    }

    /**
     * 成功响应（含数据）
     *
     * @param lang 语言标识
     * @param data 响应数据
     * @param <T>  数据类型
     * @return 成功响应对象
     */
    public static <T> ApiResultVo<T> success(String lang, T data) {
        return new ApiResultVo<>(MessageCode.SUCCESS.getCode(), MessageCode.SUCCESS.getMessage(lang), data);
    }

    /**
     * 失败响应
     *
     * @param lang        语言标识
     * @param messageCode 错误码枚举
     * @param <T>         数据类型
     * @return 失败响应对象
     */
    public static <T> ApiResultVo<T> fail(String lang, MessageCode messageCode) {
        return new ApiResultVo<>(messageCode.getCode(), messageCode.getMessage(lang), null);
    }

    /**
     * 失败响应（自定义消息，消息码取枚举，文本使用传入值）
     * 用于手动校验时将具体错误原因传入
     *
     * @param lang        语言标识
     * @param messageCode 错误码枚举（取code）
     * @param message     自定义错误消息
     * @param <T>         数据类型
     * @return 失败响应对象
     */
    public static <T> ApiResultVo<T> fail(String lang, MessageCode messageCode, String message) {
        String msg = (message != null && !message.isEmpty()) ? message : messageCode.getMessage(lang);
        return new ApiResultVo<>(messageCode.getCode(), msg, null);
    }
}
