package com.fs.crm.utils;

import com.fs.crm.vo.CrmOrderInfoVo;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 订单信息提取工具类（适配字段间隔不确定 + Java 8日期转换）
 */
public class CidUserOrderExtractor {
    // 优化后的正则：加入\\s*匹配任意空白间隔，忽略字段间不确定的空格/换行
    private static final String ORDER_REGEX =
            "(.*?)\\s*-\\s*(.+?)\\s*（.*?）\\s*日期\\s*(\\d{4}-\\d{2}-\\d{2}\\s*\\d{2}:\\d{2}:\\d{2})\\s*" +
                    "订单号\\s*(\\d+)\\s*商品\\s*(.+?)\\s*规格\\s*(.+?)\\s*物流\\s*(.+?)\\s*" +
                    "数量（件）\\s*(\\d+)\\s*实付金额\\s*(\\d+(\\.\\d+)?)";

    private static final Pattern ORDER_PATTERN = Pattern.compile(ORDER_REGEX);

    // Java 8 日期格式化器（线程安全，可全局复用，对应订单日期格式：yyyy-MM-dd HH:mm:ss）
    private static final DateTimeFormatter DATE_TIME_FORMATTER =
            DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

    /**
     * 提取单个订单文本的信息（适配间隔不确定）
     * @param orderText 原始订单文本（允许字段间有任意空白/换行）
     * @return 封装后的OrderInfo对象
     */
    public static CrmOrderInfoVo extractSingleOrder(String orderText) {
        if (orderText == null || orderText.trim().isEmpty()) {
            return null;
        }

        // 预处理：将多个连续空白替换为单个空格（可选，进一步提高匹配稳定性）
        String standardizedText = orderText.replaceAll("\\s+", " ");
        Matcher matcher = ORDER_PATTERN.matcher(standardizedText);
        CrmOrderInfoVo orderInfo = new CrmOrderInfoVo();

        if (matcher.find()) {
            try {
                // 1. 提取各分组字段（忽略间隔，正则已适配）
                String platform = matcher.group(1).trim();
                String shop = matcher.group(2).trim();
                String dateStr = matcher.group(3).trim();
                String orderNo = matcher.group(4).trim();
                String productName = matcher.group(5).trim();
                String specification = matcher.group(6).trim();
                String logistics = matcher.group(7).trim();
                String quantityStr = matcher.group(8).trim();
                String payAmountStr = matcher.group(9).trim();

                // 2. Java 8 日期转换：字符串 → LocalDateTime（核心步骤）
                LocalDateTime buyDate = parseDateToLocalDateTime(dateStr);

                // 3. 其他字段类型转换
                Integer quantity = Integer.parseInt(quantityStr);
                BigDecimal payAmount = new BigDecimal(payAmountStr);

                // 4. 封装到实体类
                orderInfo.setPlatform(platform);
                orderInfo.setShop(shop);
                orderInfo.setBuyDate(buyDate);
                orderInfo.setOrderNo(orderNo);
                orderInfo.setProductName(productName);
                orderInfo.setSpecification(specification);
                orderInfo.setQuantity(quantity);
                orderInfo.setLogistics(logistics);
                orderInfo.setPayAmount(payAmount);

            } catch (NumberFormatException | DateTimeParseException e) {
                System.err.println("字段类型转换失败：" + e.getMessage());
            }
        }

        return orderInfo;
    }

    /**
     * Java 8 日期字符串转换为LocalDateTime（单独抽取，便于复用和异常处理）
     * @param dateStr 日期字符串（格式：yyyy-MM-dd HH:mm:ss，允许中间有多个空格）
     * @return LocalDateTime对象，转换失败返回null
     */
    private static LocalDateTime parseDateToLocalDateTime(String dateStr) {
        if (dateStr == null || dateStr.trim().isEmpty()) {
            return null;
        }

        try {
            // 标准化日期字符串：将中间的多个空格替换为单个空格（确保格式匹配）
            String standardDateStr = dateStr.replaceAll("\\s+", " ");
            // Java 8 核心转换方法：parse(String, DateTimeFormatter)
            return LocalDateTime.parse(standardDateStr, DATE_TIME_FORMATTER);
        } catch (DateTimeParseException e) {
            System.err.println("日期转换失败，格式不匹配（要求：yyyy-MM-dd HH:mm:ss）：" + e.getMessage());
            return null;
        }
    }

    /**
     * Java 8 LocalDateTime转换为自定义格式字符串（扩展方法，便于展示/存储）
     * @param localDateTime 待转换的LocalDateTime对象
     * @param pattern 自定义日期格式（如：yyyy/MM/dd HH:mm）
     * @return 格式化后的日期字符串
     */
    public static String formatLocalDateTime(LocalDateTime localDateTime, String pattern) {
        if (localDateTime == null || pattern == null || pattern.trim().isEmpty()) {
            return null;
        }

        DateTimeFormatter customFormatter = DateTimeFormatter.ofPattern(pattern);
        return localDateTime.format(customFormatter);
    }
}