# frozen_string_literal: true

require_relative "../base"

module Neetob
  class CLI
    module Cronitor
      class Base < CLI::Base
        MONITORS_URL = "https://cronitor.io/api/monitors"

        def initialize
          super()
        end

        def process(*args)
          raise(StandardError, "CRONITOR_ONE_API_KEY is not given") if ENV["CRONITOR_ONE_API_KEY"].nil?
          raise(StandardError, "CRONITOR_THREE_API_KEY is not given") if ENV["CRONITOR_THREE_API_KEY"].nil?

          run(*args)
        end

        private

          def parse_response(http_result)
            case http_result
            when Net::HTTPSuccess
              JSON.parse(http_result.body, symbolize_names: true)
            else
              error_message = JSON.parse(http_result.body)["errors"][0]["message"]
              raise(StandardError, "Request failed with status code #{http_result.code}: #{error_message}")
            end
          end

          def get(username:, password:, headers: { "Accept" => "application/json" })
            monitors = []
            move_to_next_page = true
            page = 1
            while move_to_next_page
              url_to_fetch_from = MONITORS_URL
              url_to_fetch_from += "?page=#{page}" if page > 1
              uri = URI(url_to_fetch_from)
              request = Net::HTTP::Get.new(uri)
              headers.each { |key, value| request[key] = value }
              request.basic_auth(username, password)

              response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: uri.scheme == "https") do |http|
                http.request(request)
              end

              parsed_response = parse_response(response)
              total_monitor_count = parsed_response[:total_monitor_count]
              page_size = parsed_response[:page_size]
              if total_monitor_count > (page * page_size)
                page += 1
              else
                move_to_next_page = false
              end
              monitors += parsed_response[:monitors]
            end
            monitors
          end
      end
    end
  end
end