#!/usr/bin/perl -w
#
# Copyright 2013, Google Inc. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# This utility script demonstrate how to generate offline credentials for
# OAuth2 Installed Applications. The generated refresh token can then be used
# to configure the client library, refer to the OAuth2 section of the
# adwords.properties file. This example is meant to be run from the command line
# and requires user input.

use strict;
use lib "../../lib";

use Google::Ads::AdWords::Client;

use Cwd qw(abs_path);

# Main subroutine.
sub generate_offline_credentials {
  my ($client) = @_;

  my $auth_handler = $client->get_oauth_2_handler();

  my $client_id     = $auth_handler->get_client_id();
  my $client_secret = $auth_handler->get_client_secret();
  if (!$client_id || !$client_secret) {
    die("ERROR: Missing input values for oAuth2ClientId or " .
      "oAuth2ClientSecret in your adwords.properties file. " .
      "These values can be generated from " .
      "the Google Developers Console https://console.developers.google.com " .
      "under the Projects tab.");
  }

  # Open a browser and point it to the authorization URL, authorize the access
  # and then enter the generated verification code.
  print "Log in to your AdWords account and open the following URL:\n\n",
    $auth_handler->get_authorization_url(), "\n\n";
  print "Grant access to the applications and enter the authorization code " .
    "display in the page then hit ENTER.\nEnter confirmation code: ";
  my $code = <STDIN>;
  $code = trim($code);

  # Requesting the access token using the authorization code, so it can be used
  # to access the API.
  if (my $error = $auth_handler->issue_access_token($code)) {
    die($error);
  }

  # After the access token is generated, you should store the
  # access and refresh token and re-use them for future calls, by either
  # changing your adwords.properties file or setting them in the authorization
  # handler as follows:
  # $client->get_oauth_2_handler()->set_client_id($client_id);
  # $client->get_oauth_2_handler()->set_client_secret($client_secret);
  # $client->get_oauth_2_handler()->set_access_token($access_token);
  # $client->get_oauth_2_handler()->set_refresh_token($refresh_token);
  printf "\nThe following are the keys you can replace in your " .
    "adwords.properties configuration:\n\n" . "oAuth2ClientId=%1\$s\n" .
    "oAuth2ClientSecret=%2\$s\n" . "oAuth2AccessToken=%3\$s\n" .
    "oAuth2RefreshToken=%4\$s\n" . "\nOr use at runtime, like:\n\n" .
    "\$client->get_oauth_2_handler()->set_client_id('%1\$s');\n" .
    "\$client->get_oauth_2_handler()->set_client_secret('%2\$s');\n" .
    "\$client->get_oauth_2_handler()->set_access_token('%3\$s');\n" .
    "\$client->get_oauth_2_handler()->set_refresh_token('%4\$s');\n",
    $client_id, $client_secret, $auth_handler->get_access_token(),
    $auth_handler->get_refresh_token();

  return 1;
}

sub trim {
  my $str = shift;
  $str =~ s/^\s*(.*?)\s*$/$1/;
  return $str;
}

# Don't run the example if the file is being included.
if (abs_path($0) ne abs_path(__FILE__)) {
  return 1;
}

# Get AdWords Client, credentials will be read from ~/adwords.properties.
my $client = Google::Ads::AdWords::Client->new();

# Call the example
generate_offline_credentials($client);
