package cn.meowrain.aioj.backend.framework.core.web;

import cn.meowrain.aioj.backend.framework.core.errorcode.ErrorCode;
import cn.meowrain.aioj.backend.framework.core.exception.AbstractException;

import java.util.Optional;

/**
 * 构建响应的工具类
 */
public final class Results {

	/**
	 * 成功响应，不返回任何信息
	 * @return {@link Result<Void>}
	 */
	public static Result<Void> success() {
		return new Result<Void>().setCode(Result.SUCCESS_CODE);
	}

	/**
	 * 成功响应 返回数据
	 * @param data 返回的响应体信息
	 * @param <T> 泛型
	 * @return {@link Result<T>}
	 */
	public static <T> Result<T> success(T data) {
		return new Result<T>().setCode(Result.SUCCESS_CODE).setData(data);
	}

	/**
	 * 客户端请求参数错误
	 * @return {@link Result<Void>}
	 */
	public static Result<Void> paramsValidFailure() {
		return failure(ErrorCode.PARAMS_ERROR.code(), ErrorCode.PARAMS_ERROR.message());
	}

	/**
	 * 服务端错误默认响应 -- <b>内部错误</b>
	 * @return {@link Result<Void>}
	 */
	public static Result<Void> failure() {
		return new Result<Void>().setCode(ErrorCode.SYSTEM_ERROR.code()).setMessage(ErrorCode.SYSTEM_ERROR.message());
	}

	/**
	 * 服务端错误响应 - 接收一个AbstractException，里面定义了错误码和错误信息
	 * @param exception {@link AbstractException}
	 * @return {@link Result<Void>}
	 */
	public static Result<Void> failure(AbstractException exception) {
		String errorCode = Optional.ofNullable(exception.getErrorCode()).orElse(ErrorCode.SYSTEM_ERROR.code());
		String errorMessage = Optional.ofNullable(exception.getErrorMessage()).orElse(ErrorCode.SYSTEM_ERROR.message());

		return new Result<Void>().setCode(errorCode).setMessage(errorMessage);
	}

	/**
	 * 服务端错误响应，自定义错误码和错误信息
	 * @param errorCode {@link String}
	 * @param errorMessage {@link String}
	 * @return {@link Result<Void>}
	 */
	public static Result<Void> failure(String errorCode, String errorMessage) {
		return new Result<Void>().setCode(errorCode).setMessage(errorMessage);
	}

}
