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

import com.airlock.iam.application.parameters.domain.model.ApplicationParameters;
import com.airlock.iam.elog.api.EDefaultLogType;
import com.airlock.iam.elog.api.ELogger;
import com.airlock.iam.elog.api.ELoggerFactory;
import com.airlock.iam.health.infrastructure.HealthCheckWireFormat;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.eclipse.microprofile.health.HealthCheckResponse.Status;

public final class ReadinessServlet extends HttpServlet {
   private static final ELogger LOG = ELoggerFactory.getLogger(ReadinessServlet.class);
   private final ReadinessService service;

   public ReadinessServlet(ApplicationParameters parameters) {
      this.service = new ReadinessService(parameters);
   }

   @SuppressFBWarnings("REC_CATCH_EXCEPTION")
   public void doGet(HttpServletRequest request, HttpServletResponse response) {
      try {
         HealthCheckWireFormat result = this.service.checkAll();
         response.setStatus(result.getStatus() == Status.UP ? 200 : 503);
         response.setContentType("application/json");
         result.writeJson(response.getOutputStream());
      } catch (Exception e) {
         LOG.error(EDefaultLogType.GENERIC_LOG_TYPE, "Failed to produce readiness check", e);
         response.reset();
         response.setStatus(500);
      }
   }
}
