package com.airlock.iam.servicecontainer.app.infrastructure.webapp.presenter;

import com.airlock.iam.base.misc.log.LogUtil;
import com.airlock.iam.elog.api.LogTypes;
import com.airlock.iam.log.audit.AuditLogger;
import com.airlock.iam.plugin.framework.misc.ioc.PluginLoader;
import com.airlock.iam.servicecontainer.app.application.configuration.Server;
import com.airlock.iam.servicecontainer.app.application.configuration.Service;
import com.airlock.iam.servicecontainer.app.infrastructure.webapp.util.ServiceContainerVaadinTranslator;
import com.airlock.iam.servicecontainer.app.infrastructure.webapp.view.GenericServiceView;
import com.vaadin.server.VaadinSession;

public abstract class ServicePresenter<V extends GenericServiceView, S extends Service> {
   private S service;
   private V view;

   public String getDescription() {
      return PluginLoader.getDisplayName(this.service);
   }

   public String getName() {
      return PluginLoader.getDisplayName(this.service);
   }

   public boolean isRunning() {
      return this.service.isRunning();
   }

   public boolean isStopping() {
      return this.service.isStopping();
   }

   public S getService() {
      return this.service;
   }

   public V getView() {
      return this.view;
   }

   public abstract Class<V> getViewClass();

   void setService(S service) {
      this.service = service;
   }

   void setView(V view) {
      this.view = view;
   }

   public String getThreadName() {
      return this.service.getThreadName();
   }

   public void startStop() {
      String username = (String)VaadinSession.getCurrent().getAttribute("username");
      if (this.service.isRunning()) {
         this.service.pleaseStop();
         this.logStatus(username, "stopped");
      } else {
         Server.get().startService(this.service);
         this.logStatus(username, "started");
      }
   }

   private void logStatus(String username, String status) {
      AuditLogger.log(
         ServicePresenter.class,
         LogTypes.SERVER_INFO_SYS,
         "User %s %s service %s.".formatted(LogUtil.logSafeQuote(username), status, LogUtil.quote(this.service.getName()))
      );
   }

   public String getStartStopServiceDescription() {
      return ServiceContainerVaadinTranslator.translate(String.format("genericserviceview.%s-service", this.isRunning() ? "stop" : "start"));
   }
}
