package com.malk.server.dingtalk;

import com.alibaba.fastjson.JSON;
import com.malk.utils.UtilMap;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

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

/**
 * 钉钉组件要求
 * -
 * 1. 数字组件不能传null或空, 计算字段会自动计算, 不用传值有可. 但打印不支持会不显示
 * 2. 撤回和提交字段必填设置, 接口调用也会受控. 但若发起页面只读, 审批节点必填则不影响
 */
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class DDFormComponentDto {

    /**
     * 组件名称
     */
    private String name;

    /**
     * 组件的值
     */
    private String value;

    /**
     * todo: 钉钉回调, 数字组件不能传null或空, 文本组件null过滤为空; 计算字段胡自动计算, 不用传值, 日期仅支持为年月日或年月日时分两种格式, 人员组件JSON.toJSONString(Arrays.asList(userId))))
     * 快速格式化, 若value非直接取值需预处理好
     *
     * @param formData   表单数据源, 若Value类型为list, 则触发ruleDetail
     * @param formRule   表单数据格式: { 字段名: 组件名 }
     * @param detailRule 表单明细数据格式: 单子表 { 字段名: 组件名 }; 多明细 { 明细字段:  { 字段名: 组件名 } }, 明细字段保持和数据字段一致
     */
    public static List<DDFormComponentDto> formatComponentValues(Map<String, ?> formData, Map<String, String> formRule, Map detailRule) {
        // 审批流表单参数，设置各表单项值
        Map<String, String> ruleDetail = detailRule;
        List<DDFormComponentDto> formComponentValues = new ArrayList<>();
        for (String key : formRule.keySet()) {
            if (formData.get(key) instanceof List) {
                // 明细组件: 每一个组件都是集合, table为集合嵌套集合
                List<List<DDFormComponentDto>> formComponentDetailsValues = new ArrayList<>();
                List<Map> details = (List<Map>) formData.get(key);
                if (detailRule.get(key) instanceof Map) {
                    ruleDetail = (Map<String, String>) detailRule.get(key);
                }
                for (Map detail : details) {
                    List<DDFormComponentDto> detailComponentValues = new ArrayList<>();
                    for (String sub : ruleDetail.keySet()) {
                        detailComponentValues.add(DDFormComponentDto.builder().name(ruleDetail.get(sub)).value(String.valueOf(detail.get(sub))).build());
                    }
                    formComponentDetailsValues.add(detailComponentValues);
                }
                formComponentValues.add(DDFormComponentDto.builder().name(formRule.get(key)).value(JSON.toJSONString(formComponentDetailsValues)).build());
            } else {
                formComponentValues.add(DDFormComponentDto.builder().name(formRule.get(key)).value(String.valueOf(formData.get(key))).build());
            }
        }
        return formComponentValues;
    }

    /**
     * 快速格式化, 上传釘盘的文件转为OA审批对象
     */
    public static String formatAttachment(Map dentry) {
        Map data = UtilMap.map("spaceId, fileName, fileSize, fileType, fileId", "spaceId, name, size, extension, id", dentry);
        return JSON.toJSONString(Arrays.asList(data));
    }
}
