# frozen_string_literal: true
module Gitlab
  module PhabricatorImport
    module Conduit
      class Response
        def self.parse!(http_response)
          unless http_response.success?
            raise Gitlab::PhabricatorImport::Conduit::ResponseError,
                  "Phabricator responded with #{http_response.status}"
          end

          response = new(JSON.parse(http_response.body))

          unless response.success?
            raise ResponseError,
                  "Phabricator Error: #{response.error_code}: #{response.error_info}"
          end

          response
        rescue JSON::JSONError => e
          raise ResponseError.new(e)
        end

        def initialize(json)
          @json = json
        end

        def success?
          error_code.nil?
        end

        def error_code
          json['error_code']
        end

        def error_info
          json['error_info']
        end

        def data
          json_result&.fetch('data')
        end

        def pagination
          return unless cursor_info = json_result&.fetch('cursor')

          @pagination ||= Pagination.new(cursor_info)
        end

        private

        attr_reader :json

        def json_result
          json['result']
        end
      end
    end
  end
end