package com.ga.common.exception;

import lombok.Getter;
import lombok.RequiredArgsConstructor;

/**
 * 시스템 표준 에러 코드.
 * - 0xxx: 성공
 * - Exxx: 공통 에러
 * - Axxx: 인증/권한
 * - Bxxx: 업무 에러
 * - Cxxx: 외부 연동
 */
@Getter
@RequiredArgsConstructor
public enum ErrorCode {

    SUCCESS         ("0000", 200, "성공"),

    // 공통
    BAD_REQUEST     ("E400", 400, "잘못된 요청입니다"),
    UNAUTHORIZED    ("E401", 401, "인증이 필요합니다"),
    FORBIDDEN       ("E403", 403, "권한이 없습니다"),
    NOT_FOUND       ("E404", 404, "데이터를 찾을 수 없습니다"),
    METHOD_NOT_ALLOWED("E405", 405, "허용되지 않는 요청 방식입니다"),
    INTERNAL_ERROR  ("E500", 500, "서버 오류가 발생했습니다"),

    VALIDATION_FAIL ("E410", 400, "입력값 검증에 실패했습니다"),
    INVALID_PARAMETER("E411", 400, "파라미터가 올바르지 않습니다"),

    // 인증
    TOKEN_EXPIRED   ("A001", 401, "토큰이 만료되었습니다"),
    TOKEN_INVALID   ("A002", 401, "유효하지 않은 토큰입니다"),
    LOGIN_FAIL      ("A003", 401, "아이디 또는 비밀번호가 올바르지 않습니다"),
    ACCOUNT_LOCKED  ("A004", 403, "계정이 잠겨있습니다"),
    ACCOUNT_RETIRED ("A005", 403, "퇴사한 계정입니다"),
    PASSWORD_EXPIRED("A006", 403, "비밀번호가 만료되었습니다"),
    PASSWORD_POLICY ("A007", 400, "비밀번호 정책에 맞지 않습니다"),

    // 업무
    ALREADY_CONFIRMED   ("B001", 400, "이미 확정된 정산입니다"),
    RULE_VERSION_CONFLICT("B002", 409, "규정 버전이 변경되었습니다. 다시 시도해주세요"),
    APPROVAL_REQUIRED   ("B003", 400, "승인이 필요합니다"),
    INVALID_STATUS      ("B004", 400, "상태가 올바르지 않습니다"),
    INVALID_PERIOD      ("B005", 400, "기간이 올바르지 않습니다"),
    NOT_PERMITTED       ("B006", 403, "해당 작업이 허용되지 않습니다"),
    DEPENDENT_DATA      ("B007", 409, "참조 중인 데이터가 있습니다"),
    SYSTEM_CODE_LOCKED  ("B008", 400, "시스템 공통코드는 수정할 수 없습니다"),
    DUPLICATE_DATA      ("B009", 409, "중복된 데이터입니다"),
    BATCH_RUNNING       ("B010", 409, "배치가 실행 중입니다"),
    INSUFFICIENT_BALANCE("B011", 400, "잔액이 부족합니다"),

    // 파일/엑셀
    FILE_NOT_FOUND      ("F001", 404, "파일을 찾을 수 없습니다"),
    FILE_UPLOAD_FAIL    ("F002", 500, "파일 업로드에 실패했습니다"),
    FILE_TYPE_NOT_ALLOWED("F003",400, "허용되지 않는 파일 형식입니다"),
    FILE_TOO_LARGE      ("F004", 400, "파일 크기가 제한을 초과했습니다"),
    EXCEL_PARSE_FAIL    ("F005", 400, "엑셀 파싱에 실패했습니다"),

    // 외부 연동
    EXTERNAL_API_FAIL   ("C001", 502, "외부 시스템 호출에 실패했습니다");

    private final String code;
    private final int httpStatus;
    private final String message;
}
