package gc.mda.kcg.auth.provider;

import gc.mda.kcg.auth.User;

/**
 * 인증 방식 확장 포인트.
 * Phase 3: PASSWORD만 구현.
 * Phase 9 (TODO): GPKI(공무원 인증서), SSO(SAML/OIDC) 추가.
 */
public interface AuthProvider {

    /**
     * 인증 방식 식별자: PASSWORD / GPKI / SSO
     */
    String getProviderType();

    /**
     * 인증 수행. 성공 시 User 반환, 실패 시 AuthenticationException 발생.
     */
    User authenticate(AuthRequest request) throws AuthenticationException;

    record AuthRequest(
            String userAcnt,
            String credential,        // 비밀번호 또는 인증서/SSO 토큰
            String ipAddress,
            String userAgent
    ) {}

    class AuthenticationException extends RuntimeException {
        private final String reason;

        public AuthenticationException(String reason) {
            super(reason);
            this.reason = reason;
        }

        public String getReason() { return reason; }
    }
}
