// 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.
(function() {
  'use strict';

  Polymer({
    is: 'gr-diff-preferences',

    properties: {
      prefs: {
        type: Object,
        notify: true,
      },
      localPrefs: {
        type: Object,
        notify: true,
      },
      disabled: {
        type: Boolean,
        value: false,
        reflectToAttribute: true,
      },

      /** @type {?} */
      _newPrefs: Object,
      _newLocalPrefs: Object,
    },

    observers: [
      '_prefsChanged(prefs.*)',
      '_localPrefsChanged(localPrefs.*)',
    ],

    getFocusStops() {
      return {
        start: this.$.contextSelect,
        end: this.$.saveButton,
      };
    },

    resetFocus() {
      this.$.contextSelect.focus();
    },

    _prefsChanged(changeRecord) {
      const prefs = changeRecord.base;
      // NOTE: Object.assign is NOT automatically a deep copy. If prefs adds
      // an object as a value, it must be marked enumerable.
      this._newPrefs = Object.assign({}, prefs);
      this.$.contextSelect.value = prefs.context;
      this.$.showTabsInput.checked = prefs.show_tabs;
      this.$.showTrailingWhitespaceInput.checked = prefs.show_whitespace_errors;
      this.$.lineWrappingInput.checked = prefs.line_wrapping;
      this.$.syntaxHighlightInput.checked = prefs.syntax_highlighting;
      this.$.automaticReviewInput.checked = !prefs.manual_review;
    },

    _localPrefsChanged(changeRecord) {
      const localPrefs = changeRecord.base || {};
      this._newLocalPrefs = Object.assign({}, localPrefs);
    },

    _handleContextSelectChange(e) {
      const selectEl = Polymer.dom(e).rootTarget;
      this.set('_newPrefs.context', parseInt(selectEl.value, 10));
    },

    _handleShowTabsTap(e) {
      this.set('_newPrefs.show_tabs', Polymer.dom(e).rootTarget.checked);
    },

    _handleShowTrailingWhitespaceTap(e) {
      this.set('_newPrefs.show_whitespace_errors',
          Polymer.dom(e).rootTarget.checked);
    },

    _handleSyntaxHighlightTap(e) {
      this.set('_newPrefs.syntax_highlighting',
          Polymer.dom(e).rootTarget.checked);
    },

    _handlelineWrappingTap(e) {
      this.set('_newPrefs.line_wrapping', Polymer.dom(e).rootTarget.checked);
    },

    _handleAutomaticReviewTap(e) {
      this.set('_newPrefs.manual_review', !Polymer.dom(e).rootTarget.checked);
    },

    _handleSave(e) {
      e.stopPropagation();
      this.prefs = this._newPrefs;
      this.localPrefs = this._newLocalPrefs;
      const el = Polymer.dom(e).rootTarget;
      el.disabled = true;
      this.$.storage.savePreferences(this._localPrefs);
      this._saveDiffPreferences().then(response => {
        el.disabled = false;
        if (!response.ok) { return response; }

        this.$.prefsOverlay.close();
      }).catch(err => {
        el.disabled = false;
      });
    },

    _handleCancel(e) {
      e.stopPropagation();
      this.$.prefsOverlay.close();
    },

    _handlePrefsTap(e) {
      e.preventDefault();
      this._openPrefs();
    },

    open() {
      this.$.prefsOverlay.open().then(() => {
        const focusStops = this.getFocusStops();
        this.$.prefsOverlay.setFocusStops(focusStops);
        this.resetFocus();
      });
    },

    _saveDiffPreferences() {
      return this.$.restAPI.saveDiffPreferences(this.prefs);
    },
  });
})();