// Copyright 2017 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.

import 'chrome://resources/cr_elements/cr_button/cr_button.m.js';
import 'chrome://resources/cr_elements/cr_dialog/cr_dialog.m.js';
import 'chrome://resources/cr_elements/cr_input/cr_input.m.js';
import 'chrome://resources/cr_elements/shared_style_css.m.js';
import './strings.m.js';

import {assert} from 'chrome://resources/js/assert.m.js';
import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';

import {highlightUpdatedItems, trackUpdatedItems} from './api_listener.js';
import {DialogFocusManager} from './dialog_focus_manager.js';
import {BookmarkNode} from './types.js';

Polymer({
  is: 'bookmarks-edit-dialog',

  _template: html`{__html_template__}`,

  properties: {
    /** @private */
    isFolder_: Boolean,

    /** @private */
    isEdit_: Boolean,

    /**
     * Item that is being edited, or null when adding.
     * @private {?BookmarkNode}
     */
    editItem_: Object,

    /**
     * Parent node for the item being added, or null when editing.
     * @private {?string}
     */
    parentId_: String,

    /** @private */
    titleValue_: String,

    /** @private */
    urlValue_: String,
  },

  /**
   * Show the dialog to add a new folder (if |isFolder|) or item, which will be
   * inserted into the tree as a child of |parentId|.
   * @param {boolean} isFolder
   * @param {string} parentId
   */
  showAddDialog(isFolder, parentId) {
    this.reset_();
    this.isEdit_ = false;
    this.isFolder_ = isFolder;
    this.parentId_ = parentId;

    DialogFocusManager.getInstance().showDialog(this.$.dialog);
  },

  /**
   * Show the edit dialog for |editItem|.
   * @param {BookmarkNode} editItem
   */
  showEditDialog(editItem) {
    this.reset_();
    this.isEdit_ = true;
    this.isFolder_ = !editItem.url;
    this.editItem_ = editItem;

    this.titleValue_ = editItem.title;
    if (!this.isFolder_) {
      this.urlValue_ = assert(editItem.url);
    }

    DialogFocusManager.getInstance().showDialog(this.$.dialog);
  },

  /**
   * Clear out existing values from the dialog, allowing it to be reused.
   * @private
   */
  reset_() {
    this.editItem_ = null;
    this.parentId_ = null;
    this.$.url.invalid = false;
    this.titleValue_ = '';
    this.urlValue_ = '';
  },

  /**
   * @param {boolean} isFolder
   * @param {boolean} isEdit
   * @return {string}
   * @private
   */
  getDialogTitle_(isFolder, isEdit) {
    let title;
    if (isEdit) {
      title = isFolder ? 'renameFolderTitle' : 'editBookmarkTitle';
    } else {
      title = isFolder ? 'addFolderTitle' : 'addBookmarkTitle';
    }

    return loadTimeData.getString(title);
  },

  /**
   * Validates the value of the URL field, returning true if it is a valid URL.
   * May modify the value by prepending 'http://' in order to make it valid.
   * @return {boolean}
   * @private
   */
  validateUrl_() {
    const urlInput = /** @type {CrInputElement} */ (this.$.url);
    const originalValue = this.urlValue_;

    if (urlInput.validate()) {
      return true;
    }

    this.urlValue_ = 'http://' + originalValue;

    if (urlInput.validate()) {
      return true;
    }

    this.urlValue_ = originalValue;
    return false;
  },

  /** @private */
  onSaveButtonTap_() {
    const edit = {'title': this.titleValue_};
    if (!this.isFolder_) {
      if (!this.validateUrl_()) {
        return;
      }

      edit['url'] = this.urlValue_;
    }

    if (this.isEdit_) {
      chrome.bookmarks.update(this.editItem_.id, edit);
    } else {
      edit['parentId'] = this.parentId_;
      trackUpdatedItems();
      chrome.bookmarks.create(edit, highlightUpdatedItems);
    }
    this.$.dialog.close();
  },

  /** @private */
  onCancelButtonTap_() {
    this.$.dialog.cancel();
  },
});
