package com.lingyue.parse.util;

import lombok.Getter;

/**
 * 错误分类枚举
 * 用于错误处理和重试策略
 * 
 * @author lingyue
 * @since 2026-01-14
 */
@Getter
public enum ErrorCategory {
    
    /**
     * 网络错误（可重试）
     */
    NETWORK_ERROR("网络错误", true, 3),
    
    /**
     * 服务不可用（可重试）
     */
    SERVICE_UNAVAILABLE("服务不可用", true, 3),
    
    /**
     * 超时错误（可重试）
     */
    TIMEOUT_ERROR("超时错误", true, 2),
    
    /**
     * 文件错误（不可重试）
     */
    FILE_ERROR("文件错误", false, 0),
    
    /**
     * 格式错误（不可重试）
     */
    FORMAT_ERROR("格式错误", false, 0),
    
    /**
     * 权限错误（不可重试）
     */
    PERMISSION_ERROR("权限错误", false, 0),
    
    /**
     * 未知错误（可重试，但次数较少）
     */
    UNKNOWN_ERROR("未知错误", true, 1);
    
    private final String description;
    private final boolean retryable;
    private final int maxRetries;
    
    ErrorCategory(String description, boolean retryable, int maxRetries) {
        this.description = description;
        this.retryable = retryable;
        this.maxRetries = maxRetries;
    }
    
    /**
     * 根据异常类型判断错误分类
     */
    public static ErrorCategory categorize(Exception e) {
        if (e == null) {
            return UNKNOWN_ERROR;
        }
        
        String message = e.getMessage() != null ? e.getMessage().toLowerCase() : "";
        String className = e.getClass().getName();
        
        // 网络相关错误
        if (className.contains("ConnectException") || 
            className.contains("SocketException") ||
            className.contains("UnknownHostException") ||
            message.contains("connection") || 
            message.contains("network")) {
            return NETWORK_ERROR;
        }
        
        // 超时错误
        if (className.contains("TimeoutException") || 
            className.contains("SocketTimeoutException") ||
            message.contains("timeout") ||
            message.contains("timed out")) {
            return TIMEOUT_ERROR;
        }
        
        // 服务不可用
        if (className.contains("ServiceUnavailableException") ||
            message.contains("503") ||
            message.contains("service unavailable")) {
            return SERVICE_UNAVAILABLE;
        }
        
        // 文件相关错误
        if (className.contains("FileNotFoundException") ||
            className.contains("IOException") ||
            message.contains("file") ||
            message.contains("not found")) {
            return FILE_ERROR;
        }
        
        // 格式错误
        if (className.contains("ParseException") ||
            message.contains("format") ||
            message.contains("parse")) {
            return FORMAT_ERROR;
        }
        
        // 权限错误
        if (className.contains("AccessDeniedException") ||
            className.contains("SecurityException") ||
            message.contains("permission") ||
            message.contains("access denied")) {
            return PERMISSION_ERROR;
        }
        
        return UNKNOWN_ERROR;
    }
}
