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

import com.airlock.iam.admin.application.configuration.cronto.CrontoTokenController;
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 CrontoTokenPermissions implements TokenPermissionProvider {
   private Optional<CrontoTokenController> credentialController;
   private AdminappAccessController accessController;

   @Override
   public void applyPermissions(PagePermissions.PagePermissionsBuilder page) {
      if (this.credentialController.isPresent()) {
         this.addDevicePermissions(page);
         this.addLetterPermissions(page);
      }
   }

   private void addDevicePermissions(PagePermissions.PagePermissionsBuilder page) {
      page.permission("enableCrontoDevice", this.allowed(Actions.activateToken))
         .permission("disableCrontoDevice", this.allowed(Actions.deactivateToken))
         .permission("allowPushNotificationsForCrontoDevice", this.allowed(Actions.editToken))
         .permission("disallowPushNotificationsForCrontoDevice", this.allowed(Actions.editToken))
         .permission("deleteCrontoDevice", this.allowed(Actions.deleteToken));
   }

   private void addLetterPermissions(PagePermissions.PagePermissionsBuilder page) {
      boolean editable = this.allowed(Actions.editToken);
      page.permission("orderCrontoActivationLetter", this.allowed(Actions.orderNewToken))
         .permission("deleteCrontoAccount", this.allowed(Actions.deleteToken))
         .permission("crontoLetterValidFromTo-from", editable)
         .permission("crontoLetterValidFromTo-to", editable)
         .permission("crontoLetterAllowedNumberOfActivations", editable)
         .permission("crontoLetterPlatform", editable)
         .permission("saveCrontoActivationLetter", editable)
         .permission("cancelCrontoActivationLetter", editable)
         .permission("deleteCrontoActivationLetter", this.allowed(Actions.unorderNewToken))
         .permission("unorderCrontoActivationLetter", this.allowed(Actions.unorderNewToken))
         .permission("viewCrontoActivationSecret", this.accessController.isActionAllowed(Actions.viewCrontoActivationSecret));
   }

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

   @SuppressFBWarnings(justification = "generated code")
   public CrontoTokenPermissions(Optional<CrontoTokenController> credentialController, AdminappAccessController accessController) {
      this.credentialController = credentialController;
      this.accessController = accessController;
   }
}
