// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

'use strict';

// Stores the app windows OLNY for test purpose.
// We SHOULD NOT use it as it is except for test, since the files which have
// the same name will be overridden each other.
var appWindowsForTest = {};

var initializeQueue = new AsyncUtil.Queue();

// Initializes the strings. This needs for the volume manager.
initializeQueue.run(function(fulfill) {
  chrome.fileManagerPrivate.getStrings(function(stringData) {
    loadTimeData.data = stringData;
    fulfill();
  }.wrap());
}.wrap());

// Initializes the volume manager. This needs for isolated entries.
initializeQueue.run(function(fulfill) {
  VolumeManager.getInstance(fulfill);
}.wrap());

chrome.app.runtime.onLaunched.addListener(onLaunched);

/**
 * Called when an app is launched.
 * @param {Object} launchData Launch data.
 */
function onLaunched(launchData) {
  if (!launchData || !launchData.items || launchData.items.length == 0)
    return;

  var videos = [];

  initializeQueue.run(function(fulfill) {
    var isolatedEntries = launchData.items.map(function(item) {
      return item.entry;
    });

    chrome.fileManagerPrivate.resolveIsolatedEntries(isolatedEntries,
        function(externalEntries) {
          videos = externalEntries.map(function(entry) {
            return Object.freeze({
              entry: entry,
              title: entry.name,
              url: entry.toURL(),
            });
          });
          fulfill();
        }.wrap());
  }.wrap());

  initializeQueue.run(function(fulfill) {
    if (videos.length > 0) {
      open(videos);
    } else {
      // TODO(yoshiki): handle error in a smarter way.
      open('', 'error');  // Empty URL shows the error message.
    }
    fulfill();
  }.wrap());
}

/**
 * Opens player window.
 * @param {Array.<Object>} videos List of videos to play.
 * @return {Promise} Promise to be fulfilled on success, or rejected on error.
 */
function open(videos) {
  return new Promise(function(fulfill, reject) {
    chrome.app.window.create('video_player.html', {
      id: 'video',
      frame: 'none',
      singleton: false,
      minWidth: 480,
      minHeight: 270
    },
    fulfill);
  }).then(function(createdWindow) {
    // Stores the window for test purpose.
    appWindowsForTest[videos[0].entry.name] = createdWindow;

    createdWindow.contentWindow.videos = videos;
    createdWindow.setIcon('images/icon/video-player-64.png');

    if (chrome.test)
      createdWindow.contentWindow.loadMockCastExtensionForTest = true;

    chrome.runtime.sendMessage({ready: true});
  }).catch(function(error) {
    console.error('Launch failed', error.stack || error);
    return Promise.reject(error);
  });
}

// If is is run in the browser test, wait for the test resources are installed
// as a component extension, and then load the test resources.
if (chrome.test) {
  /** @type {string} */
  window.testExtensionId = 'ljoplibgfehghmibaoaepfagnmbbfiga';
  chrome.runtime.onMessageExternal.addListener(function(message) {
    if (message.name !== 'testResourceLoaded')
      return;
    var script = document.createElement('script');
    script.src =
        'chrome-extension://' + window.testExtensionId +
        '/common/test_loader.js';
    document.documentElement.appendChild(script);
  });
}
