package com.airlock.iam.servicecontainer.app.application.service;

import com.airlock.iam.core.misc.util.SynchronizedBoolean;
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 java.util.concurrent.atomic.AtomicInteger;

public abstract class AbstractService implements Service {
   private static final AtomicInteger COUNTER = new AtomicInteger(0);
   private final String runtimeIdentifier;
   private final SynchronizedBoolean pleaseStop = new SynchronizedBoolean(false);
   private final SynchronizedBoolean isRunning = new SynchronizedBoolean(false);

   public AbstractService() {
      this.runtimeIdentifier = PluginLoader.getDisplayName(this.getClass()) + COUNTER.incrementAndGet();
   }

   protected void setRunning(boolean newIsRunning) {
      this.isRunning.setValue(newIsRunning);
   }

   @Override
   public boolean isRunning() {
      return this.isRunning.getValue();
   }

   @Override
   public void pleaseStop() {
      this.pleaseStop.setValue(true);
   }

   @Override
   public boolean isStopping() {
      return this.pleaseStop.getValue();
   }

   protected void setPleaseStopToFalse() {
      this.pleaseStop.setValue(false);
   }

   @Override
   public String getRuntimeIdentifier() {
      return this.runtimeIdentifier;
   }

   protected final Server getServer() throws IllegalStateException {
      return Server.get();
   }
}
