package com.xy.xyaicpzs.service;

import com.xy.xyaicpzs.util.ExcelDataImporter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;

/**
 * Excel导入服务类
 */
@Slf4j
@Service
public class ExcelImportService {

    @Autowired
    private ExcelDataImporter excelDataImporter;

    /**
     * 导入Excel文件数据
     * @param file 上传的Excel文件
     * @return 导入结果消息
     */
    public String importExcelFile(MultipartFile file) {
        if (file.isEmpty()) {
            return "文件为空，请选择有效的Excel文件";
        }

        String originalFilename = file.getOriginalFilename();
        if (originalFilename == null || !originalFilename.toLowerCase().endsWith(".xlsx")) {
            return "请上传.xlsx格式的Excel文件";
        }

        try {
            // 创建临时文件
            File tempFile = File.createTempFile("import_", ".xlsx");
            file.transferTo(tempFile);

            // 执行数据导入
            excelDataImporter.importExcelData(tempFile.getAbsolutePath());

            // 删除临时文件
            tempFile.delete();

            return "数据导入成功";

        } catch (IOException e) {
            log.error("文件处理失败：{}", e.getMessage(), e);
            return "文件处理失败：" + e.getMessage();
        } catch (Exception e) {
            log.error("数据导入失败：{}", e.getMessage(), e);
            return "数据导入失败：" + e.getMessage();
        }
    }

    /**
     * 导入指定路径的Excel文件
     * @param filePath 文件路径
     * @return 导入结果消息
     */
    public String importExcelFileByPath(String filePath) {
        try {
            File file = new File(filePath);
            if (!file.exists()) {
                return "文件不存在：" + filePath;
            }

            if (!filePath.toLowerCase().endsWith(".xlsx")) {
                return "请提供.xlsx格式的Excel文件路径";
            }

            // 执行数据导入
            excelDataImporter.importExcelData(filePath);

            return "数据导入成功";

        } catch (Exception e) {
            log.error("数据导入失败：{}", e.getMessage(), e);
            return "数据导入失败：" + e.getMessage();
        }
    }

    /**
     * 获取Excel导入信息说明
     * @return 导入信息说明
     */
    public String getImportInfo() {
        StringBuilder info = new StringBuilder();
        info.append("=== Excel数据导入说明 ===\n");
        info.append("支持的工作表：\n");
        info.append("1. T1工作表 - 红球数据（4个表：history_all, history_100, history_top, history_top_100）\n");
        info.append("2. T2工作表 - 蓝球数据（4个表：blue_history_all, blue_history_100, blue_history_top, blue_history_top_100）\n");
        info.append("3. T3工作表 - 红球线系数数据（1个表：t3，33×33=1089条记录）\n");
        info.append("4. T4工作表 - 蓝球组红球线系数数据（1个表：t4，16×33=528条记录）\n");
        info.append("5. T5工作表 - 蓝球组蓝球线系数数据（1个表：t5，16×16=256条记录）\n");
        info.append("6. T6工作表 - 红球组蓝球线系数数据（1个表：t6，33×16=528条记录）\n");
        info.append("7. T7工作表 - 红球组红球面系数数据（1个表：t7，33×33=1089条记录）\n");
        info.append("8. T8工作表 - 红球组蓝球面系数数据（1个表：t8，33×16=528条记录）\n");
        info.append("9. T10工作表 - 彩票开奖信息数据（1个表：lottery_draws，历史开奖记录）\n");
        info.append("10. T11工作表 - 蓝球组红球面系数数据（1个表：t11，16×33=528条记录）\n");
        info.append("\n数据结构：\n");
        info.append("- T1/T2：标准表格结构，按列映射到对应字段\n");
        info.append("- T3：每三列为一组，红球1-33号，线系数在C、F、I、L...列\n");
        info.append("- T4：每三列为一组，蓝球1-16号，红球1-33号，线系数在C、F、I、L...列\n");
        info.append("- T5：每三列为一组，蓝球1-16号，蓝球1-16号，线系数在C、F、I、L...列\n");
        info.append("- T6：每三列为一组，红球1-33号，蓝球1-16号，线系数在C、F、I、L...列\n");
        info.append("- T7：每三列为一组，红球1-33号，红球1-33号，面系数在C、F、I、L...列\n");
        info.append("- T8：每三列为一组，红球1-33号，蓝球1-16号，面系数在C、F、I、L...列\n");
        info.append("- T10：标准表格结构，A列开奖期号，B列开奖日期，C-H列红球1-6，I列蓝球\n");
        info.append("- T11：每三列为一组，蓝球1-16号，红球1-33号，面系数在C、F、I、L...列\n");
        info.append("\n导入特性：\n");
        info.append("- 自动清空现有数据\n");
        info.append("- 数值自动保留两位小数\n");
        info.append("- 完善的错误处理和日志记录\n");
        info.append("- 支持.xlsx和.xls格式\n");
        return info.toString();
    }

    /**
     * 导入指定路径的开奖数据Excel文件
     * @param filePath 文件路径
     * @return 导入结果消息
     */
    public String importLotteryDrawsByPath(String filePath) {
        try {
            File file = new File(filePath);
            if (!file.exists()) {
                return "文件不存在：" + filePath;
            }

            if (!filePath.toLowerCase().endsWith(".xlsx")) {
                return "请提供.xlsx格式的Excel文件路径";
            }

            // 执行开奖数据导入
            excelDataImporter.importLotteryDrawsData(filePath);

            return "开奖数据导入成功";

        } catch (Exception e) {
            log.error("开奖数据导入失败：{}", e.getMessage(), e);
            return "开奖数据导入失败：" + e.getMessage();
        }
    }

    /**
     * 导入上传的开奖数据Excel文件
     * @param file 上传的Excel文件
     * @return 导入结果消息
     */
    public String importLotteryDrawsFile(MultipartFile file) {
        if (file.isEmpty()) {
            return "文件为空，请选择有效的Excel文件";
        }

        String originalFilename = file.getOriginalFilename();
        if (originalFilename == null || !originalFilename.toLowerCase().endsWith(".xlsx")) {
            return "请上传.xlsx格式的Excel文件";
        }

        try {
            // 创建临时文件
            File tempFile = File.createTempFile("lottery_import_", ".xlsx");
            file.transferTo(tempFile);

            // 执行开奖数据导入
            excelDataImporter.importLotteryDrawsData(tempFile.getAbsolutePath());

            // 删除临时文件
            tempFile.delete();

            return "开奖数据导入成功";

        } catch (IOException e) {
            log.error("文件处理失败：{}", e.getMessage(), e);
            return "文件处理失败：" + e.getMessage();
        } catch (Exception e) {
            log.error("开奖数据导入失败：{}", e.getMessage(), e);
            return "开奖数据导入失败：" + e.getMessage();
        }
    }

    /**
     * 追加导入指定路径的开奖数据Excel文件（不清空现有数据）
     * @param filePath 文件路径
     * @return 导入结果消息
     */
    public String appendLotteryDrawsByPath(String filePath) {
        try {
            File file = new File(filePath);
            if (!file.exists()) {
                return "文件不存在：" + filePath;
            }

            if (!filePath.toLowerCase().endsWith(".xlsx")) {
                return "请提供.xlsx格式的Excel文件路径";
            }

            // 执行开奖数据追加导入
            excelDataImporter.appendLotteryDrawsData(filePath);

            return "开奖数据追加导入成功";

        } catch (Exception e) {
            log.error("开奖数据追加导入失败：{}", e.getMessage(), e);
            return "开奖数据追加导入失败：" + e.getMessage();
        }
    }

    /**
     * 追加导入上传的开奖数据Excel文件（不清空现有数据）
     * @param file 上传的Excel文件
     * @return 导入结果消息
     */
    public String appendLotteryDrawsFile(MultipartFile file) {
        if (file.isEmpty()) {
            return "文件为空，请选择有效的Excel文件";
        }

        String originalFilename = file.getOriginalFilename();
        if (originalFilename == null || !originalFilename.toLowerCase().endsWith(".xlsx")) {
            return "请上传.xlsx格式的Excel文件";
        }

        try {
            // 创建临时文件
            File tempFile = File.createTempFile("lottery_append_", ".xlsx");
            file.transferTo(tempFile);

            // 执行开奖数据追加导入
            excelDataImporter.appendLotteryDrawsData(tempFile.getAbsolutePath());

            // 删除临时文件
            tempFile.delete();

            return "开奖数据追加导入成功";

        } catch (IOException e) {
            log.error("文件处理失败：{}", e.getMessage(), e);
            return "文件处理失败：" + e.getMessage();
        } catch (Exception e) {
            log.error("开奖数据追加导入失败：{}", e.getMessage(), e);
            return "开奖数据追加导入失败：" + e.getMessage();
        }
    }
} 