package com.airlock.iam.configeditor.shared.infrastructure;

import com.airlock.iam.base.misc.io.FileWatcher;
import com.airlock.iam.configeditor.shared.domain.ConfigModificationWatcher;
import java.nio.file.Path;
import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean;

public final class ConfigFileModificationWatcher implements ConfigModificationWatcher {
   private FileWatcher fileWatcher;
   private final AtomicBoolean paused = new AtomicBoolean(false);

   @Override
   public void startWatching(String fileWatcherCreator, Path configFileToWatch, Runnable onModified) {
      this.stopWatching();
      this.fileWatcher = new FileWatcher(fileWatcherCreator, List.of(configFileToWatch), () -> {
         if (!this.paused.get()) {
            onModified.run();
         }
      });
      this.resumeWatching();
   }

   @Override
   public void pauseWatching() {
      this.paused.set(true);
   }

   @Override
   public void resumeWatching() {
      this.paused.set(false);
   }

   @Override
   public void stopWatching() {
      this.paused.set(true);
      if (this.fileWatcher != null) {
         this.fileWatcher.close();
         this.fileWatcher = null;
      }
   }
}
