require 'google/api_client/client_secrets'

class Google::OauthTokenService < ApplicationService
  def request_token_from_google(refresh)
    params = {
      grant_type: 'refresh_token',
      refresh_token: refresh,
      client_id: client_secrets.client_id,
      client_secret: client_secrets.client_secret
    }

    JSON.parse(RestClient.post('https://accounts.google.com/o/oauth2/token', params))
  rescue => e
    JSON.parse(e.response.body)
  end

  def get_access_token(auth_code)
    auth_client = client_secrets.to_authorization
    auth_client.update!(
      redirect_uri: 'postmessage',
      additional_parameters: {
        include_granted_scopes: true
      }
    )

    auth_client.code = auth_code
    auth_client.fetch_access_token!
  end

  def get_token(token)
    params = { params: { access_token: token } }
    RestClient.get('https://www.googleapis.com/oauth2/v1/tokeninfo', params)
  end

  def validate_access_token?(token)
    get_token(token)
    true
  rescue
    false
  end

  def remove_token(token)
    RestClient.post('https://oauth2.googleapis.com/revoke', { token: token })
  end

  private
    def client_secrets
      @client_secrets ||= Google::APIClient::ClientSecrets.load(
        Rails.root.join('config/secrets/client_secrets.json')
      )
    end
end
