module Api
  module HealthChecksController
    extend ActiveSupport::Concern

    def app
      render json: { message: I18n.t("api.v0.health_checks_controller.app_is_up") }, status: :ok
    end

    def database
      if ActiveRecord::Base.connected?
        render json: { message: I18n.t("api.v0.health_checks_controller.database_connected") }, status: :ok
      else
        render json: { message: I18n.t("api.v0.health_checks_controller.database_not_connected") },
               status: :internal_server_error
      end
    end

    def cache
      if all_cache_instances_connected?
        render json: { message: I18n.t("api.v0.health_checks_controller.redis_connected") }, status: :ok
      else
        render json: { message: I18n.t("api.v0.health_checks_controller.redis_not_connected") },
               status: :internal_server_error
      end
    end

    private

    def authenticate_with_token
      return if request.local?

      key = request.headers["health-check-token"]

      return if key == Settings::General.health_check_token

      error_unauthorized
    end

    def all_cache_instances_connected?
      [
        ENV.fetch("REDIS_URL", nil),
        ENV.fetch("REDIS_SESSIONS_URL", nil),
        ENV.fetch("REDIS_SIDEKIQ_URL", nil),
        ENV.fetch("REDIS_RPUSH_URL", nil),
      ].compact.all? do |url|
        Redis.new(url: url).ping == "PONG"
      end
    end
  end
end
