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

import com.airlock.iam.admin.application.configuration.airlock2fa.Airlock2FATokenControllerConfig;
import com.airlock.iam.admin.application.service.permission.PagePermissions;
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 Airlock2FATokenPermissions implements TokenPermissionProvider {
   private Optional<Airlock2FATokenControllerConfig> tokenController;
   private AdminappAccessController accessController;

   @Override
   public void applyPermissions(PagePermissions.PagePermissionsBuilder page) {
      if (this.tokenController.isPresent()) {
         this.addAccountPermissions(page);
         this.addDevicePermissions(page);
         this.addHardwareTokenPermissions(page);
         this.addActivationLetterPermissions(page);
      }
   }

   private void addAccountPermissions(PagePermissions.PagePermissionsBuilder page) {
      page.permission("lockAirlock2FAAccount", this.accessController.isActionAllowed(Actions.deactivateToken))
         .permission("unlockAirlock2FAAccount", this.accessController.isActionAllowed(Actions.activateToken))
         .permission("deleteAirlock2FAAccount", this.accessController.isActionAllowed(Actions.deleteToken));
   }

   private void addDevicePermissions(PagePermissions.PagePermissionsBuilder page) {
      page.permission("unassignAirlock2FAHardwareDevice", this.accessController.isActionAllowed(Actions.deleteToken));
      page.permission("archiveAirlock2FAHardwareDevice", this.accessController.isActionAllowed(Actions.deleteToken));
      page.permission("unenrollAirlock2FAAppDevice", this.accessController.isActionAllowed(Actions.deleteToken));
   }

   private void addHardwareTokenPermissions(PagePermissions.PagePermissionsBuilder page) {
      page.permission("assignAirlock2FAToken", this.accessController.isActionAllowed(Actions.editToken));
      page.permission("availableTokens", this.accessController.isActionAllowed(Actions.editToken));
      page.permission("synchronizeAirlock2FAHardwareToken", this.accessController.isActionAllowed(Actions.editToken));
      page.permission("synchronizeAirlock2FAHardwareTokenPasscode1", this.accessController.isActionAllowed(Actions.editToken));
      page.permission("synchronizeAirlock2FAHardwareTokenPasscode2", this.accessController.isActionAllowed(Actions.editToken));
      page.permission("createAirlock2FAShipmentLetter", this.accessController.isActionAllowed(Actions.editToken));
   }

   private void addActivationLetterPermissions(PagePermissions.PagePermissionsBuilder page) {
      page.permission("createAirlock2FAActivationLetter", this.accessController.isActionAllowed(Actions.generateTokenIak));
      page.permission("deleteAirlock2FAActivationLetter", this.accessController.isActionAllowed(Actions.deleteToken));
      page.permission("createAirlock2FAActivationLetterOrder", this.accessController.isActionAllowed(Actions.orderNewToken));
      page.permission("deleteAirlock2FAActivationLetterOrder", this.accessController.isActionAllowed(Actions.unorderNewToken));
      page.permission("airlock2FAActivationCodeShort", this.accessController.isActionAllowed(Actions.viewAirlock2FAActivationSecret));
   }

   @SuppressFBWarnings(justification = "generated code")
   public Airlock2FATokenPermissions(Optional<Airlock2FATokenControllerConfig> tokenController, AdminappAccessController accessController) {
      this.tokenController = tokenController;
      this.accessController = accessController;
   }
}
