package com.trade.service.contract.util;

import com.trade.common.constant.HttpStatus;
import com.trade.common.exception.ServiceException;
import com.trade.service.contract.dto.ContractSignInfo;
import com.trade.service.contract.dto.ContractSigner;
import com.trade.service.contract.service.SignAccountCreator;
import com.trade.service.contract.util.esign.ESignConstant;

import java.io.File;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class SignPubUtil {

    /**
     * 获取本次签署需要创建的账号信息
     * </p>
     * ContractSignInfo 传值规则： </br>
     * 当多个签署文件只需要单方签署时，ContractSignInfo中只需设置singleSigner，sealInfoList中的signer可为空。</br>
     * 当多个签署文件需要多方签署时，ContractSignInfo中设置singleSigner可为空，设置sealInfoList的signer。</br>
     * 即:ContractSignInfo中的singleSigner为sealInfoList的signer的备选项。两者不可同时为空。</br>
     * sealInfoList数组中的ContractSeal对象中的sealIdType为企业证件类型时才需创建企业账号，否则为个人账号。</br>
     * 创建个人账号时只依赖ContractSigner信息，与ContractSeal无关。即需要加盖个人章时，只需设置ContractSigner信息即可。</br>
     *
     * @param signInfoList 签署信息列表
     * @param accountCreator 账号创建器
     * @return <K 签署人证件号, V 签署人第三方账号id>
     */
    public static Map<String, String> getAccountMapFromSignInfo(List<ContractSignInfo> signInfoList,
            SignAccountCreator accountCreator) {
        Map<String, String> resultMap = new HashMap<>();
        signInfoList.forEach(signInfo -> {
            // 单方签署
            ContractSigner signer = signInfo.getSingleSigner();
            if (null != signer) {
                resultMap.put(signer.getSignerIdNo(), accountCreator.creatPersonalAccount(signer));
            }
            signInfo.getSealInfoList().forEach(sealInfo -> {
                if (null == sealInfo.getSigner()) {
                    if (null == signer && !Boolean.TRUE.equals(sealInfo.getAutoSign())) {
                        throw new ServiceException("签署信息中的签署人和签章信息中的签署人不能同时为空", HttpStatus.BAD_REQUEST);
                    }
                    sealInfo.setSigner(signer);
                } else {
                    resultMap.computeIfAbsent(sealInfo.getSigner().getSignerIdNo(),
                            v -> accountCreator.creatPersonalAccount(sealInfo.getSigner()));
                }
                // 若存在企业签章，则需创建企业账号
                if (ESignConstant.isOrgSealType(sealInfo.getSealIdType())) {
                    resultMap.computeIfAbsent(sealInfo.getSealIdNo(), v -> accountCreator.createOrgAccount(sealInfo));
                }
            });
        });
        return resultMap;
    }

    /**
     * 删除文件
     *
     * @param file file
     */
    public static void deleteFile(File file) {
        try {
            file.delete();// 删除本地文件
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 删除文件
     * 
     * @param filePaths 文件路径
     */
    public static void deleteFileWithPath(String... filePaths) {
        for (String filePath : filePaths) {
            File file = new File(filePath);
            if (file.exists()) {
                SignPubUtil.deleteFile(file);
            }
        }
    }
}
