package com.takensoft.common.message;

import lombok.AllArgsConstructor;
import lombok.Getter;
import org.springframework.http.HttpStatus;

/**
 * @author takensoft
 * @since 2025.01.22
 * @modification
 *     since    |    author    | description
 *  2025.01.22  |  takensoft   | 최초 등록
 *
 * 시스템에서 발생할 수 있는 코드 메시지들을 정의
 */
@AllArgsConstructor
@Getter
public enum MessageCode {
    // 공통
    COMMON_SUCCESS("common.success", HttpStatus.OK), // 처리 성공
    COMMON_UNKNOWN_ERROR("common.unknown", HttpStatus.INTERNAL_SERVER_ERROR), // 일반적인 오류 발생
    COMMON_BAD_REQUEST("common.bad_request", HttpStatus.BAD_REQUEST), // 잘못된 요청
    COMMON_NULL_POINT("common.null_point", HttpStatus.BAD_REQUEST), // NullPointer 발생
    COMMON_ILLEGAL_ARGUMENT("common.illegal_argument", HttpStatus.BAD_REQUEST), // IllegalArgument 발생
    COMMON_NOT_FOUND("common.not_found", HttpStatus.NOT_FOUND), // 정보가 존재 하지 않음
    COMMON_METHOD_NOT_ALLOWED("common.method_not_allowed", HttpStatus.METHOD_NOT_ALLOWED), // 지원하지 않는 HTTP 메서드
    COMMON_INSERT_FAIL("common.insert_fail", HttpStatus.INTERNAL_SERVER_ERROR), // 등록 실패 시
    COMMON_UPDATE_FAIL("common.update_fail", HttpStatus.INTERNAL_SERVER_ERROR), // 수정 실패 시
    COMMON_DELETE_FAIL("common.delete_fail", HttpStatus.INTERNAL_SERVER_ERROR), // 삭제 실패 시
    COMMON_PAYLOAD_TOO_LARGE("common.payload_too_large",HttpStatus.PAYLOAD_TOO_LARGE), //파일 용량 초과 시
    COMMON_DUPLICATION_CODE("common.duplication_code",HttpStatus.INTERNAL_SERVER_ERROR), //중복 코드
    COMMON_DUPLICATION_DATA("common.duplication_data",HttpStatus.INTERNAL_SERVER_ERROR), //중복 데이터

    //네트워크 관련
    NETWORK_UNKNOWN_HOST("network.unknown_host", HttpStatus.BAD_REQUEST), // 알 수 없는 호스트
    
    // SQL 관련
    SQL_NULL_VALUE("sql.null_value", HttpStatus.BAD_REQUEST), // Null 값 위반
    SQL_DUPLICATE_KEY("sql.duplicate_key", HttpStatus.CONFLICT), // 중복 키 위반
    SQL_DATA_INTEGRITY("sql.data_integrity", HttpStatus.BAD_REQUEST), // 데이터 무결성 위반
    SQL_UNKNOWN("sql.unknown", HttpStatus.INTERNAL_SERVER_ERROR), // 알 수 없는 SQL 에러

    // jwt 관련
    JWT_EXPIRED("jwt.expired", HttpStatus.UNAUTHORIZED), // JWT 토큰 만료
    JWT_SIGNATURE_INVALID("jwt.signature_invalid", HttpStatus.UNAUTHORIZED), // JWT 서명 오류
    JWT_INSUFFICIENT_AUTHENTICATION("jwt.insufficient_authentication", HttpStatus.FORBIDDEN), // 인증 정보 부족

    // 접근 관련
    ACCESS_DENIED("access.denied", HttpStatus.FORBIDDEN), // 권한 없음
    UNAUTHORIZED_ACCESS("access.unauthorized", HttpStatus.UNAUTHORIZED), // 잘못된 접근

    // 사용자 관련
    SIGNUP_SUCCESS("user.signup.success", HttpStatus.OK),    // 회원가입 성공
    SIGNUP_ID_TAKEN("user.signup.id_taken", HttpStatus.CONFLICT),   // 아이디 중복
    SIGNUP_EMAIL_TAKEN("user.signup.email_taken", HttpStatus.CONFLICT), // 이메일 중복
    LOGIN_USER_NOT_FOUND("user.login.user_not_found", HttpStatus.NOT_FOUND), // 사용자가 존재 하지 않는 경우
    LOGIN_INVALID_CREDENTIALS("user.login.invalid_credentials", HttpStatus.UNAUTHORIZED), // 비밀번호 불일치
    LOGIN_AUTHENTICATION_REQUIRED("user.login.authentication_required", HttpStatus.FORBIDDEN), // 인증 거부
    LOGIN_ACCOUNT_LOCKED("user.login.account_locked", HttpStatus.LOCKED), // 계정 잠김 상태
    LOGIN_ACCOUNT_DISABLED("user.login.account_disabled", HttpStatus.FORBIDDEN), // 계정 비활성화
    LOGIN_ACCOUNT_EXPIRED("user.login.account_expired", HttpStatus.FORBIDDEN), // 계정 만료
    LOGIN_CREDENTIALS_EXPIRED("user.login.credentials_expired", HttpStatus.FORBIDDEN), // 비밀번호 유효기간 만료
    LOGOUT_SUCCESS("user.logout.success", HttpStatus.OK), // 로그아웃 성공

    // 파일 관련
    FILE_UPLOAD_FAIL("file.upload_fail", HttpStatus.INTERNAL_SERVER_ERROR); // 파일 업로드 실패

    private final String messageKey;   //  메시지
    private final HttpStatus status;    // HTTP 상태
}