package com.airlock.iam.admin.infrastructure.prot;

import com.airlock.iam.admin.api.infrastructure.AdminProtectedExtension;
import com.airlock.iam.admin.infrastructure.filter.prot.AdminappSessionAuthenticationFilter;
import com.airlock.iam.admin.infrastructure.resource.auth.AdminappAuthenticationResource;
import com.airlock.iam.admin.infrastructure.resource.auth.AdminappSettingsResource;
import com.airlock.iam.admin.infrastructure.resource.prot.AdminPasswordAdminResource;
import com.airlock.iam.admin.infrastructure.resource.prot.AdminappResource;
import com.airlock.iam.admin.infrastructure.resource.prot.LicenseResource;
import com.airlock.iam.admin.infrastructure.resource.prot.LogResource;
import com.airlock.iam.admin.infrastructure.resource.prot.MaintenanceMessageResource;
import com.airlock.iam.admin.infrastructure.resource.prot.MaintenanceMessagesResource;
import com.airlock.iam.admin.infrastructure.resource.prot.SmsResource;
import com.airlock.iam.admin.infrastructure.resource.prot.SystemResource;
import com.airlock.iam.admin.infrastructure.resource.prot.UserManagementExtensionResource;
import com.airlock.iam.admin.infrastructure.resource.prot.administrator.AdministratorContextDataResource;
import com.airlock.iam.admin.infrastructure.resource.prot.administrator.AdministratorLockResource;
import com.airlock.iam.admin.infrastructure.resource.prot.administrator.AdministratorPasswordResource;
import com.airlock.iam.admin.infrastructure.resource.prot.administrator.AdministratorResource;
import com.airlock.iam.admin.infrastructure.resource.prot.administrator.AdministratorRolesResource;
import com.airlock.iam.admin.infrastructure.resource.prot.analytics.AnalyticsDataResource;
import com.airlock.iam.admin.infrastructure.resource.prot.techclient.ApiKeyLockResource;
import com.airlock.iam.admin.infrastructure.resource.prot.techclient.ApiKeyResource;
import com.airlock.iam.admin.infrastructure.resource.prot.techclient.PlanUsageResource;
import com.airlock.iam.admin.infrastructure.resource.prot.techclient.PlanUsagesResource;
import com.airlock.iam.admin.infrastructure.resource.prot.techclient.SubscriptionResource;
import com.airlock.iam.admin.infrastructure.resource.prot.techclient.SubscriptionsResource;
import com.airlock.iam.admin.infrastructure.resource.prot.techclient.TechClientLockResource;
import com.airlock.iam.admin.infrastructure.resource.prot.techclient.TechClientResource;
import com.airlock.iam.admin.infrastructure.resource.prot.techclient.TechClientsResource;
import com.airlock.iam.admin.infrastructure.resource.prot.token.Airlock2FAHardwareTokenResource;
import com.airlock.iam.admin.infrastructure.resource.prot.token.VascoLicenseResource;
import com.airlock.iam.admin.infrastructure.resource.prot.token.VascoOtpDeviceResource;
import com.airlock.iam.admin.infrastructure.resource.prot.user.UserAccountLinkResource;
import com.airlock.iam.admin.infrastructure.resource.prot.user.UserContextDataResource;
import com.airlock.iam.admin.infrastructure.resource.prot.user.UserLockResource;
import com.airlock.iam.admin.infrastructure.resource.prot.user.UserLogsResource;
import com.airlock.iam.admin.infrastructure.resource.prot.user.UserOAuth2Resource;
import com.airlock.iam.admin.infrastructure.resource.prot.user.UserRememberMeResource;
import com.airlock.iam.admin.infrastructure.resource.prot.user.UserResource;
import com.airlock.iam.admin.infrastructure.resource.prot.user.UserRolesResource;
import com.airlock.iam.admin.infrastructure.resource.prot.user.UserStatisticsResource;
import com.airlock.iam.admin.infrastructure.resource.prot.user.UserTemporaryLockResource;
import com.airlock.iam.admin.infrastructure.resource.prot.user.UserValidityEnabledResource;
import com.airlock.iam.admin.infrastructure.resource.prot.user.UserValidityFromResource;
import com.airlock.iam.admin.infrastructure.resource.prot.user.UserValidityResource;
import com.airlock.iam.admin.infrastructure.resource.prot.user.UserValidityUntilResource;
import com.airlock.iam.admin.infrastructure.resource.prot.user.UsersResource;
import com.airlock.iam.admin.infrastructure.resource.prot.user.bulkchanges.token.UserBulkTokenMigrationResource;
import com.airlock.iam.admin.infrastructure.resource.prot.user.consent.UserOAuth2ConsentResource;
import com.airlock.iam.admin.infrastructure.resource.prot.user.consent.UserOAuth2ConsentsResource;
import com.airlock.iam.admin.infrastructure.resource.prot.user.tokens.GenericTokenResource;
import com.airlock.iam.admin.infrastructure.resource.prot.user.tokens.UserAirlock2FADeviceResource;
import com.airlock.iam.admin.infrastructure.resource.prot.user.tokens.UserAirlock2FAHardwareTokenAssignmentResource;
import com.airlock.iam.admin.infrastructure.resource.prot.user.tokens.UserAuthenticationMethodResource;
import com.airlock.iam.admin.infrastructure.resource.prot.user.tokens.UserCertificateResource;
import com.airlock.iam.admin.infrastructure.resource.prot.user.tokens.UserCrontoTokenResource;
import com.airlock.iam.admin.infrastructure.resource.prot.user.tokens.UserFidoCredentialResource;
import com.airlock.iam.admin.infrastructure.resource.prot.user.tokens.UserHotpTokenResource;
import com.airlock.iam.admin.infrastructure.resource.prot.user.tokens.UserMatrixTokenResource;
import com.airlock.iam.admin.infrastructure.resource.prot.user.tokens.UserMtanTokenResource;
import com.airlock.iam.admin.infrastructure.resource.prot.user.tokens.UserPasswordResource;
import com.airlock.iam.admin.infrastructure.resource.prot.user.tokens.UserSecretQuestionsResource;
import com.airlock.iam.admin.infrastructure.resource.prot.user.tokens.UserTotpTokenResource;
import com.airlock.iam.admin.infrastructure.resource.prot.user.tokens.UserVascoOtpAssignmentResource;
import com.airlock.iam.admin.infrastructure.resource.prot.user.tokens.UserVascoOtpDeviceResource;
import com.airlock.iam.common.api.application.configuration.RestApplicationConfiguration;
import com.airlock.iam.common.infrastructure.filter.auth.RequestAuthenticationFilter;
import com.airlock.iam.common.infrastructure.filter.auth.RequestAuthorizationFilter;
import com.airlock.iam.common.infrastructure.filter.general.CharsetResponseFilter;
import com.airlock.iam.common.infrastructure.filter.general.ConfigurationLicensedFilter;
import com.airlock.iam.common.infrastructure.filter.general.ConfigurationPresentFilter;
import com.airlock.iam.common.infrastructure.filter.general.EnterExitFilter;
import com.airlock.iam.common.infrastructure.filter.general.LegacyInjectorInitFilter;
import com.airlock.iam.common.infrastructure.filter.general.LogContextFilter;
import com.airlock.iam.common.infrastructure.filter.general.MediaTypeNormalizationFilter;
import com.airlock.iam.common.infrastructure.filter.general.NoCacheFilter;
import com.airlock.iam.common.infrastructure.filter.general.SessionTerminationResponseFilter;
import com.airlock.iam.common.infrastructure.filter.general.SessionTimeoutResponseFilter;
import com.airlock.iam.common.infrastructure.filter.general.SystemAvailabilityFilter;
import com.airlock.iam.common.infrastructure.filter.security.CorsFilter;
import com.airlock.iam.common.infrastructure.filter.security.CsrfProtectionFilter;
import com.airlock.iam.common.infrastructure.reporting.factory.RequestEnvironmentReportingDataModule;
import com.google.inject.Module;
import java.util.Collection;
import java.util.List;
import java.util.stream.Stream;

@RestApplicationConfiguration(
   dependencyProviders = {
         "com.airlock.iam.admin.app.infrastructure.factory.prot",
         "com.airlock.iam.admin.app.infrastructure.factory.shared",
         "com.airlock.iam.admin.infrastructure.factory.prot",
         "com.airlock.iam.admin.infrastructure.factory.shared",
         "com.airlock.iam.base.infrastructure.factory",
         "com.airlock.iam.common.infrastructure.factory"
   },
   beanMappers = {"com.airlock.iam.admin.infrastructure.mapper.prot", "com.airlock.iam.common.infrastructure.mapper"},
   exceptionMappers = {"com.airlock.iam.admin.infrastructure.exception.prot", "com.airlock.iam.common.infrastructure.exception"}
)
public final class MainAdminProtectedExtension implements AdminProtectedExtension {
   public Collection<Class<? extends Module>> guiceModules() {
      return List.of(RequestEnvironmentReportingDataModule.class);
   }

   public Collection<Class<?>> jaxRsComponents() {
      return Stream.concat(restFilters(), restResources()).toList();
   }

   private static Stream<Class<?>> restFilters() {
      return Stream.of(
         AdminappSessionAuthenticationFilter.class,
         CharsetResponseFilter.class,
         ConfigurationLicensedFilter.class,
         ConfigurationPresentFilter.class,
         CorsFilter.class,
         CsrfProtectionFilter.class,
         EnterExitFilter.class,
         LegacyInjectorInitFilter.class,
         LogContextFilter.class,
         MediaTypeNormalizationFilter.class,
         NoCacheFilter.class,
         RequestAuthenticationFilter.class,
         RequestAuthorizationFilter.class,
         SessionTerminationResponseFilter.class,
         SessionTimeoutResponseFilter.class,
         SystemAvailabilityFilter.class
      );
   }

   private static Stream<Class<?>> restResources() {
      return Stream.of(
         AdminPasswordAdminResource.class,
         AdminappAuthenticationResource.class,
         AdminappResource.class,
         AdminappSettingsResource.class,
         AdministratorContextDataResource.class,
         AdministratorLockResource.class,
         AdministratorPasswordResource.class,
         AdministratorResource.class,
         AdministratorRolesResource.class,
         Airlock2FAHardwareTokenResource.class,
         ApiKeyLockResource.class,
         ApiKeyResource.class,
         GenericTokenResource.class,
         LicenseResource.class,
         LogResource.class,
         MaintenanceMessageResource.class,
         MaintenanceMessagesResource.class,
         PlanUsageResource.class,
         PlanUsagesResource.class,
         SmsResource.class,
         SubscriptionResource.class,
         SubscriptionsResource.class,
         SystemResource.class,
         TechClientLockResource.class,
         TechClientResource.class,
         TechClientsResource.class,
         AnalyticsDataResource.class,
         UserAccountLinkResource.class,
         UserAirlock2FADeviceResource.class,
         UserAirlock2FAHardwareTokenAssignmentResource.class,
         UserAuthenticationMethodResource.class,
         UserBulkTokenMigrationResource.class,
         UserCertificateResource.class,
         UserContextDataResource.class,
         UserCrontoTokenResource.class,
         UserFidoCredentialResource.class,
         UserHotpTokenResource.class,
         UserLockResource.class,
         UserLogsResource.class,
         UserManagementExtensionResource.class,
         UserMatrixTokenResource.class,
         UserMtanTokenResource.class,
         UserOAuth2ConsentResource.class,
         UserOAuth2ConsentsResource.class,
         UserOAuth2Resource.class,
         UserPasswordResource.class,
         UserRememberMeResource.class,
         UserResource.class,
         UserRolesResource.class,
         UserSecretQuestionsResource.class,
         UserStatisticsResource.class,
         UserTemporaryLockResource.class,
         UserTotpTokenResource.class,
         UserValidityEnabledResource.class,
         UserValidityFromResource.class,
         UserValidityResource.class,
         UserValidityUntilResource.class,
         UserVascoOtpAssignmentResource.class,
         UserVascoOtpDeviceResource.class,
         UsersResource.class,
         VascoLicenseResource.class,
         VascoOtpDeviceResource.class
      );
   }
}
