package com.malk.service.dingtalk;

import com.malk.server.dingtalk.DDR_New;

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

public interface DDClient_Storage {


    ///////////////////////// 钉盘附件 /////////////////////////

    /**
     * 新建空间
     *
     * @implSpec 客户端云盘内是不可见: 1. 官方OA审批 - 审批钉盘空间&附件 - 获取审批钉盘空间信息; 2. 文档/文件 - 存储管理 - 空间管理 - 添加空间
     */
    DDR_New createSpaces(String accessToken, String name, String unionId);

    /**
     * 获取空间列表 [钉盘-团队文件-第一层目录列表]
     *
     * @implSpec 忽略分页, 一次性全量查询
     */
    List<Map> getSpaces(String accessToken, String unionId);

    /**
     * 获取文件或文件夹列表
     *
     * @param parentId 父目录Id。根目录时，该参数是0
     * @implSpec 忽略分页, 一次性全量查询; extInfo 非必填参数
     */
    List<Map> getDentries(String accessToken, String unionId, String spaceId, String parentId, Map extInfo);

    /**
     * 添加文件夹 [特殊字符已处理]
     *
     * @param name   文件夹的名称，命名有以下要求：头尾不能包含空格，否则会自动去除; 不能包含特殊字符，包括：制表符、*、"、<、>、|; 不能以"."结尾
     * @param option ppExt: 文件夹名称冲突策略, 返回已存在文件夹, 避免查询文件夹列表  UtilMap.map("conflictStrategy", "RETURN_DENTRY_IF_EXISTS")
     */
    Map addFolders(String accessToken, String unionId, String spaceId, String parentId, String name, Map option);

    ///////////////////////// OA审批附件 /////////////////////////

    /**
     * 获取审批钉盘空间信息
     *
     * @implNote space_id 说明
     * - 一个企业内审批附件钉盘space_id是唯一的。
     * - 本接口有授权上传权限的作用。每次调用上传附件API接口前，建议使用上传操作人userId再调用一次本接口。
     * - 审批附件钉盘，属于企业钉盘的一部分，占用的是企业钉盘空间，但是审批附件钉盘空间和其中的文件在客户端内是不可见的。
     */
    String getSpacesInfos(String access_token, String userId, String agentId);

    /**
     * 添加权限
     *
     * @param dentryId 文件或者文件夹Id。说明: 如果对整个空间授权，该参数值传0
     * @param roleId   权限角色Id。 OWNER：拥有者, MANAGER：管理者, EDITOR：编辑者, DOWNLOADER：下载者, READER：查看者
     * @param members  权限成员列表，最大值30。[配置详见文档]
     */
    boolean addSpacePermissions(String access_token, String spaceId, String dentryId, String unionId, String roleId, List<Map> members, Map option);

    ///////////////////////// 通用上传逻辑 /////////////////////////

    /**
     * 获取文件上传信息
     *
     * @implNote protocol 通过指定上传协议返回不同协议上传所需要的信息。HEADER_SIGNATURE：Header加签
     * @implNote multipart 是否需要分片上传。 true：需要; false：不需要. 说明: 5G以下文件，设为false，简化上传步骤。
     * 5G以上文件，必须设为true，否则会上传失败。
     */
    DDR_New getUploadInfos(String access_token, String spaceId, String unionId, Map option);

    /**
     * 文件上传
     *
     * @return uploadKey: 上传唯一标识; headerSignatureInfo: { resourceUrls: 多个上传下载URL列表, headers: 请求头信息 }
     */
    boolean uploadFiles(String resourceUrl, Map<String, String> headerSignatureInfo, String pathFile);

    /**
     * 提交文件
     *
     * @param name     文件的名称，带后缀 [注意命名规范]
     * @param parentId 父目录Id。根目录时，该参数是0。
     */
    Map commitFiles(String access_token, String spaceId, String unionId, String uploadKey, String name, String parentId, Map option);
}
