require 'cgi'
require 'openssl'
require 'rexml/document'
require 'httparty'

module GoogleAppsOauth2
  class Transport
    include HTTParty

    parser GoogleAppsOauth2::Parsers::FeedParser

    base_uri 'https://apps-apis.google.com/a/feeds'

    def initialize(options, &block)
      @domain = options[:domain]
      @token = options[:token]
      @client_id = options[:client_id]
      @client_secret = options[:client_secret]
      @refresh_token = options[:refresh_token]
      @token_changed_block = block

      @user_path= "/#{@domain}/user/2.0"
    end

    def get_users(options = {})
      headers = {'content-type' => 'application/atom+xml', 'Authorization' => "OAuth #{token}"}

      url = user_path + "?startUsername=#{options[:start]}"
      response = self.class.get(url, headers: headers)
      response = check_for_refresh(response)

      response
    end

    private
    attr_reader :user_path
    attr_reader :domain, :token, :refresh_token, :client_id, :client_secret

    def check_for_refresh(old_response)
      response = old_response
      if old_response.code == 401
        data = {
            :client_id => @client_id,
            :client_secret => @client_secret,
            :refresh_token => refresh_token,
            :grant_type => "refresh_token"
        }
        response_json = MultiJson.load(self.class.post("https://accounts.google.com/o/oauth2/token", :body => data))
        @token = response_json["access_token"]
        @token_changed_block.call(@token)
        headers = old_response.request.options[:headers].merge("Authorization" => "OAuth #{token}")
        response = self.class.get(old_response.request.uri.to_s, headers: headers)
      end
      response
    end
  end
end