package com.airlock.iam.application.parameters.infrastructure;

import com.airlock.iam.application.parameters.domain.model.IamConfigRoot;
import com.airlock.iam.application.parameters.domain.model.IamInstance;
import com.google.common.base.Strings;
import jakarta.annotation.Nullable;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Collections;
import java.util.List;
import java.util.Optional;
import java.util.stream.Stream;

public final class IamInstanceResolver {
   public static Optional<IamInstance> getInstanceInfo(IamConfigRoot configRoot, @Nullable String instanceName) {
      return getInstanceDirectory(configRoot, instanceName)
         .flatMap(instanceDir -> Optional.ofNullable(instanceDir.getFileName()).map(path -> new IamInstance(path.toString(), instanceDir)));
   }

   private static Optional<Path> getInstanceDirectory(IamConfigRoot configRoot, @Nullable String instanceName) {
      return Strings.isNullOrEmpty(instanceName)
         ? getSingleInstanceDirectory(configRoot)
         : Optional.of(configRoot.resolveInstanceDirectory(instanceName)).filter(x$0 -> Files.isDirectory(x$0));
   }

   public static boolean isCommonInstance(Path instanceDir) {
      return instanceDir.endsWith("common");
   }

   private static Optional<Path> getSingleInstanceDirectory(IamConfigRoot configRoot) {
      Path instancesDir = configRoot.resolveInstancesDirectory();
      List<Path> dirs = getInstanceDirectories(instancesDir);
      return dirs.size() == 1 ? Optional.of(instancesDir.resolve(dirs.getFirst())) : Optional.empty();
   }

   private static List<Path> getInstanceDirectories(Path instancesDir) {
      if (!Files.isDirectory(instancesDir)) {
         return Collections.emptyList();
      }

      try (Stream<Path> pathStream = Files.list(instancesDir)) {
         return pathStream.filter(x$0 -> Files.isDirectory(x$0)).filter(dir -> {
            try {
               return !Files.isHidden(dir);
            } catch (IOException e) {
               throw new IllegalStateException(ex);
            }
         }).filter(dir -> !isCommonInstance(dir)).toList();
      } catch (IOException e) {
         throw new IllegalStateException(e);
      }
   }

   public static Path resolveCommonFromInstancePath(Path instanceDir) {
      return instanceDir.resolveSibling("common");
   }

   private IamInstanceResolver() {
      throw new AssertionError();
   }
}
