# frozen_string_literal: true

require_relative '../metrics/system'

module Gitlab
  module Memory
    class ReportsUploader
      def initialize(gcs_key:, gcs_project:, gcs_bucket:, logger:)
        @gcs_bucket = gcs_bucket
        @fog = Fog::Storage::Google.new(google_project: gcs_project, google_json_key_location: gcs_key)
        @logger = logger
      end

      def upload(path)
        log_upload_requested(path)
        start_monotonic_time = Gitlab::Metrics::System.monotonic_time

        File.open(path.to_s) { |file| fog.put_object(gcs_bucket, File.basename(path), file) }

        duration_s = Gitlab::Metrics::System.monotonic_time - start_monotonic_time
        log_upload_success(path, duration_s)
      rescue StandardError, Errno::ENOENT => error
        log_exception(error)
      end

      private

      attr_reader :gcs_bucket, :fog, :logger

      def log_upload_requested(path)
        logger.info(log_labels.merge(perf_report_status: 'upload requested', perf_report_path: path))
      end

      def log_upload_success(path, duration_s)
        logger.info(log_labels.merge(perf_report_status: 'upload success', perf_report_path: path,
                                     duration_s: duration_s))
      end

      def log_exception(error)
        logger.error(log_labels.merge(perf_report_status: "error", error: error.message))
      end

      def log_labels
        {
          message: "Diagnostic reports",
          class: self.class.name,
          pid: $$
        }
      end
    end
  end
end