/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

/**
 * This file contains helper functions for showing OS-specific
 * file and folder pickers.
 */

const { Cu, Cc, Ci } = require("chrome");
const { FileUtils } = Cu.import("resource://gre/modules/FileUtils.jsm", {});
const promise = require("promise");
const { merge } = require("sdk/util/object");
const { getLocalizedString } = require("devtools/client/projecteditor/lib/helpers/l10n");

/**
 * Show a file / folder picker.
 * https://developer.mozilla.org/en-US/docs/Mozilla/Tech/XPCOM/Reference/Interface/nsIFilePicker
 *
 * @param object options
 *        Additional options for setting the source. Supported options:
 *          - directory: string, The path to default opening
 *          - defaultName: string, The filename including extension that
 *                         should be suggested to the user as a default
 *          - window: DOMWindow, The filename including extension that
 *                         should be suggested to the user as a default
 *          - title: string, The filename including extension that
 *                         should be suggested to the user as a default
 *          - mode: int, The type of picker to open.
 *
 * @return promise
 *         A promise that is resolved with the full path
 *         after the file has been picked.
 */
function showPicker(options) {
  let fp = Cc["@mozilla.org/filepicker;1"].createInstance(Ci.nsIFilePicker);
  if (options.directory) {
    try {
      fp.displayDirectory = FileUtils.File(options.directory);
    } catch (ex) {
      console.warn(ex);
    }
  }

  if (options.defaultName) {
    fp.defaultString = options.defaultName;
  }

  fp.init(options.window, options.title, options.mode);
  let deferred = promise.defer();
  fp.open({
    done: function (res) {
      if (res === Ci.nsIFilePicker.returnOK || res === Ci.nsIFilePicker.returnReplace) {
        deferred.resolve(fp.file.path);
      } else {
        deferred.reject();
      }
    }
  });
  return deferred.promise;
}
exports.showPicker = showPicker;

/**
 * Show a save dialog
 * https://developer.mozilla.org/en-US/docs/Mozilla/Tech/XPCOM/Reference/Interface/nsIFilePicker
 *
 * @param object options
 *        Additional options as specified in showPicker
 *
 * @return promise
 *         A promise that is resolved when the save dialog has closed
 */
function showSave(options) {
  return showPicker(merge({
    title: getLocalizedString("projecteditor.selectFileLabel"),
    mode: Ci.nsIFilePicker.modeSave
  }, options));
}
exports.showSave = showSave;

/**
 * Show a file open dialog
 *
 * @param object options
 *        Additional options as specified in showPicker
 *
 * @return promise
 *         A promise that is resolved when the file has been opened
 */
function showOpen(options) {
  return showPicker(merge({
    title: getLocalizedString("projecteditor.openFileLabel"),
    mode: Ci.nsIFilePicker.modeOpen
  }, options));
}
exports.showOpen = showOpen;

/**
 * Show a folder open dialog
 *
 * @param object options
 *        Additional options as specified in showPicker
 *
 * @return promise
 *         A promise that is resolved when the folder has been opened
 */
function showOpenFolder(options) {
  return showPicker(merge({
    title: getLocalizedString("projecteditor.openFolderLabel"),
    mode: Ci.nsIFilePicker.modeGetFolder
  }, options));
}
exports.showOpenFolder = showOpenFolder;