package cn.timer.api.utils;

import org.springframework.stereotype.Service;

import com.baomidou.mybatisplus.core.metadata.IPage;

/**
 * @author Exrick
 */
@Service("resultUtil")
public class ResultUtil<T> {

//	private static final String CODE_KEY = "code";
//	private static final String RESULT_KEY = "result";
//	private static final String MESSAGE_KEY = "message";
//	private static final String DATA_KEY = "data";
//
//	private static final String PAGE_KEY = "page";
//	private static final String NUMBER_KEY = "number";
//	private static final String SIZE_KEY = "size";
//	private static final String TOTALELEMENTS_KEY = "totalelements";
//	private static final String TOTALPAGES_KEY = "totalpages";
//	private static final String OFFSET_KEY = "offset";

	private static final String MESSAGE_SUCCESS = "操作成功";
	private static final String MESSAGE_FAIL = "操作失败";
	private static final String MESSAGE_UNLOGIN = "会话超时,请重新登录";
//	private static final String MESSAGE_ERROR = "操作错误";
//	private static final String MESSAGE_KICKOUT = "当前账户已在其他地方登录,请重新登录";
	private static final String MESSAGE_PARAMERROR = "参数错误";
//	private static final String MESSAGE_UNAUTHORIZED = "授权错误";
//	private static final String MESSAGE_UNAUTHENTICATED = "认证错误";
//	private static final String MESSAGE_EXCEPTION = "服务器异常";

	private static final String STATUS_CODE_SUCCESS = "200";
//	private static final String STATUS_CODE_FAIL = "201";
//	private static final String STATUS_CODE_ERROR = "202";
	private static final String STATUS_CODE_UNLOGIN = "301";
//	private static final String STATUS_CODE_KICKOUT = "302";
	private static final String STATUS_CODE_UNPARAM = "400";
//	private static final String STATUS_CODE_UNAUTHORIZED = "401";
//	private static final String STATUS_CODE_UNAUTHENTICATED = "405";
	private static final String STATUS_CODE_EXCEPTION = "500";

	private Result<T> result;

	public ResultUtil() {
		result = new Result<>();
		result.setResult(true);
		result.setMessage("success");
		result.setCode(STATUS_CODE_SUCCESS);
	}

	public Result<T> setData(T t) {
		this.result.setData(t);
		this.result.setCode(STATUS_CODE_SUCCESS);
		this.result.setMessage(MESSAGE_SUCCESS);
		return this.result;
	}

	public Result<T> setSuccessMsg(String msg) {
		this.result.setResult(true);
		this.result.setMessage(msg);
		this.result.setCode(STATUS_CODE_SUCCESS);
		this.result.setData(null);
		return this.result;
	}

	public Result<T> setPageData(T t1, Long t2, String msg) {
		this.result.setData(t1);
		this.result.setTotal(t2);
		this.result.setCode(STATUS_CODE_SUCCESS);
		this.result.setMessage(msg);
		return this.result;
	}

	public Result<T> setDatas(T t1, T t2, String msg) {
		this.result.setData(t1);
		this.result.setOther(t2);
		this.result.setCode(STATUS_CODE_SUCCESS);
		this.result.setMessage(msg);
		return this.result;
	}

	@SuppressWarnings("rawtypes")
	public Result<T> setData(T t1, T t2, String msg) {

		this.result.setCurrent(((IPage) t1).getCurrent());
		this.result.setPages(((IPage) t1).getPages());
		this.result.setSize(((IPage) t1).getSize());
		this.result.setTotal(((IPage) t1).getTotal());
		this.result.setData(t2);
		this.result.setCode(STATUS_CODE_SUCCESS);
		this.result.setMessage(msg);
		return this.result;
	}
	
	@SuppressWarnings("rawtypes")
	public Result<T> setData(T t1, T t2) {
		
		this.result.setCurrent(((IPage) t1).getCurrent());
		this.result.setPages(((IPage) t1).getPages());
		this.result.setSize(((IPage) t1).getSize());
		this.result.setTotal(((IPage) t1).getTotal());
		this.result.setData(t2);
		this.result.setCode(STATUS_CODE_SUCCESS);
		this.result.setMessage(MESSAGE_SUCCESS);
		return this.result;
	}

	@SuppressWarnings("rawtypes")
	public Result<T> setData2(T t1, T t2, String msg) {

		this.result.setCurrent((long) ((com.github.pagehelper.Page) t1).getPageNum());
		this.result.setPages((long) ((com.github.pagehelper.Page) t1).getPages());
		this.result.setSize((long) ((com.github.pagehelper.Page) t1).getPageSize());
		this.result.setTotal(((com.github.pagehelper.Page) t1).getTotal());
		this.result.setData(t2);
		this.result.setCode(STATUS_CODE_SUCCESS);
		this.result.setMessage(msg);
		return this.result;
	}

	public Result<T> setData(T t, String msg) {
		this.result.setData(t);
		this.result.setCode(STATUS_CODE_SUCCESS);
		this.result.setMessage(msg);
		return this.result;
	}
	
	public Result<T> setErrorMsg(T t) {
		this.result.setData(t);
		this.result.setCode(STATUS_CODE_UNPARAM);
		this.result.setMessage(MESSAGE_PARAMERROR);
		return this.result;
	}

	public Result<T> setErrorMsg(String msg) {
		this.result.setResult(false);
		this.result.setMessage(msg);
		this.result.setCode(STATUS_CODE_EXCEPTION);
		return this.result;
	}

	public Result<T> setErrorMsg(String code, String msg) {
		this.result.setResult(false);
		this.result.setMessage(msg);
		this.result.setCode(code);
		return this.result;
	}

	public static <T> Result<T> data(T t) {
		return new ResultUtil<T>().setData(t);
	}

	public static <T> Result<T> data(T t1, T t2) {

		return new ResultUtil<T>().setData(t1, t2);
	}
	
	public static <T> Result<T> data(T t1, T t2, String msg) {
		
		return new ResultUtil<T>().setData(t1, t2, msg);
	}

	public static <T> Result<T> data2(T t1, T t2, String msg) {

		return new ResultUtil<T>().setData2(t1, t2, msg);
	}

	public static <T> Result<T> datas(T t1, T t2, String msg) {

		return new ResultUtil<T>().setDatas(t1, t2, msg);
	}

	public static <T> Result<T> data(T t, String msg) {
		return new ResultUtil<T>().setData(t, msg);
	}

	public static <T> Result<T> pageData(T t, Long t2, String msg) {
		return new ResultUtil<T>().setPageData(t, t2, msg);
	}

	public static <T> Result<T> success() {
		return new ResultUtil<T>().setSuccessMsg(MESSAGE_SUCCESS);
	}

	public static <T> Result<T> success(String msg) {
		return new ResultUtil<T>().setSuccessMsg(msg);
	}

	public static <T> Result<T> error() {
		return new ResultUtil<T>().setErrorMsg(MESSAGE_FAIL);
	}

	public static <T> Result<T> unlogin() {
		return new ResultUtil<T>().setErrorMsg(STATUS_CODE_UNLOGIN, MESSAGE_UNLOGIN);
	}

	public static <T> Result<T> error(String msg) {
		return new ResultUtil<T>().setErrorMsg(msg);
	}

	public static <T> Result<T> error(String code, String msg) {
		return new ResultUtil<T>().setErrorMsg(code, msg);
	}
	
	public static <T> Result<T> error(T t) {
		return new ResultUtil<T>().setErrorMsg(t);
	}

}