package com.starry.common.result;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.beans.ConstructorProperties;
import java.io.Serializable;
import lombok.Data;

/**
 * @author admin
 * @since 2021/9/1
 */
@Data
@ApiModel(value = "全局统一返回结果")
public class R implements Serializable {

    public final static String OK_MSG = "请求成功";
    public final static String FAIL_MSG = "请求失败";

    @ApiModelProperty(value = "是否成功")
    private boolean success;

    @ApiModelProperty(value = "返回码")
    private Integer code;

    @ApiModelProperty(value = "返回消息")
    private String message;

    @ApiModelProperty(value = "返回数据")
    private Object data;

    @ApiModelProperty(value = "总条数")
    private Long total;

    @ApiModelProperty(value = "分页信息")
    private PageInfo pageInfo;

    private R() {
    }

    private R(int code, Boolean success, String msg, Object data) {
        this.code = code;
        this.success = success;
        this.message = msg;
        if (data instanceof Page<?>) {
            Page<?> page = (Page<?>) data;
            this.total = page.getTotal();
            this.data = page.getRecords();
            this.pageInfo = new PageInfo((int) page.getCurrent(), (int) page.getSize(), page.getTotal(),
                    page.getPages());
        } else {
            this.data = data;
        }
    }

    public static R ok() {
        R r = new R();
        r.setSuccess(true);
        r.setCode(ResultCodeEnum.SUCCESS.getCode());
        r.setMessage(ResultCodeEnum.SUCCESS.getMessage());
        return r;
    }

    public static R ok(Object data) {
        return new R(ResultCodeEnum.SUCCESS.getCode(), true, ResultCodeEnum.SUCCESS.getMessage(), data);
    }

    public static R ok(String msg, Object data) {
        return new R(ResultCodeEnum.SUCCESS.getCode(), true, msg, data);
    }

    public static R error() {
        R r = new R();
        r.setSuccess(false);
        r.setCode(ResultCodeEnum.FAILED.getCode());
        r.setMessage(ResultCodeEnum.FAILED.getMessage());
        return r;
    }

    public static R error(String msg) {
        return new R(ResultCodeEnum.FAILED.getCode(), false, msg, null);
    }

    public static R error(int errorCode, String msg) {
        return new R(errorCode, false, msg, null);
    }

    public static R unauthorized() {
        return new R(ResultCodeEnum.UNAUTHORIZED.getCode(), false, ResultCodeEnum.UNAUTHORIZED.getMessage(), null);
    }

    public R message(String message) {
        this.setMessage(message);
        return this;
    }

    public R code(Integer code) {
        this.setCode(code);
        return this;
    }

    public R data(Object data) {
        this.setData(data);
        return this;
    }

    @Data
    public static class PageInfo {

        @ApiModelProperty("当前页")
        protected int currentPage;
        @ApiModelProperty("页大小")
        protected int pageSize;
        @ApiModelProperty("总记录数")
        protected long totalCount;
        @ApiModelProperty("总页数")
        protected long totalPage;

        public PageInfo() {
        }

        @ConstructorProperties({"currentPage", "pageSize", "totalCount", "totalPage"})
        public PageInfo(int currentPage, int pageSize, long totalCount, long totalPage) {
            this.currentPage = currentPage;
            this.pageSize = pageSize;
            this.totalCount = totalCount;
            this.totalPage = totalPage;
        }
    }

}
