// Copyright 2013 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';

/**
 * Dialog to confirm the operation for conflicted file operations.
 *
 * @param {HTMLElement} parentNode Node to be parent for this dialog.
 * @constructor
 * @extends {FileManagerDialogBase}
 */
function ConflictDialog(parentNode) {
  FileManagerDialogBase.call(this, parentNode);

  /**
   * Callback to be called when the showing task is completed. The first
   * argument is which button is pressed. The second argument is whether to
   * apply all or not.
   *
   * @type {function(ConflictDialog.Result, boolean)}
   * @private
   */
  this.callback_ = null;

  /**
   * Checkbox to specify whether to apply the selection to all entries or not.
   * @type {HTMLElement}
   * @private
   */
  this.applyAllCheckbox_ = parentNode.ownerDocument.createElement('input');
  this.applyAllCheckbox_.id = 'conflict-confirm-dialog-apply-all-checkbox';
  this.applyAllCheckbox_.type = 'checkbox';

  // Apply all line.
  var applyAllLabel = parentNode.ownerDocument.createElement('label');
  applyAllLabel.textContent = str('CONFLICT_DIALOG_APPLY_TO_ALL');
  applyAllLabel.setAttribute('for', this.applyAllCheckbox_.id);
  var applyAllLine = parentNode.ownerDocument.createElement('div');
  applyAllLine.className = 'apply-all-line';
  applyAllLine.appendChild(this.applyAllCheckbox_);
  applyAllLine.appendChild(applyAllLabel);

  /**
   * Element of the keep both button.
   * @type {HTMLElement}
   * @private
   */
  this.keepBothButton_ = parentNode.ownerDocument.createElement('button');
  this.keepBothButton_.textContent = str('CONFLICT_DIALOG_KEEP_BOTH');
  this.keepBothButton_.addEventListener(
      'click',
      this.hideWithResult_.bind(this, ConflictDialog.Result.KEEP_BOTH));

  /**
   * Element of the replace button.
   * @type {HTMLElement}
   * @private
   */
  this.replaceButton_ = parentNode.ownerDocument.createElement('button');
  this.replaceButton_.textContent = str('CONFLICT_DIALOG_REPLACE');
  this.replaceButton_.addEventListener(
      'click',
      this.hideWithResult_.bind(this, ConflictDialog.Result.REPLACE));

  // Buttons line.
  var buttons = this.okButton_.parentNode;
  buttons.replaceChild(this.keepBothButton_, this.okButton_);
  buttons.appendChild(this.replaceButton_);

  // Frame
  this.frame_.id = 'conflict-confirm-dialog';
  this.frame_.insertBefore(applyAllLine, buttons);
}

/**
 * Result of conflict confirm dialogs.
 * @enum {string}
 * @const
 */
ConflictDialog.Result = Object.freeze({
  KEEP_BOTH: 'keepBoth',
  CANCEL: 'cancel',
  REPLACE: 'replace'
});

ConflictDialog.prototype = {
  __proto__: FileManagerDialogBase.prototype
};

/**
 * Shows the conflict confirm dialog.
 *
 * @param {string} fileName Filename that is conflicted.
 * @param {function(ConflictDialog.Result, boolean)} callback Complete
 *     callbak. See also ConflictDialog#callback_.
 * @return {boolean} True if the dialog can show successfully. False if the
 *     dialog failed to show due to an existing dialog.
 */
ConflictDialog.prototype.show = function(fileName, callback) {
  if (this.callback_)
    return false;

  this.callback_ = callback;
  FileManagerDialogBase.prototype.showOkCancelDialog.call(
      this,
      str('CONFLICT_DIALOG_TITLE'),
      strf('CONFLICT_DIALOG_MESSAGE', fileName));
  return true;
};

/**
 * Handles cancellation.
 * @param {Event} event Click event.
 * @private
 */
ConflictDialog.prototype.onCancelClick_ = function(event) {
  this.hideWithResult_(ConflictDialog.Result.CANCEL);
};

/**
 * Hides the dialog box with the result.
 * @param {ConflictDialog.Result} result Result.
 * @private
 */
ConflictDialog.prototype.hideWithResult_ = function(result) {
  this.hide(function() {
    if (!this.callback_)
      return;
    this.callback_(result, this.applyAllCheckbox_.checked);
    this.callback_ = null;
    this.applyAllCheckbox_.checked = false;
  }.bind(this));
};
