package com.zioinfo.kintex.security;

import org.springframework.boot.context.properties.ConfigurationProperties;

/**
 * kintex.security.* 바인딩 — 2차 인증(OTP)·로그인 실패 잠금·admin 시드 정책.
 * 시크릿·비밀번호는 env 주입만(하드코딩 금지, 계약 §5B-3). admin 시드는 값이 모두 주입될 때만 동작.
 */
@ConfigurationProperties(prefix = "kintex.security")
public class SecurityPolicyProperties {

    private final Lockout lockout = new Lockout();
    private final Otp otp = new Otp();
    private final AdminSeed adminSeed = new AdminSeed();

    public Lockout getLockout() { return lockout; }
    public Otp getOtp() { return otp; }
    public AdminSeed getAdminSeed() { return adminSeed; }

    public static class Lockout {
        /** 잠금 임계치(연속 실패 횟수). */
        private int maxFailedAttempts = 5;
        /** 잠금 유지 시간(분). */
        private int lockMinutes = 15;
        public int getMaxFailedAttempts() { return maxFailedAttempts; }
        public void setMaxFailedAttempts(int v) { this.maxFailedAttempts = v; }
        public int getLockMinutes() { return lockMinutes; }
        public void setLockMinutes(int v) { this.lockMinutes = v; }
    }

    public static class Otp {
        /** TOTP 발급자 표기(Authenticator 앱 라벨). */
        private String issuer = "KINTEX";
        /** OTP 시크릿 암호화 키(base64 32바이트, AES-256). env 주입만 — 미주입 시 개발 파생키. */
        private String encKey;
        /** 필수 역할(관람객 외)에 OTP 등록·검증 강제. 운영 true 권장, 데모 편의 시 false. */
        private boolean enforce = true;
        public String getIssuer() { return issuer; }
        public void setIssuer(String v) { this.issuer = v; }
        public String getEncKey() { return encKey; }
        public void setEncKey(String v) { this.encKey = v; }
        public boolean isEnforce() { return enforce; }
        public void setEnforce(boolean v) { this.enforce = v; }
    }

    public static class AdminSeed {
        private boolean enabled = false;
        private String email;
        private String password;
        private String displayName = "시스템관리자";
        public boolean isEnabled() { return enabled; }
        public void setEnabled(boolean v) { this.enabled = v; }
        public String getEmail() { return email; }
        public void setEmail(String v) { this.email = v; }
        public String getPassword() { return password; }
        public void setPassword(String v) { this.password = v; }
        public String getDisplayName() { return displayName; }
        public void setDisplayName(String v) { this.displayName = v; }
    }
}
