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

import com.airlock.iam.admin.application.configuration.vasco.VascoOtpTokenControllerConfig;
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 VascoOtpTokenPermissions implements TokenPermissionProvider {
   private Optional<VascoOtpTokenControllerConfig> tokenController;
   private AdminappAccessController accessController;

   @Override
   public void applyPermissions(PagePermissions.PagePermissionsBuilder page) {
      this.tokenController
         .ifPresent(
            tc -> page.permission("saveVascoOtpDevice", this.allowed(Actions.editToken))
               .permission("synchronizeVascoOtpDevice", this.allowed(Actions.editToken))
               .permission("assignVascoOtpDevice", this.allowed(Actions.editToken))
               .permission("unassignVascoOtpDevice", this.allowed(Actions.editToken))
               .permission("firstOtp", this.allowed(Actions.editToken))
               .permission("secondOtp", this.allowed(Actions.editToken))
               .permission("availableDevices", this.allowed(Actions.editToken))
               .permission("additionalInformation", this.allowed(Actions.editToken))
               .permission("comment", this.allowed(Actions.editToken))
               .permission("valid-from", this.allowed(Actions.editToken))
               .permission("valid-to", this.allowed(Actions.editToken))
               .permission("nextVascoOtpDevice", this.allowed(Actions.editToken))
               .permission("previousVascoOtpDevice", this.allowed(Actions.editToken))
               .permission("enableVascoOtpDevice", this.allowed(Actions.activateToken))
               .permission("disableVascoOtpDevice", this.allowed(Actions.deactivateToken))
               .permission("orderVascoOtpLetter", this.allowed(Actions.orderNewToken))
               .permission("sendVascoOtpLetterDirectly", this.allowed(Actions.orderNewToken))
               .permission("cancelVascoOtpLetterOrder", this.allowed(Actions.unorderNewToken))
         );
   }

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

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