package com.malk.service.dingtalk;

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

/**
 * 钉钉通讯录管理
 *
 * @apiNote https://open.dingtalk.com/document/orgapp/contacts-overview
 */
public interface DDClient_Contacts {

    /**
     * 获取子部门ID列表 [获取企业部门下的所有直属子部门列表]
     */
    List<Long> listSubDepartmentId(String access_token, long dept_id);

    /**
     * 获取部门列表
     */
    List<Map> listSubDepartmentDetail(String access_token, long dept_id);

    /**
     * 获取全部架构内部门_全部 ID [是否包含一级部门]
     */
    List<Long> getDepartmentId_all(String access_token, boolean containsTop);

    List<Long> getDepartmentId_all(String access_token, boolean containsTop, long deptId);

    /**
     * 获取全部架构内部门_全部 detail [是否包含一级部门]
     */
    List<Map> getDepartmentDetail_all(String access_token, boolean containsTop);

    /**
     * 获取部门用户userid列表 [无需分页]
     */
    List<String> listDepartmentUserId(String access_token, long dept_id);

    /**
     * 查询用户详情
     * -
     * [入职时间 需要再在花名册添加员工可见, 接口才会返回]
     * [手机号\邮箱等, 只有应用开通通讯录邮箱等个人信息权限，才会返回该字段: 如个人邮箱 fieldEmail]
     * ppExt: 企业邮箱org_email, 若无则字段不返回; 手机号telephone无值, 但mobile会返回
     */
    Map getUserInfoById(String access_token, String userId);

    /**
     * 根据手机号查询用户 [手机号查询仅返回userid, 查询详情后返回]
     */
    Map getUserInfoByMobile(String access_token, String mobile);

    /**
     * 删除用户
     */
    boolean deleteUser(String access_token, String userId);

    /**
     * 查询离职记录列表
     *
     * @param startTime 开始时间: 格式：YYYY-MM-DDTHH:mm:ssZ（ISO 8601/RFC 3339）
     * @param extInfo   maxResults, 每页最大条目数，最大值50. nextToken 分页游标. endTime 结束时间, 默认当前时间, 查询跨度不能超过365天
     */
    List<Map<String, String>> getLeaveEmployeeRecords(String access_token, Date startTime, Map extInfo);

    /**
     * 获取指定用户的所有父部门列表
     */
    Map listParentByUser(String access_token, String userId);

    /**
     * 创建用户 [24小时只能收到一次邀请通知, 若是频繁退出再进入, 可关闭邀请确认后自动加入, 路径: 设置 - 安全中心 - 隐私开关 - 团队添加我时需要我的确认 - 关闭]
     */
    Map createUser(String access_token, String name, String mobile, List<String> dept_id_list, Map body_ext);

    /**
     * 创建部门
     */
    Map createDepartment(String access_token, String name, long parent_id, Map body_ext);

    /**
     * 获取部门详情
     */
    Map getDepartmentInfo(String access_token, long dept_id);

    /**
     * 获取员工人数
     *
     * @param only_active 是否包含未激活钉钉人数
     */
    int getUserCount(String access_token, boolean only_active);

    ////////////////////////////// 企业账号 //////////////////////////////

    /**
     * 创建钉钉自建企业账号 [邮箱为必填]
     */
    Map createUser_dingTalk(String access_token, String login_id, String init_password, String name, List<Long> dept_id_list, Map body_ext);

    /**
     * 更新企业账号用户信息
     * ppExt: 1.开启了多部门任职，只会显示多部门任职分组里边的职位信息, 原职位信息不再显示; 2.隐藏部门的职位在名片上不展示
     */
    Map updateUser_dingTalk(String access_token, String userId, List<Long> dept_id_list, Map body_ext);

    /**
     * 授权企业帐号可加入多组织
     */
    void multiOrgPermissions(String access_token, String joinCorpId, String grantDeptIdList);

    /**
     * 邀请其他组织企业账号加入
     * ppExt: 处理逻辑 1. 授权企业帐号可加入多组织, 目前接口不受专属安全控制; 2. 加入企业接口与创建一致, 无需传递登录相关信息, 被邀请方必须为企业账号
     * fixme: 核心参数 [ outer_exclusive_corpid, outer_exclusive_userid ],  组织外邀请无需单独同意, 非激活状态也拉正常加入
     * ppExt: 邀请api, 无手机号字段, 传递创建接口 exclusive_mobile 字段也生效 [备注: 昵称无效, 只对企业账号归属的组织创建有效, 邀请时会显示原组织定义]
     */
    Map inviteExclusiveUser(String access_token, String name, List<Long> dept_id_list, String outer_exclusive_corpid, String outer_exclusive_userid, Map body_ext);
}
