package com.kt.event.participation.exception;

import com.kt.event.common.exception.BusinessException;
import com.kt.event.common.exception.ErrorCode;

/**
 * 참여 관련 비즈니스 예외
 *
 * @author Digital Garage Team
 * @since 2025-01-24
 */
public class ParticipationException extends BusinessException {

    public ParticipationException(ErrorCode errorCode) {
        super(errorCode);
    }

    public ParticipationException(ErrorCode errorCode, String message) {
        super(errorCode, message);
    }

    /**
     * 중복 참여 예외
     */
    public static class DuplicateParticipationException extends ParticipationException {
        public DuplicateParticipationException() {
            super(ErrorCode.DUPLICATE_PARTICIPATION, "이미 참여하신 이벤트입니다");
        }
    }

    /**
     * 이벤트를 찾을 수 없음 예외
     */
    public static class EventNotFoundException extends ParticipationException {
        public EventNotFoundException() {
            super(ErrorCode.EVENT_001, "이벤트를 찾을 수 없습니다");
        }
    }

    /**
     * 이벤트가 활성 상태가 아님 예외
     */
    public static class EventNotActiveException extends ParticipationException {
        public EventNotActiveException() {
            super(ErrorCode.EVENT_NOT_ACTIVE, "현재 참여할 수 없는 이벤트입니다");
        }
    }

    /**
     * 참여자를 찾을 수 없음 예외
     */
    public static class ParticipantNotFoundException extends ParticipationException {
        public ParticipantNotFoundException() {
            super(ErrorCode.PARTICIPANT_NOT_FOUND, "참여자를 찾을 수 없습니다");
        }
    }

    /**
     * 이미 추첨이 완료됨 예외
     */
    public static class AlreadyDrawnException extends ParticipationException {
        public AlreadyDrawnException() {
            super(ErrorCode.ALREADY_DRAWN, "이미 당첨자 추첨이 완료되었습니다");
        }
    }

    /**
     * 참여자 수 부족 예외
     */
    public static class InsufficientParticipantsException extends ParticipationException {
        public InsufficientParticipantsException(long participantCount, int winnerCount) {
            super(ErrorCode.INSUFFICIENT_PARTICIPANTS,
                String.format("참여자 수(%d)가 당첨자 수(%d)보다 적습니다", participantCount, winnerCount));
        }
    }

    /**
     * 당첨자가 없음 예외
     */
    public static class NoWinnersYetException extends ParticipationException {
        public NoWinnersYetException() {
            super(ErrorCode.NO_WINNERS_YET, "아직 당첨자 추첨이 진행되지 않았습니다");
        }
    }
}
