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

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

   @Override
   public void applyPermissions(PagePermissions.PagePermissionsBuilder page) {
      if (this.credentialController.isPresent()) {
         MtanTokenController cc = this.credentialController.get();
         boolean editable = cc.isEditable() && this.accessController.isActionAllowed(Actions.editToken);
         page.permission("assignMtanToken", editable)
            .permission("saveMtanToken", editable)
            .permission("mtanPhoneNumber", editable)
            .permission("mtanFlash", editable)
            .permission("mtanDesignation", editable)
            .permission("addMtanToken", editable)
            .permission("deleteMtanToken", this.accessController.isActionAllowed(Actions.deleteToken))
            .permission(
               "generateMtanIakLetter", cc.isImmediateIakLetterGenerationSupported() && this.accessController.isActionAllowed(Actions.generateTokenIak)
            )
            .permission("orderMtanIakLetter", this.accessController.isActionAllowed(Actions.orderNewToken))
            .permission("cancelMtanIakLetterOrder", this.accessController.isActionAllowed(Actions.unorderNewToken))
            .permission("sendMtanTestSms", (editable || this.accessController.isActionAllowed(Actions.viewToken)) && cc.isTestSmsEnabled())
            .permission("otpCode", (editable || this.accessController.isActionAllowed(Actions.viewToken)) && cc.isTestSmsEnabled());
      }
   }

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