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

import com.airlock.iam.admin.application.configuration.generic.ui.GenericTokenControllerUiConfig;
import com.airlock.iam.admin.domain.model.administrator.permissions.Actions;
import com.airlock.iam.admin.domain.model.token.generic.GenericTokenUi;
import com.airlock.iam.admin.domain.service.access.AdminappAccessController;
import com.airlock.iam.admin.domain.service.token.generic.TokenControllerUiElementService;
import com.airlock.iam.base.api.domain.model.plugin.LogicForConfig;
import jakarta.inject.Inject;
import jakarta.inject.Provider;
import java.util.List;

@LogicForConfig(GenericTokenControllerUiConfig.class)
public final class GenericTokenControllerUiService {
   private final Provider<GenericTokenControllerUiConfig> config;
   private final Provider<AdminappAccessController> accessController;
   private final Provider<List<TokenControllerUiElementService>> uiElementServices;

   @Inject
   public GenericTokenControllerUiService(
      Provider<GenericTokenControllerUiConfig> config,
      Provider<AdminappAccessController> accessController,
      Provider<List<TokenControllerUiElementService>> uiElementServices
   ) {
      this.config = config;
      this.accessController = accessController;
      this.uiElementServices = uiElementServices;
   }

   public GenericTokenUi getGenericTokenUi() {
      return GenericTokenUi.builder()
         .uiElements(((List)this.uiElementServices.get()).stream().map(TokenControllerUiElementService::getElement).toList())
         .showAddButton(this.isActionAllowed(Actions.editToken) && this.config().isShowAddButton())
         .showSaveButton(this.isActionAllowed(Actions.editToken) && this.config().isShowSaveButton())
         .showDeleteButton(this.isActionAllowed(Actions.deleteToken) && this.config().isShowDeleteButton())
         .showEnableButton(this.isActionAllowed(Actions.activateToken) && this.config().isShowEnableDisableButton())
         .showDisableButton(this.isActionAllowed(Actions.deactivateToken) && this.config().isShowEnableDisableButton())
         .showActivationOrder(this.isActionAllowed(Actions.viewToken) && this.config().isShowActivationOrder())
         .showOrderActivationButton(this.isActionAllowed(Actions.orderNewToken) && this.config().isShowOrderCancelButton())
         .showCancelActivationButton(this.isActionAllowed(Actions.unorderNewToken) && this.config().isShowOrderCancelButton())
         .build();
   }

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

   private GenericTokenControllerUiConfig config() {
      return (GenericTokenControllerUiConfig)this.config.get();
   }
}
