package com.pandoli365.bibimbap.security;

/**
 * Unity WebGL zip 업로드의 보안/포맷 검증 실패를 표현하는 unchecked 예외.
 *
 * <p>거부 사유는 {@link Reason} enum 으로 분류한다. 컨트롤러는 {@link #getMessage()} 를
 * 클라이언트에 노출하므로 message 는 한국어 사용자 메시지로 작성한다. {@link #reason()} 은
 * 서버 로깅/감사용 코드이다.
 *
 * <p>{@link Reason} 멤버는 게임 업로드 거부 사유 DDL COMMENT 와 1:1 정합한다(검증 AC-T1:
 * enum 멤버 수 == 11). 순서·이름을 임의로 바꾸지 않는다.
 */
public class ZipRejectException extends RuntimeException {

    private static final long serialVersionUID = 1L;

    /** zip 업로드 거부 사유 코드. DDL COMMENT 와 1:1 정합(총 11개). */
    public enum Reason {
        NOT_ZIP,
        MAGIC_FAIL,
        TOO_LARGE,
        TOO_MANY_ENTRIES,
        ENTRY_TOO_LARGE,
        EXTRACTED_TOO_LARGE,
        ZIP_SLIP,
        SYMLINK,
        BAD_ENTRY_NAME,
        NO_INDEX,
        INCOMPLETE_BUILD
    }

    private final Reason reason;

    public ZipRejectException(Reason reason, String message) {
        super(message);
        this.reason = reason;
    }

    public Reason reason() {
        return reason;
    }
}
