package cloud.nstart.terravault.ordinis.auth;

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

/**
 * Конфиг JWT auth для интеграции с Keycloak (@nstart/auth).
 *
 * <p>{@code issuerUri} — OIDC issuer URL, например
 * {@code https://auth.nstart.space/realms/nstart}. Spring Security сам тянет
 * JWK Set через {@code .well-known/openid-configuration}, поддерживает rotation
 * ключей. Если не задан — JWT validation выключен (permissive mode для dev).
 *
 * <p>{@code jwkSetUri} — опциональный override (если discovery недоступен).
 * Обычно не нужен.
 *
 * <p>{@code audience} — опциональная валидация {@code aud} claim. Когда узнаем
 * client_id, выставляем сюда (например {@code ordinis-cuod}).
 *
 * <p>{@code rolesClaim} — путь к ролям внутри JWT. Для Keycloak realm-роли
 * лежат в {@code realm_access.roles} (массив). Для resource-ролей —
 * {@code resource_access.{client_id}.roles}. Default: realm_access.roles.
 *
 * <p>{@code requireAuthentication=true} → 401 на любой запрос без валидного JWT.
 * При false работает permissive режим — анонимный запрос имеет только PUBLIC scope.
 *
 * <p>{@code allowQueryScope=true} включает legacy {@code ?as_scope=...}
 * (для smoke-тестов и dev). В prod — false.
 */
@ConfigurationProperties(prefix = "ordinis.auth")
public record OrdinisAuthProperties(
    String issuerUri,
    String jwkSetUri,
    String audience,
    String rolesClaim,
    boolean requireAuthentication,
    boolean allowQueryScope) {

  public OrdinisAuthProperties {
    if (rolesClaim == null || rolesClaim.isBlank()) rolesClaim = "realm_access.roles";
  }

  public boolean enabled() {
    return (issuerUri != null && !issuerUri.isBlank())
        || (jwkSetUri != null && !jwkSetUri.isBlank());
  }
}
