package com.ecep.contract.ds.company;

import java.io.File;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.function.BiConsumer;
import java.util.function.Function;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import com.ecep.contract.util.FileUtils;
import org.springframework.util.StringUtils;

import com.ecep.contract.CompanyFileType;
import com.ecep.contract.MyDateTimeUtils;
import com.ecep.contract.constant.CloudServiceConstant;
import com.ecep.contract.ds.company.service.CompanyFileService;
import com.ecep.contract.model.CompanyFile;

public class CompanyFileUtils {

    public static CompanyFile fillType(String fileName, String companyName, File destDir) {
        CompanyFile companyFile = new CompanyFile();
        if (isTycReport(fileName, companyName)) {
            File dest = new File(destDir, fileName);
            companyFile.setType(CompanyFileType.CreditReport);
            companyFile.setFilePath(dest.getAbsolutePath());
            return companyFile;
        }

        // 包含公司名称 和 天眼查 的文件
        if (fileName.contains(companyName) && fileName.contains(CloudServiceConstant.TYC_NAME)) {
            LocalDateTime dateTime = LocalDateTime.now();
            DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd_HH-mm");
            int idx = fileName.indexOf("报告");
            String destName = (idx > 0 ? fileName.substring(0, fileName.indexOf("报告") + 2) + "_" : "") +
                    companyName + "_天眼查_" + dateTime.format(fmt) + "." + StringUtils.getFilenameExtension(fileName);
        }

        for (CompanyFileType value : CompanyFileType.values()) {

        }
        return null;
    }

    /**
     * 从文件名判断是否是天眼查的报告文件
     */
    public static boolean isTycReport(String fileName, String companyName) {
        // 文件名中必须包含 天眼查 字样
        if (!fileName.contains(CloudServiceConstant.TYC_NAME)) {
            return false;
        }

        // 文件名中必须包含 公司名称
        if (!fileName.contains(companyName)) {
            return false;
        }

        // 文件名后缀需符合要求
        return FileUtils.withExtensions(fileName, FileUtils.PDF, FileUtils.DOC, FileUtils.DOCX);
    }

    public static boolean isCompanyFile(File file) {
        String fileName = file.getName();
        if (fileName.equals(FileUtils.FILE_DB_JSON)) {
            return true;
        }
        if (fileName.equals(FileUtils.FILE_B1001_JSON)) {
            return true;
        }

        if (fileName.equals(FileUtils.FILE_BLACK_LIST_JSON)) {
            return true;
        }
        if (fileName.equals("合同列表.json")) {
            return true;
        }

        // 营业执照
        if (fileName.contains(CompanyFileService.BUSINESS_LICENSE)) {
            return true;
        }
        // 操作证
        if (fileName.contains(CompanyFileService.OPERATION_CERTIFICATE)) {
            return true;
        }
        // 许可证
        if (fileName.contains(CompanyFileService.PERMIT_CERTIFICATE)) {
            return true;
        }
        // 登记证
        if (fileName.contains(CompanyFileService.REGISTRATION_CERTIFICATE)) {
            return true;
        }
        // 组织机构代码证
        if (fileName.contains(CompanyFileService.ORGANIZATION_CODE_CERTIFICATE)) {
            return true;
        }

        return false;
    }

    /**
     * 根据文件名中提取的日期信息更新对象的日期,如果文件名称中没有可识别的日期，则不进行任何更新
     * 日期提取方法参考 {@link MyDateTimeUtils#pickLocalDate(String)}
     *
     * @param file       日期来源文件对象
     * @param vendorFile 要更新的对象
     * @param getter     对象的日期获取方法
     * @param setter     对象的日期设置方法
     * @param <T>        对象泛型
     * @return 是否更新了日期
     */
    public static <T> boolean fillApplyDateAbsent(File file, T vendorFile, Function<T, LocalDate> getter,
            BiConsumer<T, LocalDate> setter) {
        LocalDate applyDate = getter.apply(vendorFile);
        if (applyDate != null) {
            return false;
        }

        boolean modified = false;
        String fileName = file.getName();
        // 从文件的名称中提取日期
        LocalDate picked = MyDateTimeUtils.pickLocalDate(fileName);
        if (picked != null) {
            // 如果提取出的日期不为空，则通过setter函数将这个日期设置到vendorFile中，并将modified标志设置为true。
            setter.accept(vendorFile, picked);
            modified = true;
        }
        return modified;
    }

    public static boolean isHiddenFile(File file) {
        String fileName = file.getName();
        if (fileName.equals(FileUtils.FILE_DB_THUMBS)) {
            return true;
        }
        return fileName.startsWith("~$");
    }

    public static String escapeFileName(String fileName) {
        String patternStr = "[\\\\/:*?\"<>|]";
        Pattern pattern = Pattern.compile(patternStr);
        Matcher matcher = pattern.matcher(fileName);
        return matcher.replaceAll("_");
    }

    /**
     * 返回 district 中关于省份的部门zi
     *
     * @param district 地区
     * @return 省份名称
     */
    public static String getParentPrefixByDistrict(String district) {
        int indexOf = district.indexOf("省");
        if (indexOf != -1) {
            return district.substring(0, indexOf);
        }

        indexOf = district.indexOf("自治区");
        if (indexOf != -1) {
            return district.substring(0, 2);
        }

        indexOf = district.indexOf("市");
        if (indexOf != -1) {
            return district.substring(0, indexOf);
        }
        return null;
    }

    public static boolean exists(String path) {
        if (!StringUtils.hasText(path)) {
            return false;
        }
        File file = new File(path);
        return file.exists();
    }
}
