package com.airlock.iam.admin.application.service.permission.provider;

import com.airlock.iam.admin.application.configuration.techclients.TechClientsConfig;
import com.airlock.iam.admin.application.service.permission.PagePermissions;
import com.airlock.iam.admin.application.service.permission.PagePermissionsProvider;
import com.airlock.iam.admin.application.system.AdminappPage;
import com.airlock.iam.admin.domain.model.administrator.permissions.Actions;
import com.airlock.iam.admin.domain.service.access.AdminappAccessController;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.util.Optional;

public class TechClientDetailPermissionsProvider implements PagePermissionsProvider {
   private AdminappAccessController accessController;
   private Optional<TechClientsConfig> config;

   @Override
   public AdminappPage page() {
      return AdminappPage.TECH_CLIENT_DETAIL;
   }

   @Override
   public boolean applicableInRecoveryMode() {
      return false;
   }

   @Override
   public PagePermissions getPagePermissions() {
      boolean accessible = this.config.isPresent() && this.isAllowed(Actions.viewTechnicalClients);
      return PagePermissions.builder()
         .accessible(accessible)
         .defaultPermission(
            this.isAllowed(Actions.createEditTechnicalClient) ? PagePermissions.DefaultPermission.WRITE : PagePermissions.DefaultPermission.READ
         )
         .permission("refreshTechClient", accessible)
         .permission("deleteTechClient", this.isAllowed(Actions.deleteTechnicalClient))
         .permission("lockTechClient", this.isAllowed(Actions.lockTechnicalClient))
         .permission("unlockTechClient", this.isAllowed(Actions.unlockTechnicalClient))
         .permission("techClientLockReasons", this.isAllowed(Actions.lockTechnicalClient))
         .permission("managePlans", this.isAllowed(Actions.createEditTechnicalClient))
         .permission("apiKeyLockButton", this.isAllowed(Actions.lockTechnicalClient))
         .permission("apiKeyUnlockButton", this.isAllowed(Actions.unlockTechnicalClient))
         .build();
   }

   private boolean isAllowed(Actions action) {
      return this.accessController.isActionAllowed(action);
   }

   @SuppressFBWarnings(justification = "generated code")
   public TechClientDetailPermissionsProvider(AdminappAccessController accessController, Optional<TechClientsConfig> config) {
      this.accessController = accessController;
      this.config = config;
   }
}
