package org.dromara.settlement.api.domain;


import org.dromara.common.core.utils.StringUtils;

import java.io.Serializable;


/**
 * 业务结果抽象类
 * @author 张涛
 * @date 2019年4月29日
 * @param <T>
 */
public class Result<T> implements Serializable{
	/**
	 *
	 */
	private static final long serialVersionUID = 7172632469626661391L;

	public Result(){}

	public Result(T ret){
		setRtnData(ret);
	}

	public Result(T ret, boolean errorRetry){
		setRtnData(ret);
		setErrorRetry(errorRetry);
	}

	public Result(String error){
		setResult(error);
	}

	public Result(T ret, String error){
		setRtnData(ret);
		setResult(error);
	}

	/**
	 * 错误提醒
	 */
	private String result;

	/**
	 * 返回成功失败代码，两端约定好 默认值为200
	 */
	private int rtnCode =ResultCodeEnum.SUCCESS.Code();

	/**
	 * 是否启用错误重试
	 */
	private boolean errorRetry = false;

	/**
	 * 分页前数据总条数
	 */
	private Long total;

	/**
	 * 服务端响应返回数据
	 */
	private T rtnData;

	/**
	 * 当前页数
	 */
	private Long currentPage;

	public Long getCurrentPage() {
		return currentPage;
	}

	public void setCurrentPage(Long currentPage) {
		this.currentPage = currentPage;
	}

	public int getRtnCode() {
		return rtnCode;
	}

	public void setRtnCode(ResultCodeEnum _enum) {
		this.rtnCode = _enum.Code();
	}

	public T getRtnData() {
		return rtnData;
	}

	public void setRtnData(T rtnData) {
		this.rtnData = rtnData;
	}

	public String getResult() {
		return result;
	}

	public void setResult(String result) {
		this.result = result;
	}

	public Long getTotal() {
		return total;
	}

	public void setTotal(Long total) {
		this.total = total;
	}

	/**
	 * 是否有错误
	 * @author 张涛
	 * @date 2019年4月29日
	 * @return
	 */
	public boolean hasError(){
		return getRtnCode() == ResultCodeEnum.ERROR.Code();
	}

	/**
	 * 是否有错误
	 * @author 张涛
	 * @date 2019年4月29日
	 * @return
	 */
	public boolean hasError(org.slf4j.Logger log){
		boolean result = hasError();
		if(result)
			log.error(getResult());
		return result;
	}

	/**
	 * 清空错误
	 * @author 张涛
	 * @date 2019年4月29日
	 */
	public void clearError(){
		setResult(null);
		setRtnCode(ResultCodeEnum.SUCCESS);
	}

	/**
	 * 添加错误
	 * @author 张涛
	 * @date 2019年4月29日
	 * @param error 错误提示
	 */
	public void addError(String error){
		setRtnData(null);
		setRtnCode(ResultCodeEnum.ERROR);
		if (StringUtils.isBlank(getResult())) {
			setResult(error);
		}else{
			setResult(getResult()+";"+error);
		}
	}

	/**
	 * 设置需要确认消息
	 * @author 张涛
	 * @date 2020年2月11日
	 * @param msg 确认提醒内容
	 */
	public void confirm(String msg){
		setRtnCode(ResultCodeEnum.CONFIRM);
		setResult(msg);
	}

	/**
	 * 设置业务提示
	 * @author 张涛
	 * @date 2020年2月11日
	 * @param msg 业务提示内容
	 */
	public void tip(String msg){
		setRtnCode(ResultCodeEnum.TIP);
		setResult(msg);
	}

	/**
	 * 是否有业务提示
	 * @author 张涛
	 * @date 2019年4月29日
	 * @return
	 */
	public boolean hasTip(){
		return getRtnCode() == ResultCodeEnum.TIP.Code();
	}

	/**
	 * 获取错误列表
	 * @author 张涛
	 * @date 2019年5月5日
	 * @return
	 */
	public String[] getErrors(){
		if (hasError() && StringUtils.isNotBlank(getResult())) {
			return getResult().split(";");
		}
		return null;
	}

	/**
	 * 验证是否成功
	 * @author 张涛
	 * @date 2019年5月6日
	 * @param other
	 * @return
	 */
	public boolean isSuccess(Result other){
		if(other != null){
			if(!other.hasError()){
				return true;
			}else{
				addError(other.getResult());
				setRtnData(null);
			}
		}else{
			setRtnData(null);
		}
		return false;
	}

	/**
	 * 验证是否需要确认，如果需要确认，前端操作：是，则再次调用返回需要确认的业务
	 * @author 张涛
	 * @date 2020年2月5日
	 * @return 是否需要确认
	 */
	public boolean isNeedConfirm(){
		return rtnCode == ResultCodeEnum.CONFIRM.Code();
	}

	/**
	 * 是否启用错误重试
	 * @author 张涛
	 * @date 2021年2月1日
	 * @return
	 */
	public boolean isErrorRetry() {
		return errorRetry;
	}

	public void setErrorRetry(boolean errorRetry) {
		this.errorRetry = errorRetry;
	}


}
