(function() {
  const ALBUM_NAME = 'Screen Capture';
  const CLIENT_ID = '368358534491.apps.googleusercontent.com';
  const AUTH_URL = 'https://accounts.google.com/o/oauth2/auth';
  const REDIRECT_URI = 'https://picasaweb.google.com';
  const SCOPE = 'https://picasaweb.google.com/data/';
  const RESPONSE_TYPE = 'token';
  const ALBUM_URL = 'https://picasaweb.google.com/data/feed/api/user/' +
    'default';
  const CREATE_ALBUM_URL = 'https://picasaweb.google.com/data/feed/api/user/' +
    'default';
  const UPLOAD_BASE_URL = 'https://picasaweb.google.com/data/feed/api/user/' +
    'default/albumid/';
  const LOGOUT_URL = 'https://picasaweb.google.com/bye?continue=' +
    'https://www.google.com/accounts/Logout?continue=' +
    'https://picasaweb.google.com';

  // var picasa = window.Picasa = new Site('picasa');
  var picasa = window.Picasa = {
    siteId: 'picasa',
    currentUserId: null,
    redirectUrl: REDIRECT_URI,
    accessTokenCallback: null,
    
    getAccessToken: function(callback) {
      picasa.accessTokenCallback = callback;
      var url = AUTH_URL + '?client_id=' + CLIENT_ID + '&redirect_uri=' +
        REDIRECT_URI + '&scope=' + SCOPE + '&response_type=' + RESPONSE_TYPE;
      chrome.tabs.create({ url: url});
    },

    parseRedirectUrl: function(url) {
      var result = false;
      if (url.indexOf(REDIRECT_URI) == 0) {
        var hash = url.split('#')[1];
        if (hash) {
          var params = hash.split('&');
          var paramMap = {};
          params.forEach(function(param) {
            paramMap[param.split('=')[0]] = param.split('=')[1];
          });

          var accessToken = paramMap['access_token'];
          var expires = paramMap['expires_in'];
          if (accessToken && expires) {
            result = {
              accessToken: accessToken,
              expires: expires
            };
          } else {
            result = 'bad_redirect_url'; // Should never happened.
          }
        } else {
          var search = url.split('?')[1];
          if (search == 'error=access_denied')
            result = 'access_denied';
        }
      }
      return result;
    },
    
    isRedirectUrl: function(url) {
      return picasa.parseRedirectUrl(url) != false;
    },
    
    parseAccessToken: function(redirectUrl) {
      var parsedResult = picasa.parseRedirectUrl(redirectUrl);
      if (parsedResult && typeof parsedResult == 'object') {
        var user = new User({
          accessToken: parsedResult.accessToken,
          expires: new Date().getTime() + parsedResult.expires * 1000
        });
        picasa.accessTokenCallback('success', user);
      } else {
        picasa.accessTokenCallback('failure', 'user_denied');
      }
      picasa.accessTokenCallback = null;
    },
    
    getUserInfo: function(user, callback) {
      ajax({
        url: ALBUM_URL,
        parameters: {
          fields: 'title,gphoto:nickname,entry/title,entry/gphoto:id',
          alt: 'json',
          access_token: user.accessToken
        },
        success: function(res) {
          var userId = res.feed.title.$t;
          var userName = res.feed.gphoto$nickname.$t;
          user.id = userId;
          user.name = userName;
          
          var albums = res.feed.entry;
          if (albums) {
            var length = albums.length;

            // Check if user has created album "Screen Capture".
            for (var i = 0; i < length; i++) {
              var albumName = albums[i].title.$t;
              if (albumName == ALBUM_NAME) {
                user.albumId = albums[i].gphoto$id.$t;
                break;
              }
            }
          }

          // Create album "Screen Capture" and retrieve album id.
          if (!user.albumId) {
            picasa.createAlbum(user.accessToken, function(result,
                                                          albumIdOrMessage) {
              if (result == 'success') {
                user.albumId = albumIdOrMessage;
                callback('success', user);
              } else {
                callback('failure', albumIdOrMessage);
              }
            });
          } else {
            callback('success', user);
          }
        },
        status: {
          404: function() {
            callback('failure', 'failed_to_get_user_info');
          }
        }
      });
    },

    createAlbum: function(accessToken, callback) {
      var data = '<entry xmlns="http://www.w3.org/2005/Atom" ' +
        'xmlns:media="http://search.yahoo.com/mrss/" ' +
        'xmlns:gphoto="http://schemas.google.com/photos/2007">' +
        '<title type="text">' + ALBUM_NAME +
        '</title><category scheme="http://schemas.google.com/g/2005#kind" ' +
        'term="http://schemas.google.com/photos/2007#album"></category>' +
        '</entry>';

      ajax({
        method: 'POST',
        url: CREATE_ALBUM_URL,
        parameters: {
          alt: 'json'
        },
        data: data,
        headers: {
          'GData-Version': 2,
          'Content-Type': 'application/atom+xml',
          'Authorization': 'OAuth ' + accessToken
        },
        complete: function(statusCode, album) {
          if (statusCode == 201) {
            var albumId = album.entry.gphoto$id.$t;
            callback('success', albumId);
          } else {
            callback('failure', 'failure_to_create_album')
          }
        }
      });
    },

    upload: function(user, caption, imageData, callback) {
      caption = ajax.convertEntityString(caption);
      caption = ajax.encodeForBinary(caption);

      var imageFile = new Date().getTime() + '.png';
      var headers = {
        'GData-Version': 2,
        'Content-Type': 'multipart/related; boundary=' +
          MULTIPART_FORMDATA_BOUNDARY,
        'Authorization': 'OAuth ' + user.accessToken
      };

      var captionData = '<entry xmlns="http://www.w3.org/2005/Atom">' +
        '<title>' + imageFile + '</title>' +
        '<summary>' + caption + '</summary>' +
        '<category scheme="http://schemas.google.com/g/2005#kind" ' +
        'term="http://schemas.google.com/photos/2007#photo"/></entry>';

      var dataPart1 = {
        contentType: 'application/atom+xml',
        data: captionData
      };
      var dataPart2 = {
        contentType: 'image/png',
        data: imageData
      };
      var multipartData = {
        boundary: MULTIPART_FORMDATA_BOUNDARY,
        dataList: [dataPart1, dataPart2]
      };

      ajax({
        url: UPLOAD_BASE_URL + user.albumId + '?alt=json',
        headers: headers,
        multipartData: multipartData,
        complete: function(statusCode, res) {
          if (statusCode == 201) {
            var link = res.entry.link;
            callback('success', link);
          } else {
            var message = 'failed_to_upload_image';
            if (statusCode == 403) {
              // bad access token
              message = 'bad_access_token';
            } else if (statusCode == 404 && res == 'No album found.') {
              // Invalid album id.
              message = 'invalid_album_id'
            }
            callback('failure', message);
          }
        }
      });
    },

    getPhotoLink: function(user, photolinks, callback) {
      for (var i = 0; i < photolinks.length; i++) {
        var link = photolinks[i];
        if (link.type == 'text/html' &&
            link.rel == 'http://schemas.google.com/photos/2007#canonical') {
          callback('success', link.href);
          break;
        }
      }
    },

    logout: function(callback) {
      ajax({
        url: LOGOUT_URL,
        success: function() {
          callback();
        }
      });
    }
  };
})();