package com.kt.event.common.exception;

import lombok.Getter;
import lombok.RequiredArgsConstructor;

/**
 * 에러 코드 정의
 * 시스템 전체에서 사용하는 에러 코드와 메시지를 관리
 */
@Getter
@RequiredArgsConstructor
public enum ErrorCode {

    // 공통 에러 (COMMON_XXX)
    COMMON_001("COMMON_001", "잘못된 요청입니다"),
    COMMON_002("COMMON_002", "필수 파라미터가 누락되었습니다"),
    COMMON_003("COMMON_003", "유효성 검증에 실패했습니다"),
    COMMON_004("COMMON_004", "서버 내부 오류가 발생했습니다"),
    COMMON_005("COMMON_005", "지원하지 않는 작업입니다"),

    // 일반 에러 상수 (Legacy 호환용)
    NOT_FOUND("NOT_FOUND", "요청한 리소스를 찾을 수 없습니다"),
    INVALID_INPUT_VALUE("INVALID_INPUT_VALUE", "유효하지 않은 입력값입니다"),

    // 인증/인가 에러 (AUTH_XXX)
    AUTH_001("AUTH_001", "인증에 실패했습니다"),
    AUTH_002("AUTH_002", "유효하지 않은 토큰입니다"),
    AUTH_003("AUTH_003", "만료된 토큰입니다"),
    AUTH_004("AUTH_004", "권한이 없습니다"),
    AUTH_005("AUTH_005", "토큰이 제공되지 않았습니다"),

    // 사용자 에러 (USER_XXX)
    USER_001("USER_001", "이미 존재하는 사용자입니다"),
    USER_002("USER_002", "사업자번호 검증에 실패했습니다"),
    USER_003("USER_003", "사용자를 찾을 수 없습니다"),
    USER_004("USER_004", "비밀번호가 일치하지 않습니다"),
    USER_005("USER_005", "휴폐업 사업자번호입니다"),

    // 이벤트 에러 (EVENT_XXX)
    EVENT_001("EVENT_001", "이벤트를 찾을 수 없습니다"),
    EVENT_002("EVENT_002", "유효하지 않은 상태 전환입니다"),
    EVENT_003("EVENT_003", "필수 데이터가 누락되었습니다"),
    EVENT_004("EVENT_004", "이벤트 생성에 실패했습니다"),
    EVENT_005("EVENT_005", "이벤트 수정 권한이 없습니다"),

    // Job 에러 (JOB_XXX)
    JOB_001("JOB_001", "Job을 찾을 수 없습니다"),
    JOB_002("JOB_002", "Job 처리에 실패했습니다"),
    JOB_003("JOB_003", "Job이 아직 처리 중입니다"),
    JOB_004("JOB_004", "Job 타임아웃이 발생했습니다"),

    // AI 에러 (AI_XXX)
    AI_001("AI_001", "AI 추천 생성에 실패했습니다"),
    AI_002("AI_002", "트렌드 분석에 실패했습니다"),
    AI_003("AI_003", "AI API 호출에 실패했습니다"),
    AI_004("AI_004", "AI 추천 결과를 찾을 수 없습니다"),

    // 콘텐츠 에러 (CONTENT_XXX)
    CONTENT_001("CONTENT_001", "이미지 생성에 실패했습니다"),
    CONTENT_002("CONTENT_002", "이미지를 찾을 수 없습니다"),
    CONTENT_003("CONTENT_003", "CDN 업로드에 실패했습니다"),
    CONTENT_004("CONTENT_004", "콘텐츠를 찾을 수 없습니다"),

    // 배포 에러 (DIST_XXX)
    DIST_001("DIST_001", "배포에 실패했습니다"),
    DIST_002("DIST_002", "채널 연동에 실패했습니다"),
    DIST_003("DIST_003", "서킷 브레이커가 열려있습니다"),
    DIST_004("DIST_004", "배포 상태를 찾을 수 없습니다"),

    // 참여 에러 (PART_XXX)
    DUPLICATE_PARTICIPATION("PART_001", "이미 참여한 이벤트입니다"),
    EVENT_NOT_ACTIVE("PART_002", "이벤트 참여 기간이 아닙니다"),
    PARTICIPANT_NOT_FOUND("PART_003", "참여자를 찾을 수 없습니다"),
    DRAW_FAILED("PART_004", "당첨자 추첨에 실패했습니다"),
    EVENT_ENDED("PART_005", "이벤트가 종료되었습니다"),
    ALREADY_DRAWN("PART_006", "이미 당첨자 추첨이 완료되었습니다"),
    INSUFFICIENT_PARTICIPANTS("PART_007", "참여자 수가 당첨자 수보다 적습니다"),
    NO_WINNERS_YET("PART_008", "아직 당첨자 추첨이 진행되지 않았습니다"),

    // 분석 에러 (ANALYTICS_XXX)
    ANALYTICS_001("ANALYTICS_001", "분석 데이터를 찾을 수 없습니다"),
    ANALYTICS_002("ANALYTICS_002", "외부 API 호출에 실패했습니다"),
    ANALYTICS_003("ANALYTICS_003", "통계 계산에 실패했습니다"),

    // 외부 연동 에러 (EXTERNAL_XXX)
    EXTERNAL_001("EXTERNAL_001", "외부 API 호출에 실패했습니다"),
    EXTERNAL_002("EXTERNAL_002", "외부 API 타임아웃이 발생했습니다"),
    EXTERNAL_003("EXTERNAL_003", "외부 API 응답 형식이 올바르지 않습니다"),

    // 데이터베이스 에러 (DB_XXX)
    DB_001("DB_001", "데이터베이스 연결에 실패했습니다"),
    DB_002("DB_002", "데이터 저장에 실패했습니다"),
    DB_003("DB_003", "데이터 조회에 실패했습니다"),
    DB_004("DB_004", "데이터 삭제에 실패했습니다"),

    // Redis 에러 (REDIS_XXX)
    REDIS_001("REDIS_001", "Redis 연결에 실패했습니다"),
    REDIS_002("REDIS_002", "캐시 저장에 실패했습니다"),
    REDIS_003("REDIS_003", "캐시 조회에 실패했습니다"),

    // Kafka 에러 (KAFKA_XXX)
    KAFKA_001("KAFKA_001", "Kafka 메시지 발행에 실패했습니다"),
    KAFKA_002("KAFKA_002", "Kafka 메시지 소비에 실패했습니다"),
    KAFKA_003("KAFKA_003", "Kafka 연결에 실패했습니다");

    /**
     * 에러 코드
     */
    private final String code;

    /**
     * 에러 메시지
     */
    private final String message;
}
