package com.airlock.iam.application.webserver.infrastructure.health;

import com.airlock.iam.application.parameters.domain.model.ApplicationParameters;
import com.airlock.iam.application.parameters.domain.model.WebAppParameters;
import com.airlock.iam.health.infrastructure.HealthCheckWireFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import org.eclipse.microprofile.health.HealthCheck;
import org.eclipse.microprofile.health.HealthCheckResponse;

public final class LivenessService {
   private final List<HealthCheck> checks = new ArrayList<>();

   public LivenessService(ApplicationParameters parameters) {
      this.checks.add(new RuntimeCheck());
      this.addDefaultServletCheck();
      this.addIamModuleChecks(parameters);
      this.addLogForwarderCheck(parameters);
   }

   private void addLogForwarderCheck(ApplicationParameters parameters) {
      parameters.log().structured().elasticsearchUrl().ifPresent(uri -> this.checks.add(new LogForwarderCheck()));
   }

   private void addDefaultServletCheck() {
      this.checks.add(new WebModuleCheck("web-resources", "/"));
   }

   private void addIamModuleChecks(ApplicationParameters parameters) {
      parameters.webAppParameters()
         .collect(Collectors.toMap(WebAppParameters::module, WebAppParameters::urlPath))
         .forEach((module, path) -> this.checks.add(new WebModuleCheck(module.identifier(), path)));
   }

   public HealthCheckWireFormat checkAll() {
      List<HealthCheckResponse> responses = this.checks.stream().<HealthCheckResponse>map(HealthCheck::call).collect(Collectors.toList());
      return new HealthCheckWireFormat(responses);
   }
}
