// Copyright (C) 2016 The Android Open Source Project
//
// 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.

var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-73551813-1']);
_gaq.push(['_trackPageview']);

(function() {
  var ga = document.createElement('script');
  ga.type = 'text/javascript'; ga.async = true;
  ga.src = 'https://ssl.google-analytics.com/ga.js';
  var s = document.getElementsByTagName('script')[0];
  s.parentNode.insertBefore(ga, s);
})();

var RequestType = {
  NAV: 'nav',
};

chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
  if (request.type == RequestType.NAV) {
    _gaq.push(['_trackPageview', request.url]);
  }
});

function loadImage(path, width, height) {
  return new Promise(function(resolve) {
    var canvas = document.createElement('canvas');
    var ctx = canvas.getContext('2d');
    var image = new Image();
    var imageData;
    image.onload = function() {
      ctx.drawImage(image, 0, 0, width, height);
      imageData = ctx.getImageData(0, 0, width, height);
      resolve(imageData);
    };
    image.src = chrome.runtime.getURL(path);
  });
}

chrome.runtime.onInstalled.addListener(function() {
  var loadImages = Promise.all([
    loadImage('icon_active_19.png', 19, 19),
    loadImage('icon_active_38.png', 38, 38),
  ]);

  loadImages.then(function(imageDataArray) {
    chrome.declarativeContent.onPageChanged.removeRules(undefined, function() {
      chrome.declarativeContent.onPageChanged.addRules([
        {
          conditions: [
            new chrome.declarativeContent.PageStateMatcher({
              pageUrl: { hostSuffix: '-review.googlesource.com' },
            })
          ],
          // And shows the extension's page action.
          actions: [ new chrome.declarativeContent.ShowPageAction() ]
        },
        {
          conditions: [
            new chrome.declarativeContent.PageStateMatcher({
              css: ['gr-app'],
            })
          ],
          actions: [ new chrome.declarativeContent.SetIcon({
            imageData: {
              19: imageDataArray[0],
              38: imageDataArray[1],
            }
          })]
        }
      ]);
    });
  });

  // There is no option to update a tab URL while also bypassing the cache. Hack
  // around this limitation by setting a tab ID to be reloaded in the tab update
  // callback below.
  var tabIDToReload = null;
  chrome.webRequest.onCompleted.addListener(
    function(details) {
      if (details.type == 'main_frame' && tabIDToReload != null) {
        chrome.tabs.reload(tabIDToReload, {bypassCache: true});
        tabIDToReload = null;
      }
    },
    {urls: ['*://*.googlesource.com/*']});

  chrome.pageAction.onClicked.addListener(function(tab) {
    var cookieID = {
      name: 'GERRIT_UI',
      url: tab.url,
    };
    chrome.cookies.get(cookieID, function(cookie) {
      if (cookie) {
        _gaq.push(['_trackEvent', 'Page Action', 'Switch to Gerrit']);
        chrome.cookies.remove(cookieID, function() {
          // The GWT UI does not handle PolyGerrit URL redirection.
          chrome.tabs.update(tab.id, {
            url: tab.url.replace('googlesource.com/', 'googlesource.com/#/')
          }, function(tab) {
            tabIDToReload = tab.id;
          });
        });
      } else {
        _gaq.push(['_trackEvent', 'Page Action', 'Switch to PolyGerrit']);
        chrome.cookies.set({
          url: tab.url,
          name: 'GERRIT_UI',
          value: 'polygerrit',
          httpOnly: true,
          path: '/',
          secure: true,
        }, function() {
          // PolyGerrit handles Gerrit URL -> PolyGerrit URL redirection.
          chrome.tabs.reload(tab.id, {bypassCache: true});
        });
      }
    });
  });
});
