/**
 * Home comparison settings.
 */
beestat.component.card.comparison_settings = function() {
  var self = this;

  /*
   * If the thermostat_group changes that means the property_type could change
   * and thus need to rerender.
   */
  beestat.dispatcher.addEventListener('cache.thermostat_group', function() {
    self.rerender();
  });

  beestat.component.card.apply(this, arguments);
};
beestat.extend(beestat.component.card.comparison_settings, beestat.component.card);

/**
 * Decorate
 *
 * @param {rocket.Elements} parent
 */
beestat.component.card.comparison_settings.prototype.decorate_contents_ = function(parent) {
  var self = this;

  var thermostat = beestat.cache.thermostat[beestat.setting('thermostat_id')];
  var thermostat_group = beestat.cache.thermostat_group[thermostat.thermostat_group_id];

  var row;

  // Row
  row = $.createElement('div').addClass('row');
  parent.appendChild(row);

  var column_region = $.createElement('div').addClass([
    'column',
    'column_4'
  ]);
  row.appendChild(column_region);
  this.decorate_region_(column_region);

  var column_property = $.createElement('div').addClass([
    'column',
    'column_8'
  ]);
  row.appendChild(column_property);
  this.decorate_property_(column_property);

  /*
   * If the data is available, then get the data if we don't already have it
   * loaded. If the data is not available, poll until it becomes available.
   */
  if (thermostat_group.temperature_profile === null) {
    // This will show the loading screen.
    self.data_available_();

    var poll_interval = 10000;

    beestat.add_poll_interval(poll_interval);
    beestat.dispatcher.addEventListener('poll.home_comparisons_load', function() {
      if (self.data_available_() === true) {
        beestat.remove_poll_interval(poll_interval);
        beestat.dispatcher.removeEventListener('poll.home_comparisons_load');

        new beestat.api()
          .add_call(
            'thermostat_group',
            'generate_temperature_profiles',
            {},
            'generate_temperature_profiles'
          )
          .add_call(
            'thermostat_group',
            'read_id',
            {},
            'thermostat_group'
          )
          .set_callback(function(response) {
            beestat.cache.set('thermostat_group', response.thermostat_group);
            (new beestat.layer.home_comparisons()).render();
          })
          .send();
      }
    });
  }
};

/**
 * Decorate the region options.
 *
 * @param {rocket.ELements} parent
 */
beestat.component.card.comparison_settings.prototype.decorate_region_ = function(parent) {
  var self = this;

  (new beestat.component.title('Region')).render(parent);

  var regions = [
    'nearby',
    'global'
  ];

  var current_region = beestat.setting('comparison_region');

  var color = beestat.style.color.green.base;

  var button_group = new beestat.component.button_group();
  regions.forEach(function(region) {
    var button = new beestat.component.button()
      .set_background_hover_color(color)
      .set_text_color('#fff')
      .set_text(region.charAt(0).toUpperCase() + region.slice(1));

    if (current_region === region) {
      button.set_background_color(color);
    } else {
      button
        .set_background_color(beestat.style.color.bluegray.light)
        .addEventListener('click', function() {
          // Update the setting
          beestat.setting('comparison_region', region);

          // Rerender real quick to change the selected button
          self.rerender();

          // Open up the loading window.
          self.show_loading_('Calculating Score for ' + region + ' region');

          beestat.home_comparisons.get_comparison_scores(function() {
            // Rerender to get rid of the loader.
            self.rerender();
          });
        });
    }

    button_group.add_button(button);
  });
  button_group.render(parent);
};

/**
 * Decorate the property type options.
 *
 * @param {rocket.ELements} parent
 */
beestat.component.card.comparison_settings.prototype.decorate_property_ = function(parent) {
  var self = this;

  var thermostat = beestat.cache.thermostat[beestat.setting('thermostat_id')];
  var thermostat_group = beestat.cache.thermostat_group[
    thermostat.thermostat_group_id
  ];

  (new beestat.component.title('Property')).render(parent);

  var property_types = [];
  property_types.push({
    'value': 'similar',
    'text': 'Very Similar'
  });

  if (thermostat_group.property_structure_type !== null) {
    property_types.push({
      'value': 'same_structure',
      'text': 'Type: ' +
        thermostat_group.property_structure_type.charAt(0).toUpperCase() +
        thermostat_group.property_structure_type.slice(1)
    });
  }

  property_types.push({
    'value': 'all',
    'text': 'All'
  });

  var current_property_type = beestat.setting('comparison_property_type');

  var color = beestat.style.color.purple.base;

  var button_group = new beestat.component.button_group();
  property_types.forEach(function(property_type) {
    var button = new beestat.component.button()
      .set_background_hover_color(color)
      .set_text_color('#fff')
      .set_text(property_type.text);

    if (current_property_type === property_type.value) {
      button.set_background_color(color);
    } else {
      button
        .set_background_color(beestat.style.color.bluegray.light)
        .addEventListener('click', function() {
          // Update the setting
          beestat.setting('comparison_property_type', property_type.value);

          // Rerender real quick to change the selected button
          self.rerender();

          // Open up the loading window.
          self.show_loading_('Calculating Score for ' + property_type.text);

          beestat.home_comparisons.get_comparison_scores(function() {
            // Rerender to get rid of the loader.
            self.rerender();
          });
        });
    }

    button_group.add_button(button);
  });
  button_group.render(parent);
};

/**
 * Get the title of the card.
 *
 * @return {string} The title of the card.
 */
beestat.component.card.comparison_settings.prototype.get_title_ = function() {
  return 'Comparison Settings';
};

/**
 * Get the subtitle of the card.
 *
 * @return {string} The subtitle of the card.
 */
beestat.component.card.comparison_settings.prototype.get_subtitle_ = function() {
  var thermostat = beestat.cache.thermostat[beestat.setting('thermostat_id')];
  var thermostat_group = beestat.cache.thermostat_group[
    thermostat.thermostat_group_id
  ];
  var address = beestat.cache.address[thermostat_group.address_id];

  var string = '';

  if (address.normalized !== null && address.normalized.delivery_line_1 !== undefined) {
    string = address.normalized.delivery_line_1;
  } else if (address.normalized !== null && address.normalized.address1 !== undefined) {
    string = address.normalized.address1;
  } else {
    string = 'Unknown Address';
  }

  var count = 0;
  $.values(beestat.cache.thermostat).forEach(function(t) {
    if (t.thermostat_group_id === thermostat_group.thermostat_group_id) {
      count++;
    }
  });

  string += ' (' + count + ' Thermostat' + (count > 1 ? 's' : '') + ')';

  return string;
};

/**
 * Decorate the menu.
 *
 * @param {rocket.Elements} parent
 */
beestat.component.card.comparison_settings.prototype.decorate_top_right_ = function(parent) {
  var menu = (new beestat.component.menu()).render(parent);

  menu.add_menu_item(new beestat.component.menu_item()
    .set_text('Help')
    .set_icon('help_circle')
    .set_callback(function() {
      (new beestat.component.modal.help_comparison_settings()).render();
    }));
};

/**
 * Determine whether or not all of the data has been loaded so the scores can
 * be generated.
 *
 * @return {boolean} Whether or not all of the data has been loaded.
 */
beestat.component.card.comparison_settings.prototype.data_available_ = function() {
  var sync_progress = beestat.get_sync_progress(beestat.setting('thermostat_id'));

  if (sync_progress >= 95) {
    this.show_loading_('Calculating Scores');
  } else {
    this.show_loading_('Syncing Data (' +
      Math.round(sync_progress) +
      '%)');
  }

  return sync_progress === 100;
};
