package com.malk.server.dingtalk;

import cn.hutool.core.util.ObjectUtil;
import com.malk.server.common.McException;
import com.malk.server.common.VenR;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * 返回值配置参考McR
 */
@Data
@NoArgsConstructor
public class DDR_New<T> extends VenR {

    private String code;

    private String message;

    private Object data;

    private boolean success;

    private T result;

    /**
     * 无权限对应CODE
     */
    private Map accessdenieddetail;

    /**
     * 离职记录列表
     */
    private List<Map<String, String>> records;

    /**
     * 审批实例id
     */
    private String instanceId;

    ////  宜搭数据  ////

    /**
     * 列表查询数据
     */
    private long pageNumber;

    private long totalCount;

    /**
     * 实例ID详情
     */
    private Map originator;

    private String modifiedTimeGMT;

    private String formInstId;

    private Map formData;

    /**
     * 变更记录
     */
    private Map operationLogMap;


    ////  储存空间  ////

    /**
     * 上传唯一标识
     */
    private String uploadKey;

    /**
     * 文件存储类型。DINGTALK：钉钉统一存储驱动, ALIDOC：钉钉文档存储驱动, UNKNOWN：未知驱动
     */
    private String storageDriver;

    /**
     * 上传协议。HEADER_SIGNATURE：Header加签
     */
    private String protocol;

    /**
     * Header加签上传信息。说明: 当protocol参数传HEADER_SIGNATURE时，返回该字段
     */
    private Map headerSignatureInfo;

    /**
     * 文件信息
     */
    private Map dentry;

    /**
     * 钉盘: 下一页的游标，为空字符串则表示分页结束
     */
    private String nextToken;

    /// 空间列表
    private List<Map> spaces;

    /// 文件或文件夹列表
    private List<Map> dentries;


    ////  专属钉  ////

    // 避免无数据返回空
    private List<Map> list = new ArrayList<>();

    // 成功状态标记 [氚云]
    private final static String SUC_CODE = "success";

    /**
     * 断言错误信息
     * -
     * 新版本: 若存在code则失败, 否则直接返回请求字段, 无状态包装 [已冗余全部字段]
     */
    @Override
    public void assertSuccess() {
        if (ObjectUtil.isNotNull(accessdenieddetail)) {
            message = "没有调用该接口的权限: " + accessdenieddetail;
        }
        McException.assertException(ObjectUtil.isNotNull(code) && !SUC_CODE.equals(code), code, message, "dingtalk_new");
    }

    /**
     * 通用post请求
     */
    public static DDR_New doPost(String url, Map header, Map param, Map body) {
        return (DDR_New) DDR.doPost(url, header, param, body, VenR.RC_DD_New);
    }

    /**
     * 通用get请求
     */
    public static DDR_New doGet(String url, Map header, Map param) {
        return (DDR_New) DDR.doGet(url, header, param, VenR.RC_DD_New);
    }
    public static DDR_New doPut(String url, Map header, Map param, Map body) {
        return (DDR_New) DDR.doPut(url, header, param, body, VenR.RC_DD_New);
    }
}
