package team.bangbang.common.data.response;


import com.alibaba.fastjson.JSONObject;
import team.bangbang.common.data.StatusCode;

/**
 * HTTP接口响应数据
 *
 *
 * @author 帮帮组
 * @version 1.0 2017年9月6日
 */
public class ResponseBase {
    /** 成功 */
    public static final ResponseBase SUCCESS = new ResponseBase(StatusCode.SUCCESS, "成功");

    /** 20X段服务调用 - 请求的服务不存在 */
    public static final ResponseBase SERVICE_NOT_EXIST = new ResponseBase(StatusCode.SERVICE_NOT_EXIST, "请求的服务不存在");
    /** 20X段服务调用 - 请求次数超限,暂时封禁 */
    public static final ResponseBase SERVICE_REQUEST_OUT_LIMIT = new ResponseBase(StatusCode.SERVICE_REQUEST_OUT_LIMIT, "请求次数超限或者过于频繁,暂时封禁");
    /** 20X段服务调用 - 请求参数缺少必要字段 */
    public static final ResponseBase SERVICE_FIELD_EXPECTED = new ResponseBase(StatusCode.SERVICE_FIELD_EXPECTED, "请求参数缺少必要字段");

    /** 30X段权限 - 无权限*/
    public static final ResponseBase PERMISSION_DENIED = new ResponseBase(StatusCode.PERMISSION_DENIED, "当前操作无权限");
    /** 30X段权限 - Token过期 */
    public static final ResponseBase PERMISSION_EXPIRED_TOKEN = new ResponseBase(StatusCode.PERMISSION_EXPIRED_TOKEN, "Token过期");
    /** 30X段权限 - 验签失败 */
    public static final ResponseBase PERMISSION_INVALID_SIGN = new ResponseBase(StatusCode.PERMISSION_INVALID_SIGN, "签名sign无效");
    /** 30X段权限 - IP无效 */
    public static final ResponseBase PERMISSION_INVALID_IP = new ResponseBase(StatusCode.PERMISSION_INVALID_IP, "请求IP不被允许");

    /** 40X段错误 - 网络错误 */
    public static final ResponseBase ERROR_NETWORK = new ResponseBase(StatusCode.ERROR_NETWORK, "网络错误");
    /** 40X段错误 - 业务逻辑错误 */
    public static final ResponseBase ERROR_LOGIC = new ResponseBase(StatusCode.ERROR_LOGIC, "业务逻辑错误");
    /** 40X段错误 - 数据库错误 */
    public static final ResponseBase ERROR_DATABASE = new ResponseBase(StatusCode.ERROR_DATABASE, "数据库错误");
    /** 40X段错误 - 文件读写错误 */
    public static final ResponseBase ERROR_FILE_OPERATE = new ResponseBase(StatusCode.ERROR_FILE_OPERATE, "文件操作错误");

    /** 50X数据操作 - 记录未发现 */
    public static final ResponseBase DATA_NOT_FOUND = new ResponseBase(StatusCode.DATA_NOT_FOUND, "记录未发现");
    /** 50X数据操作 - 重复的记录 */
    public static final ResponseBase DATA_DUPLICATE = new ResponseBase(StatusCode.DATA_DUPLICATE, "数据库中存在重复的记录");
    /** 50X数据操作 - 空白的结果 */
    public static final ResponseBase DATA_BLANK = new ResponseBase(StatusCode.DATA_BLANK, "无数据");
    /** 50X数据操作 - 系统保护数据 */
    public static final ResponseBase DATA_PROTECTED = new ResponseBase(StatusCode.DATA_PROTECTED, "系统保护数据,不可修改或删除");

    /** 100X操作账户相关 - 账号或者密码错误 */
    public static final ResponseBase USER_LOGIN_FAILED = new ResponseBase(StatusCode.USER_LOGIN_FAILED, "账号或者密码错误");
    /** 100X操作账户相关 - 账号已经被禁用 */
    public static final ResponseBase USER_DISABLED = new ResponseBase(StatusCode.USER_DISABLED, "账号已经被禁用");
    /** 100X操作账户相关 - 没有登录或者长时间未操作导致登录信息丢失 */
    public static final ResponseBase USER_IDENTITY_MISS = new ResponseBase(StatusCode.USER_IDENTITY_MISS, "没有登录或者长时间未操作导致登录信息丢失");

    /* 状态码 */
    private int statusCode = 0;
    /* 消息 */
    private String message = null;

    /**
     * 成功响应数据
     */
    public ResponseBase() {
        // 默认使用成功的状态吗
        statusCode = StatusCode.SUCCESS;
    }

    /**
     * @param statusCode 状态码
     * @param message 结果消息
     */
    public ResponseBase(int statusCode, String message) {
        this.statusCode = statusCode;
        this.message = message;
    }

    /**
     * 设置响应状态码、消息
     *
     * @param responseBase 响应信息
     *
     * @return 响应信息
     */
    public ResponseBase set(ResponseBase responseBase) {
        setStatusCode(responseBase.statusCode);
        setMessage(responseBase.message);

        return this;
    }

    /**
     * @return 状态码
     */
    public int getStatusCode() {
        return statusCode;
    }

    /**
     * @param statusCode 状态码
     */
    public void setStatusCode(int statusCode) {
        this.statusCode = statusCode;
    }

    /**
     * @return 消息
     */
    public String getMessage() {
        return message;
    }

    /**
     * @param message 消息
     */
    public void setMessage(String message) {
        this.message = message;
    }

    /**
     * @return 转变为JSON字符串
     */
    public String toString() {
        return JSONObject.toJSONString(this);
    }
}