package com.app.framework.core.support.view.form;

import cn.hutool.core.codec.Base64;
import cn.hutool.json.JSONUtil;

import java.util.Date;

/**
 * 请求返回结果
 * code(200：成功	0或其他：失败)
 */
public class AjaxResult<T> {
    /**
     * 执行成功
     */
    public static final String SUCCESS = "200";
    /**
     * 执行失败
     */
    public static final String FAILURE = "0";

    /**
     * 执行结果(200: 成功 0或其它: 失败 401: 身份认证失败)
     */
    private String code;

    /**
     * 提示信息
     */
    private String msg = "";

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

    /**
     * 时间
     */
    private Date time;

    /**
     * 获取执行结果
     *
     * @return true：执行成功,code代码为200  false：执行失败,code代码非200
     */
    public boolean success() {
        if (SUCCESS.equals(this.code))
            return true;
        return false;
    }

    /**
     * 获取执行结果
     *
     * @return 执行结果代码，200：成功	0:失败  其它:自定义的失败代码
     */
    public String getCode() {
        return code;
    }

    /**
     * 设置执行结果
     *
     * @param code 执行结果代码
     */
    public void setCode(String code) {
        this.code = code;
    }

    /**
     * 设置执行结果
     *
     * @param success 执行结果
     */
    public void setCode(boolean success) {
        if (success)
            this.code = SUCCESS;
        else
            this.code = FAILURE;
    }

    /**
     * 获取提示信息
     */
    public String getMsg() {
        if (msg == null || "".equals(msg)) {
            if (SUCCESS.equals(this.code)) {
                msg = "操作成功";
            } else {
                msg = "操作失败";
            }
        }
        return msg;
    }

    /**
     * 设置提示信息
     *
     * @param msg 提示信息
     */
    public void setMsg(String msg) {
        this.msg = msg;
    }

    /**
     * 获取返回数据
     */
    public T getData() {
        return data;
    }

    /**
     * 设置返回数据
     *
     * @param data 返回数据
     */
    public void setData(T data) {
        this.data = data;
    }

    /**
     * 获取数据返回时间
     */
    public Date getTime() {
        if (this.time == null) {
            this.time = new Date();
        }
        return time;
    }

    /**
     * 设置数据返回时间
     */
    public void setTime(Date time) {
        this.time = time;
    }

    /**
     * 实例化AjaxResult对象
     *
     * @param success 执行结果
     */
    public static AjaxResult wrap(boolean success) {
        AjaxResult ajaxResult = new AjaxResult();
        ajaxResult.setCode(success);
        return ajaxResult;
    }

    /**
     * 实例化AjaxResult对象
     *
     * @param success 执行结果
     * @param msg     提示信息
     */
    public static AjaxResult wrap(boolean success, String msg) {
        AjaxResult ajaxResult = new AjaxResult();
        ajaxResult.setCode(success);
        ajaxResult.setMsg(msg);
        return ajaxResult;
    }

    /**
     * 实例化AjaxResult对象
     *
     * @param success 执行结果
     * @param msg     提示信息
     * @param data    返回数据
     */
    public static <T> AjaxResult wrap(boolean success, String msg, T data) {
        AjaxResult ajaxResult = new AjaxResult();
        ajaxResult.setCode(success);
        ajaxResult.setMsg(msg);
        ajaxResult.setData(data);
        return ajaxResult;
    }

    /**
     * 实例化执行成功的AjaxResult对象
     *
     * @param msg 提示信息
     */
    public static AjaxResult wrapSuccess(String msg) {
        return AjaxResult.wrap(true, msg);
    }

    /**
     * 实例化执行失败的AjaxResult对象
     *
     * @param msg 提示信息
     */
    public static AjaxResult wrapError(String msg) {
        return AjaxResult.wrap(false, msg);
    }

    /**
     * 实例化执行成功的AjaxResult对象
     *
     * @param data 返回数据
     */
    public static <T> AjaxResult wrapData(T data) {
        return AjaxResult.wrap(true, null, data);
    }

    /**
     * 实例化AjaxResult对象
     *
     * @param code 执行结果
     * @param msg  提示信息
     */
    public static AjaxResult wrap(String code, String msg) {
        AjaxResult ajaxResult = new AjaxResult();
        ajaxResult.setCode(code);
        ajaxResult.setMsg(msg);
        return ajaxResult;
    }

    /**
     * 实例化AjaxResult对象
     *
     * @param code 执行结果
     * @param msg  提示信息
     * @param data 返回数据
     */
    public static <T> AjaxResult wrap(String code, String msg, T data) {
        AjaxResult ajaxResult = new AjaxResult();
        ajaxResult.setCode(code);
        ajaxResult.setMsg(msg);
        ajaxResult.setData(data);
        return ajaxResult;
    }

    /**
     * 实例化AjaxResult对象,并对data进行Base64加密
     *
     * @param success 执行结果
     * @param data    返回数据
     */
    public static <T> AjaxResult wrapBase64(boolean success, T data) {
        //对返回的data数据进行Base64加密
        if (data != null) {
            if (data instanceof String) {
                data = (T) Base64.encode(data.toString());
            } else {
                String jsonData = JSONUtil.parseObj(data, false).toString();
                data = (T) Base64.encode(jsonData);
            }
        }
        return AjaxResult.wrap(success, null, data);
    }
}
