package com.ecep.contract.controller.company_old_name;

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

import org.springframework.util.StringUtils;

import com.ecep.contract.CompanyFileType;
import com.ecep.contract.DesktopUtils;
import com.ecep.contract.controller.tab.TabSkin;
import com.ecep.contract.controller.table.AbstEntityTableTabSkin;
import com.ecep.contract.model.CompanyFile;
import com.ecep.contract.model.CompanyOldName;
import com.ecep.contract.service.CompanyFileService;
import com.ecep.contract.service.CompanyOldNameService;
import com.ecep.contract.util.UITools;
import com.ecep.contract.vm.CompanyFileViewModel;
import com.ecep.contract.vm.CompanyOldNameViewModel;

import javafx.application.Platform;
import javafx.event.ActionEvent;
import javafx.event.Event;
import javafx.scene.control.Tab;
import javafx.scene.control.TableCell;
import javafx.scene.control.TableView;
import lombok.Setter;

/**
 *
 */
public class CompanyOldNameTabSkinFile
        extends
        AbstEntityTableTabSkin<CompanyOldNameWindowController, CompanyOldName, CompanyOldNameViewModel, CompanyFile, CompanyFileViewModel>
        implements TabSkin {
    @Setter
    private CompanyOldNameService companyOldNameService;
    @Setter
    private CompanyFileService companyFileService;

    public CompanyOldNameTabSkinFile(CompanyOldNameWindowController controller) {
        super(controller);
        setDragAndDrop(true);
        setDragAndDropFileHandler(this::moveFileToCompany);
    }

    @Override
    public Tab getTab() {
        return controller.fileTab;
    }

    @Override
    public TableView<CompanyFileViewModel> getTableView() {
        return controller.fileTable;
    }

    @Override
    protected CompanyFileService getViewModelService() {
        return companyFileService;
    }

    @Override
    public Map<String, Object> getSpecification(CompanyOldName parent) {
        Map<String, Object> params = new HashMap<>();
        params.put("company", parent.getCompanyId());
        return params;
    }

    @Override
    public void initializeTab() {
        // controller.fileTable_file_move_btn.setOnAction(this::onTableMoveFileAction);
        // controller.fileTable_file_retrieve_from_download_dir_btn.setOnAction(this::onTableRetrieveFromDownloadDirAction);
        // controller.fileTable_file_reset_btn.setOnAction(this::onTableResetAction);
        //
        //
        // controller.fileTable_idColumn.setCellValueFactory(param ->
        // param.getValue().getId());
        // ObservableMap<CompanyFileType, CompanyFileTypeLocal> observableMapByLocal =
        // getBean(CompanyFileTypeLocalRepository.class).getObservableMapByLocal();
        // controller.fileTable_typeColumn.setCellValueFactory(param ->
        // Bindings.valueAt(observableMapByLocal,
        // param.getValue().getType()).map(CompanyFileTypeLocal::getValue));
        // controller.fileTable_filePathColumn.setCellValueFactory(param ->
        // param.getValue().getFilePath());
        // controller.fileTable_filePathColumn.setCellFactory(param -> new
        // FileTableFilePathTableCell());
        // controller.fileTable_applyDateColumn.setCellValueFactory(param ->
        // param.getValue().getApplyDate());
        // controller.fileTable_expiringDateColumn.setCellValueFactory(param ->
        // param.getValue().getExpiringDate());
        //
        //
        // controller.fileTable_menu_refresh.setOnAction(this::onTableRefreshAction);
        // controller.fileTable_menu_del.setOnAction(this::onTableDeleteAction);
        // controller.fileTable_menu_copy_as_matched_by_contract.setOnAction(this::onTableCopyAsMatchedByContractAction);
        // controller.fileTable_menu_copy_as_matched_by_contract.setOnMenuValidation(this::onTableCopyAsMatchedMenuValidation);

        super.initializeTab();
    }

    private void onTableResetAction(ActionEvent event) {
        CompanyOldName oldName = getParent();
        // CompletableFuture.runAsync(() -> {
        // if (getCompanyFileService().reBuildingFiles(oldName, this::setStatus)) {
        // loadTableDataSet();
        // }
        // });
    }

    /**
     * 从 下载目录 中查找相关的资质文件
     */
    private void onTableRetrieveFromDownloadDirAction(ActionEvent event) {
        // CompanyOldName oldName = getParent();
        // MyProperties myProperties = getMyProperties();
        // File dir = myProperties.getDownloadDirectory();
        // if (!dir.exists()) {
        // setStatus("下载目录 " + dir.getAbsolutePath() + " 不存在，请检查");
        // return;
        // }
        //
        // setStatus("开始检索 下载 文件夹：" + dir.getAbsolutePath() + "...");
        // File[] files = dir.listFiles(File::isFile);
        // if (files == null) {
        // setStatus("检索 下载 文件夹失败");
        // return;
        // }
        // if (files.length == 0) {
        // setStatus("下载 文件夹没有文件");
        // return;
        // }
        // setStatus("下载 文件夹中共有文件 " + files.length + " 个文件");
        //
        // if (getCompanyOldNameService().retrieveFromDownloadFiles(oldName, files,
        // this::setStatus)) {
        // // fixed if update
        // viewModel.update(oldName);
        // loadTableDataSet();
        // }
    }

    /**
     * 把文件从 老系统中移到 \\10.84.209.8\项目信息\相关方信息 目录中
     */
    private void onTableMoveFileAction(ActionEvent event) {
        // CompanyFileService companyFileService = getCompanyFileService();
        // CompanyOldName oldName = getParent();
        // List<CompanyFile> list = companyFileService.findByCompany(oldName);
        // if (list.isEmpty()) {
        // return;
        // }
        // if (getCompanyService().makePathAbsent(oldName)) {
        // save(oldName);
        // }
        //
        // String path = oldName.getPath();
        // if (!StringUtils.hasText(path)) {
        // setStatus("异常, 企业目录未设置");
        // return;
        // }
        // File companyPath = new File(path);
        // for (CompanyFile companyFile : list) {
        // String filePath = companyFile.getFilePath();
        // if (StringUtils.hasText(filePath)) {
        // File file = new File(filePath);
        // if (file.exists()) {
        // if (file.getParentFile().equals(companyPath)) {
        // continue;
        // }
        // File dest = new File(companyPath, file.getName());
        // if (file.renameTo(dest)) {
        // companyFile.setFilePath(dest.getAbsolutePath());
        // companyFileService.save(companyFile);
        // setStatus(file.getName() + " 移动到 " + companyPath.getName());
        // }
        // }
        // }
        // }
    }

    /**
     *
     */
    private void onTableCopyAsMatchedByContractAction(ActionEvent event) {
        UITools.showDialogAndWait("复制资信评估报告", "按当前评估报告复制一个合同中最匹配的", list -> {
            onTableCopyAsMatchedAction_(msg -> {
                Platform.runLater(() -> {
                    list.add(msg);
                });
            });
        });
    }

    private void onTableCopyAsMatchedAction_(Consumer<String> state) {
        // CompanyOldName oldName = getParent();
        //
        // CompanyFileViewModel selectedItem =
        // table.getSelectionModel().getSelectedItem();
        // if (selectedItem == null) {
        // state.accept("未选择行");
        // return;
        // }
        // if (selectedItem.getApplyDate().get() == null) {
        // state.accept("有效日期不能未空");
        // return;
        // }
        //
        // LocalDate nextCreditReportDate = null;
        // try {
        // nextCreditReportDate = companyFileService.getNextCreditReportDate(oldName,
        // state);
        // if (nextCreditReportDate == null) {
        // state.accept("没有找到下一个咨询评估日期");
        // return;
        // }
        // } catch (Exception e) {
        // state.accept("获取下一个咨询评估日期失败:" + e.getMessage());
        // return;
        // }
        //
        // state.accept("下一个咨询评估日期：" + nextCreditReportDate);
        //
        // if (!nextCreditReportDate.isBefore(selectedItem.getApplyDate().get())) {
        // state.accept("咨询评估日期晚于下一个咨询评估日期");
        // return;
        // }
        //
        //
        // File src = new File(selectedItem.getFilePath().get());
        // if (!src.exists()) {
        // state.accept("当前选择行的文件不存在");
        // return;
        // }
        //
        // String srcDate = MyDateTimeUtils.format(selectedItem.getApplyDate().get());
        // String destDate = MyDateTimeUtils.format(nextCreditReportDate);
        // String srcFileName = src.getName();
        // String destFileName;
        //
        // // 天眼查的报告
        // if (CloudTycService.isTycReport(srcFileName)) {
        // state.accept("天眼查的报告按标准格式命名");
        // String name = oldName.getName() + "_" + CloudTycService.NAME;
        // if (srcFileName.contains(CloudTycService.TYC_ENTERPRISE_BASIC_REPORT)) {
        // name = name + "_" + CloudTycService.TYC_ENTERPRISE_BASIC_REPORT;
        // } else if (srcFileName.contains(CloudTycService.TYC_ENTERPRISE_MAJOR_REPORT))
        // {
        // name = name + "_" + CloudTycService.TYC_ENTERPRISE_MAJOR_REPORT;
        // } else if
        // (srcFileName.contains(CloudTycService.TYC_ENTERPRISE_ANALYSIS_REPORT)) {
        // name = name + "_" + CloudTycService.TYC_ENTERPRISE_ANALYSIS_REPORT;
        // }
        // destFileName = name + "_" + destDate + "_cp." +
        // StringUtils.getFilenameExtension(srcFileName);
        // } else {
        // if (srcFileName.contains(srcDate)) {
        // // 如果文件名中包含日期，则替换为新日期
        // destFileName = srcFileName.replace(srcDate, destDate + "_cp");
        // } else {
        // // 如果文件名中不包含日期，则添加日期
        // destFileName = oldName.getName() + "_" + destDate + "_cp." +
        // StringUtils.getFilenameExtension(srcFileName);
        // }
        // }
        //
        // state.accept("新文件名：" + destFileName);
        //
        // File dest = new File(src.getParent(), destFileName);
        // try {
        // FileSystemUtils.copyRecursively(src, dest);
        // state.accept("新文件复制成功");
        // } catch (IOException e) {
        // state.accept("新文件复制失败：" + e.getMessage());
        // }
        //
        // CompanyFile companyFile = new CompanyFile();
        // companyFile.setFilePath(dest.getAbsolutePath());
        // companyFile.setApplyDate(nextCreditReportDate);
        // companyFile.setExpiringDate(nextCreditReportDate.plusYears(1));
        // companyFile.setType(CompanyFileType.CreditReport);
        // companyFile.setCompany(oldName);
        // companyFileService.save(companyFile);
        //
        // state.accept("新文件已记录");
        //
        // loadTableDataSet();
        // state.accept("文件表已刷新");
    }

    /**
     * 当fileTable选中的行是咨询评估时，可用
     *
     * @param event event
     */
    public void onTableCopyAsMatchedMenuValidation(Event event) {
        // 当fileTable选中的行是咨询评估时，可用
        CompanyFileViewModel selectedItem = getSelectedItem();
        if (selectedItem == null) {
            event.consume();
            return;
        }
        CompanyFileType type = selectedItem.getType().get();
        if (type != CompanyFileType.CreditReport) {
            event.consume();
            return;
        }
    }

    private void moveFileToCompany(List<File> files) {
        String path = viewModel.getPath().get();
        if (!StringUtils.hasText(path)) {
            setStatus("未设置目录");
            return;
        }
        File dir = new File(path);
        if (!dir.exists()) {
            setStatus("目录错误,不存在");
            return;
        }
    }

    @Override
    protected void onTableRowDoubleClickedAction(CompanyFileViewModel item) {
        String path = item.getFilePath().get();
        if (StringUtils.hasText(path)) {
            File file = new File(path);
            if (!file.exists()) {
                setStatus("文件不存在 " + file.getName());
                return;
            }
            DesktopUtils.showInExplorer(file);
        }
    }

    class FileTableFilePathTableCell extends TableCell<CompanyFileViewModel, String> {
        @Override
        protected void updateItem(String item, boolean empty) {
            super.updateItem(item, empty);
            if (empty || item == null) {
                setText("");
                return;
            }
            String path = viewModel.getPath().get();
            if (StringUtils.hasText(path)) {
                if (item.startsWith(path)) {
                    item = "~" + item.substring(path.length());
                }
            }
            setText(item);
        }
    }

    private CompanyFileService getCompanyFileService() {
        if (companyFileService == null) {
            companyFileService = getBean(CompanyFileService.class);
        }
        return companyFileService;
    }

    public CompanyOldNameService getCompanyOldNameService() {
        if (companyOldNameService == null) {
            companyOldNameService = getBean(CompanyOldNameService.class);
        }
        return companyOldNameService;
    }
}
