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

import com.airlock.iam.admin.application.configuration.oathotp.OathOtpTokenController;
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 com.airlock.iam.core.misc.impl.tokenverifier.oathotp.OathOtpSettings;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.util.Optional;

public class OathOtpTokenPermissions implements TokenPermissionProvider {
   private Optional<OathOtpTokenController> credentialController;
   private AdminappAccessController accessController;

   @Override
   public void applyPermissions(PagePermissions.PagePermissionsBuilder page) {
      if (this.credentialController.isPresent()) {
         OathOtpSettings oathOtpSettings = this.credentialController.get().getOathOtpSettings();
         this.addTokenPermissions(oathOtpSettings, page);
         this.addLetterPermissions(oathOtpSettings, page);
      }
   }

   private void addTokenPermissions(OathOtpSettings oathOtpSettings, PagePermissions.PagePermissionsBuilder page) {
      page.permission("viewSecret", this.allowed(Actions.viewOathOtpTokenSecret))
         .permission("viewOathOtpSecretAsQRCode", this.allowed(Actions.viewOathOtpTokenSecret) && oathOtpSettings.isShowSecretAsQrCode())
         .permission("viewOathOtpSecretInBase32", this.allowed(Actions.viewOathOtpTokenSecret) && oathOtpSettings.isShowSecretInBase32())
         .permission("viewOathOtpSecretInHex", this.allowed(Actions.viewOathOtpTokenSecret) && oathOtpSettings.isShowSecretInHex())
         .permission("deleteOathOtpToken", this.allowed(Actions.deleteToken))
         .permission("incrementCounter", this.allowed(Actions.editToken) && oathOtpSettings.isSynchronizeIncreaseCounterButton())
         .permission("synchronizeToken", this.allowed(Actions.editToken) && oathOtpSettings.isSynchronizeIncreaseCounterButton());
   }

   private void addLetterPermissions(OathOtpSettings oathOtpSettings, PagePermissions.PagePermissionsBuilder page) {
      page.permission("viewOathOtpActivationLetter", oathOtpSettings.isShowLetterAttributes())
         .permission("orderOathOtpActivationLetter", this.allowed(Actions.orderNewToken))
         .permission("unorderOathOtpActivationLetter", this.allowed(Actions.unorderNewToken));
   }

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

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