package com.ghy.order.utils;

import java.util.HashMap;
import java.util.Map;
import java.util.regex.Pattern;

/**
 * 物流查询工具类
 *
 * @author clunt
 */
public class LogisticsUtils {
    
    /**
     * 快递公司编码映射（快递鸟格式）
     */
    private static final Map<String, String> EXPRESS_COMPANY_MAP = new HashMap<>();
    
    static {
        // 顺丰速运
        EXPRESS_COMPANY_MAP.put("SF", "SF");
        EXPRESS_COMPANY_MAP.put("顺丰", "SF");
        EXPRESS_COMPANY_MAP.put("顺丰速运", "SF");
        
        // 圆通速递
        EXPRESS_COMPANY_MAP.put("YTO", "YTO");
        EXPRESS_COMPANY_MAP.put("圆通", "YTO");
        EXPRESS_COMPANY_MAP.put("圆通速递", "YTO");
        
        // 中通快递
        EXPRESS_COMPANY_MAP.put("ZTO", "ZTO");
        EXPRESS_COMPANY_MAP.put("中通", "ZTO");
        EXPRESS_COMPANY_MAP.put("中通快递", "ZTO");
        
        // 申通快递
        EXPRESS_COMPANY_MAP.put("STO", "STO");
        EXPRESS_COMPANY_MAP.put("申通", "STO");
        EXPRESS_COMPANY_MAP.put("申通快递", "STO");
        
        // 韵达速递
        EXPRESS_COMPANY_MAP.put("YD", "YD");
        EXPRESS_COMPANY_MAP.put("韵达", "YD");
        EXPRESS_COMPANY_MAP.put("韵达速递", "YD");
        
        // 百世快递
        EXPRESS_COMPANY_MAP.put("HTKY", "HTKY");
        EXPRESS_COMPANY_MAP.put("百世", "HTKY");
        EXPRESS_COMPANY_MAP.put("百世快递", "HTKY");
        
        // 德邦快递
        EXPRESS_COMPANY_MAP.put("DBL", "DBL");
        EXPRESS_COMPANY_MAP.put("德邦", "DBL");
        EXPRESS_COMPANY_MAP.put("德邦快递", "DBL");
        
        // 京东物流
        EXPRESS_COMPANY_MAP.put("JD", "JD");
        EXPRESS_COMPANY_MAP.put("京东", "JD");
        EXPRESS_COMPANY_MAP.put("京东物流", "JD");
        
        // EMS
        EXPRESS_COMPANY_MAP.put("EMS", "EMS");
        EXPRESS_COMPANY_MAP.put("中国邮政", "EMS");
        EXPRESS_COMPANY_MAP.put("邮政", "EMS");
        
        // 天天快递
        EXPRESS_COMPANY_MAP.put("TTKDEX", "TTKDEX");
        EXPRESS_COMPANY_MAP.put("天天", "TTKDEX");
        EXPRESS_COMPANY_MAP.put("天天快递", "TTKDEX");
        
        // 优速快递
        EXPRESS_COMPANY_MAP.put("UC", "UC");
        EXPRESS_COMPANY_MAP.put("优速", "UC");
        EXPRESS_COMPANY_MAP.put("优速快递", "UC");
        
        // 全峰快递
        EXPRESS_COMPANY_MAP.put("QFKD", "QFKD");
        EXPRESS_COMPANY_MAP.put("全峰", "QFKD");
        EXPRESS_COMPANY_MAP.put("全峰快递", "QFKD");
    }
    
    /**
     * 根据快递单号识别快递公司（快递鸟格式）
     *
     * @param trackingNumber 快递单号
     * @return 快递公司编码
     */
    public static String identifyExpressCompany(String trackingNumber) {
        if (trackingNumber == null || trackingNumber.trim().isEmpty()) {
            return null;
        }
        
        String number = trackingNumber.trim().toUpperCase();
        
        // 顺丰速运：以SF开头，13位数字
        if (Pattern.matches("^SF\\d{13}$", number)) {
            return "SF";
        }
        
        // 圆通速递：以YT开头，10位数字
        if (Pattern.matches("^YT\\d{10}$", number)) {
            return "YTO";
        }
        
        // 中通快递：以ZTO开头，10位数字
        if (Pattern.matches("^ZTO\\d{10}$", number)) {
            return "ZTO";
        }
        
        // 申通快递：以STO开头，10位数字
        if (Pattern.matches("^STO\\d{10}$", number)) {
            return "STO";
        }
        
        // 韵达速递：以YD开头，10位数字
        if (Pattern.matches("^YD\\d{10}$", number)) {
            return "YD";
        }
        
        // 百世快递：以HTKY开头，10位数字
        if (Pattern.matches("^HTKY\\d{10}$", number)) {
            return "HTKY";
        }
        
        // 德邦快递：以DBL开头，10位数字
        if (Pattern.matches("^DBL\\d{10}$", number)) {
            return "DBL";
        }
        
        // 京东物流：以JD开头，10位数字
        if (Pattern.matches("^JD\\d{13}$", number)) {
            return "JD";
        }
        
        // EMS：以EMS开头，13位数字
        if (Pattern.matches("^EMS\\d{13}$", number)) {
            return "EMS";
        }
        
        // 天天快递：以TT开头，10位数字
        if (Pattern.matches("^TT\\d{10}$", number)) {
            return "TTKDEX";
        }
        
        // 优速快递：以UC开头，10位数字
        if (Pattern.matches("^UC\\d{10}$", number)) {
            return "UC";
        }
        
        // 纯数字单号，可能是其他快递公司
        if (Pattern.matches("^\\d{10,15}$", number)) {
            // 这里可以根据数字规则进一步识别，暂时返回null让API自动识别
            return null;
        }
        
        return null;
    }
    
    /**
     * 根据快递公司名称获取编码（快递鸟格式）
     *
     * @param companyName 快递公司名称
     * @return 快递公司编码
     */
    public static String getExpressCode(String companyName) {
        if (companyName == null || companyName.trim().isEmpty()) {
            return null;
        }
        
        return EXPRESS_COMPANY_MAP.get(companyName.trim());
    }
    
    /**
     * 验证快递单号格式
     *
     * @param trackingNumber 快递单号
     * @return 是否有效
     */
    public static boolean isValidTrackingNumber(String trackingNumber) {
        if (trackingNumber == null || trackingNumber.trim().isEmpty()) {
            return false;
        }
        
        String number = trackingNumber.trim();
        
        // 基本格式验证：长度在10-20位之间，包含字母和数字
        return Pattern.matches("^[A-Za-z0-9]{10,20}$", number);
    }
} 