package com.now_here5.now_here.global.response;

import lombok.AllArgsConstructor;
import lombok.Getter;

/*
 * Response Convention
 * - 도메인 별로 나누어 관리
 * - [동사_목적어_SUCCESS] 형태로 생성
 * - 코드는 도메인명 앞에서부터 1~2글자로 사용
 * - 메시지는 "~니다."로 마무리
 */

/*
 * Business Response Code
 * A  : Authentication or Authorization
 * M  : Member
 * S  : Sign-up
 * E  : Event
 * L  : Love
 * I  : Interaction

 */

@Getter
@AllArgsConstructor
public enum ResponseCode {

    // example
    EXAMPLE_SUCCESS(200, "U001", "응답에 성공했습니다.."),

    // Authentication - 'A'uthentication
    AUTHENTICATION_FAIL(401, "A002", "사용자 인증에 실패했습니다."),
    AUTHORIZATION_FAIL(403, "A002", "사용자 권한이 없습니다."),

    // nickname
    NICKNAME_DUPLICATED(200, "A001", "중복된 닉네임입니다."),
    NICKNAME_QUALIFIED(200, "A001", "사용 가능한 닉네임입니다."),
    
    // Phone Verify
    PHONE_DUPLICATED(200, "A003", "현재 이벤트로 이미 가입된 번호입니다."),
    PHONE_VERIFY_REQUEST(200, "A003", "휴대폰 인증을 요청했습니다."),
    PHONE_VERIFY_SUCCESS(200, "A003", "휴대폰 인증에 성공했습니다."),
    PHONE_VERIFY_FAIL(400, "A003", "휴대폰 인증에 실패했습니다."),
    PHONE_QUALIFIED(200, "A004", "사용 가능한 번호입니다."),

    // Member - 'M'ember
    LOGIN_SUCCESS(200, "M001", "로그인에 성공했습니다."),
    LOGIN_FAIL(200, "M001", "로그인에 실패했습니다."),
    LOGOUT_SUCCESS(200, "M002", "로그아웃에 성공했습니다."),
    LOGOUT_FAIL(200, "M002", "로그아웃에 실패했습니다."),
    DEACTIVATE_SUCCESS(200, "M003", "회원탈퇴에 성공했습니다."),
    DEACTIVATE_FAIL(400, "M003", "회원탈퇴에 실패했습니다."),
    MEMBER_RECOMMEND_SUCCESS(200, "M004", "회원 추천에 성공했습니다."),
    MEMBER_RECOMMEND_FAIL(400, "M004", "회원 추천에 실패했습니다."),
    PROFILE_QUERY_SUCCESS(200, "M005", "프로필 조회에 성공했습니다."),
    PROFILE_QUERY_FAIL(400, "M005", "프로필 조회에 실패했습니다."),
    PERSONAL_INFO_QUERY_SUCCESS(200, "M006", "개인정보 조회에 성공했습니다."),
    PERSONAL_INFO_QUERY_FAIL(400, "M006", "개인정보 조회에 실패했습니다."),
    DESCRIPTION_UPDATE_SUCCESS(200, "M007", "자기소개 수정에 성공했습니다."),
    DESCRIPTION_UPDATE_FAIL(400, "M007", "자기소개 수정에 실패했습니다."),
    NICKNAME_UPDATE_SUCCESS(200, "M008", "닉네임 수정에 성공했습니다."),
    NICKNAME_UPDATE_FAIL(400, "M008", "닉네임 수정에 실패했습니다."),
    MBTI_UPDATE_SUCCESS(200, "M009", "MBTI 수정에 성공했습니다."),
    MBTI_UPDATE_FAIL(400, "M009", "MBTI 수정에 실패했습니다."),
    TOGGLE_NOTIFICATION_SUCCESS(200, "M010", "알림 설정 변경에 성공했습니다."),
    TOGGLE_NOTIFICATION_FAIL(400, "M010", "알림 설정 변경에 실패했습니다."),
    NOTIFICATION_READ_SUCCESS(200, "M012", "알림 읽음 처리에 성공했습니다."),
    NOTIFICATION_READ_FAIL(400, "M012", "알림 읽음 처리에 실패했습니다."),
    BIRTHDAY_UPDATE_SUCCESS(200, "M013", "생일 수정에 성공했습니다."),
    BIRTHDAY_UPDATE_FAIL(400, "M013", "생일 수정에 실패했습니다."),

    // Sign-up - 'S'ign-up
    SIGNUP_SUCCESS(200, "S001", "회원가입에 성공했습니다."),
    SIGNUP_FAIL(400, "S001", "회원가입에 실패했습니다."),
    SIGNUP_DUPLICATED(400, "S002", "이미 가입된 회원입니다."),

 
    // development - only
    PHONE_GET_SUCCESS(200, "A001-D", "개발용 인증 번호 조회에 성공했습니다."),
    PHONE_GET_FAIL(400, "A001-D", "개발용 인증 번호 조회에 실패했습니다."),

    // Event - 'E'vent
    EVENTLIST_QUERY_SUCCESS(200, "E001", "이벤트 목록 조회에 성공했습니다."),
    EVENTLIST_QUERY_FAIL(400, "E001", "이벤트 목록 조회에 실패했습니다."),
    EVENT_QUERY_SUCCESS(200, "E002", "이벤트 조회에 성공했습니다."),
    EVENT_QUERY_FAIL(400, "E002", "이벤트 조회에 실패했습니다."),
    EVENT_TIME_SUCCESS(200, "E003", "이벤트 시간 조회에 성공했습니다."),
    EVENT_TIME_FAIL(400, "E003", "이벤트 시간 조회에 실패했습니다."),
    MY_EVENTS_QUERY_SUCCESS(200, "E004", "내 이벤트 목록 조회에 성공했습니다."),
    MY_EVENTS_QUERY_FAIL(400, "E004", "내 이벤트 목록 조회에 실패했습니다."),
    MEMBER_REACTIVATE_SUCCESS(200, "E005", "회원 재활성화에 성공했습니다."),
    MEMBER_REACTIVATE_FAIL(400, "E005", "회원 재활성화에 실패했습니다."),
    
    //admin 
    EVENT_CLOSE_SUCCESS(200, "E005", "이벤트 종료에 성공했습니다."),
    EVENT_CLOSE_FAIL(400, "E005", "이벤트 종료에 실패했습니다."),
    EVENT_OPEN_SUCCESS(200, "E006", "이벤트 생성에 성공했습니다."),
    EVENT_OPEN_FAIL(400, "E006", "이벤트 생성에 실패했습니다."),
    EVENT_ADD_LOCATION_SUCCESS(200, "E007", "이벤트 장소 추가에 성공했습니다."),
    EVENT_ADD_LOCATION_FAIL(400, "E007", "이벤트 장소 추가에 실패했습니다."),
    EVENT_DELETE_LOCATION_SUCCESS(200, "E008", "이벤트 장소 삭제에 성공했습니다."),
    EVENT_DELETE_LOCATION_FAIL(400, "E008", "이벤트 장소 삭제에 실패했습니다."),
    EVENT_DELETE_SUCCESS(200, "E009", "이벤트 삭제에 성공했습니다."),
    EVENT_DELETE_FAIL(400, "E009", "이벤트 삭제에 실패했습니다."),

    LOCATION_CREATE_SUCCESS(200, "E10", "장소 생성에 성공했습니다."),
    LOCATION_CREATE_FAIL(400, "E10", "장소 생성에 실패했습니다."),
    LOCATION_DELETE_SUCCESS(200, "E11", "장소 삭제에 성공했습니다."),
    LOCATION_DELETE_FAIL(400, "E11", "장소 삭제에 실패했습니다."),
    LOCATION_QUERY_SUCCESS(200, "E12", "장소 조회에 성공했습니다."),
    LOCATION_QUERY_FAIL(400, "E12", "장소 조회에 실패했습니다."),
    LOCATION_LIST_QUERY_SUCCESS(200, "E13", "장소 목록 조회에 성공했습니다."),
    LOCATION_LIST_QUERY_FAIL(400, "E13", "장소 목록 조회에 실패했습니다."),
    EVENTSCHEDULER_QUERY_SUCCESS(200, "E14", "이벤트 스케줄러 조회에 성공했습니다."),
    EVENTSCHEDULER_QUERY_FAIL(400, "E14", "이벤트 스케줄러 조회에 실패했습니다."),
    EVENT_UPDATE_SUCCESS(200, "E15", "이벤트 업데이트에 성공했습니다."),
    EVENT_UPDATE_FAIL(400, "E15", "이벤트 업데이트에 실패했습니다."),
    EVENT_QUERY_BY_TOKEN_SUCCESS(200, "E16", "이벤트 토큰으로 조회에 성공했습니다."),
    EVENT_QUERY_BY_TOKEN_FAIL(400, "E16", "이벤트 토큰으로 조회에 실패했습니다."),

    // Matching - 'L'ove
    BANNER_LIST_QUERY_SUCCESS(200, "L001", "배너 목록 조회에 성공했습니다."),
    BANNER_LIST_QUERY_FAIL(400, "L001", "배너 목록 조회에 실패했습니다."),
    LOVE_SEND_SUCCESS(200, "L002", "하트 전송에 성공했습니다."),
    LOVE_SEND_FAIL(400, "L002", "하트 전송에 실패했습니다."),
    LOVE_RECEIVE_SUCCESS(200, "L003", "하트 수신에 성공했습니다."),
    LOVE_RECEIVE_FAIL(400, "L003", "하트 수신에 실패했습니다."),
    LOVE_REJECT_SUCCESS(200, "L004", "하트 거절에 성공했습니다."),
    LOVE_REJECT_FAIL(400, "L004", "하트 거절에 실패했습니다."),
    SUMMARY_GET_SUCCESS(200, "L005", "매칭 현황 조회에 성공했습니다."),
    SUMMARY_GET_FAIL(400, "L005", "매칭 현황 조회에 실패했습니다."),
    SENDER_LIST_QUERY_SUCCESS(200, "L006", "받은 하트 페이지 조회에 성공했습니다."),
    SENDER_LIST_QUERY_FAIL(400, "L006", "받은 하트 페이지 조회에 실패했습니다."),
    RECEIVER_LIST_QUERY_SUCCESS(200, "L007", "보낸 하트 페이지 조회에 성공했습니다."),
    RECEIVER_LIST_QUERY_FAIL(400, "L007", "보낸 하트 페이지 조회에 실패했습니다."),
    SUMMARY_DETAIL_GET_SUCCESS(200, "L008", "매칭 현황 페이지 조회에 성공했습니다."),
    SUMMARY_DETAIL_GET_FAIL(400, "L008", "매칭 현황 페이지 조회에 실패했습니다."),
    NOTIFICATION_LIST_QUERY_SUCCESS(200, "L009", "알림 목록 조회에 성공했습니다."),
    NOTIFICATION_LIST_QUERY_FAIL(400, "L009", "알림 목록 조회에 실패했습니다."),
    NOTIFICATION_COUNT_QUERY_SUCCESS(200, "L010", "알림 개수 조회에 성공했습니다."),
    NOTIFICATION_COUNT_QUERY_FAIL(400, "L010", "알림 개수 조회에 실패했습니다."),
    SPECIAL_HEART_COUNT_QUERY_SUCCESS(200, "L011", "특별하트 개수 조회에 성공했습니다."),
    SPECIAL_HEART_COUNT_QUERY_FAIL(400, "L011", "특별하트 개수 조회에 실패했습니다."),
    
    // Interaction - 'I'nteraction
    FEEDBACK_CREATE_SUCCESS(200, "I001", "FEEDBACK 생성에 성공했습니다."),
    FEEDBACK_CREATE_FAIL(400, "I001", "FEEDBACK 생성에 실패했습니다."),
    INQUIRY_CREATE_SUCCESS(200, "I002", "INQUIRY 생성에 성공했습니다."),
    INQUIRY_CREATE_FAIL(400, "I002", "INQUIRY 생성에 실패했습니다."),
    WITHDRAWAL_REASON_CREATE_SUCCESS(200, "I003", "WITHDRAWAL_REASON 생성에 성공했습니다."),
    WITHDRAWAL_REASON_CREATE_FAIL(400, "I003", "WITHDRAWAL_REASON 생성에 실패했습니다."),
    FEEDBACK_QUERY_SUCCESS(200, "I004", "FEEDBACK 조회에 성공했습니다."),
    FEEDBACK_QUERY_FAIL(400, "I004", "FEEDBACK 조회에 실패했습니다."),
    INQUIRY_QUERY_SUCCESS(200, "I005", "INQUIRY 조회에 성공했습니다."),
    INQUIRY_QUERY_FAIL(400, "I005", "INQUIRY 조회에 실패했습니다."),
    WITHDRAWAL_REASON_QUERY_SUCCESS(200, "I006", "WITHDRAWAL_REASON 조회에 성공했습니다."),
    WITHDRAWAL_REASON_QUERY_FAIL(400, "I006", "WITHDRAWAL_REASON 조회에 실패했습니다."),
    FEEDBACK_STATUS_FAIL(400, "I007", "피드백 상태 조회에 실패했습니다."),
    FEEDBACK_STATUS_SUCCESS(200, "I007", "피드백 상태 조회에 성공했습니다.");

    // field
    private final int status;
    private final String code;
    private final String message;
}