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

cr.exportPath('print_preview_new');
/**
 * |key| is the field in the serialized settings state that corresponds to the
 * setting, or an empty string if the setting should not be saved in the
 * serialized state.
 * @typedef {{
 *   value: *,
 *   unavailableValue: *,
 *   valid: boolean,
 *   available: boolean,
 *   key: string,
 * }}
 */
print_preview_new.Setting;

/**
 * @typedef {{
 *   pages: !print_preview_new.Setting,
 *   copies: !print_preview_new.Setting,
 *   collate: !print_preview_new.Setting,
 *   layout: !print_preview_new.Setting,
 *   color: !print_preview_new.Setting,
 *   mediaSize: !print_preview_new.Setting,
 *   margins: !print_preview_new.Setting,
 *   dpi: !print_preview_new.Setting,
 *   fitToPage: !print_preview_new.Setting,
 *   scaling: !print_preview_new.Setting,
 *   duplex: !print_preview_new.Setting,
 *   cssBackground: !print_preview_new.Setting,
 *   selectionOnly: !print_preview_new.Setting,
 *   headerFooter: !print_preview_new.Setting,
 *   rasterize: !print_preview_new.Setting,
 *   vendorItems: !print_preview_new.Setting,
 *   otherOptions: !print_preview_new.Setting,
 *   ranges: !print_preview_new.Setting,
 * }}
 */
print_preview_new.Settings;

/** @polymerBehavior */
const SettingsBehavior = {
  properties: {
    /** @type {print_preview_new.Settings} */
    settings: {
      type: Object,
      notify: true,
    },
  },

  /**
   * @param {string} settingName Name of the setting to get.
   * @return {print_preview_new.Setting} The setting object.
   */
  getSetting: function(settingName) {
    const setting = /** @type {print_preview_new.Setting} */ (
        this.get(settingName, this.settings));
    assert(!!setting, 'Setting is missing: ' + settingName);
    return setting;
  },

  /**
   * @param {string} settingName Name of the setting to get the value for.
   * @return {*} The value of the setting, accounting for availability.
   */
  getSettingValue: function(settingName) {
    const setting = this.getSetting(settingName);
    return setting.available ? setting.value : setting.unavailableValue;
  },

  /**
   * @param {string} settingName Name of the setting to set
   * @param {boolean | string | number | Array | Object} value The value to set
   *     the setting to.
   */
  setSetting: function(settingName, value) {
    const setting = this.getSetting(settingName);
    this.set(`settings.${settingName}.value`, value);
  },

  /**
   * @param {string} settingName Name of the setting to set
   * @param {boolean} valid Whether the setting value is currently valid.
   */
  setSettingValid: function(settingName, valid) {
    const setting = this.getSetting(settingName);
    // Should not set the setting to invalid if it is not available, as there
    // is no way for the user to change the value in this case.
    if (!valid)
      assert(setting.available, 'Setting is not available: ' + settingName);
    this.set(`settings.${settingName}.valid`, valid);
  }
};
