/* globals $ */
var _ = require('underscore');
var ko = require('knockout');
var moment = require('moment-timezone');
var dom = require('../lib/dom');
var dispose = require('../lib/dispose');
var kd = require('../lib/koDom');
var kf = require('../lib/koForm');
var DateTextBox = require('./DateTextBox');
var gutil = require('app/common/gutil');

const {fromKoSave} = require('app/client/lib/fromKoSave');
const {alignmentSelect} = require('app/client/ui2018/buttonSelect');
const {testId} = require('app/client/ui2018/cssVars');
const {cssRow} = require('app/client/ui/RightPanel');

/**
 * DateTimeTextBox - The most basic widget for displaying date and time information.
 */
function DateTimeTextBox(field) {
  DateTextBox.call(this, field);

  this.timezoneOptions = moment.tz.names();

  this.isInvalidTimezone = ko.observable(false);

  // Returns the timezone from the end of the type string
  this.timezone = this.autoDispose(ko.computed({
    owner: this,
    read: function() {
      return gutil.removePrefix(field.column().type(), "DateTime:");
    },
    write: function(val) {
      if (_.contains(this.timezoneOptions, val)) {
        field.column().type.setAndSave('DateTime:' + val);
        this.isInvalidTimezone(false);
      } else {
        this.isInvalidTimezone(true);
      }
    }
  }));

  this.timeFormat = this.options.prop('timeFormat');
  this.isCustomTimeFormat = this.options.prop('isCustomTimeFormat');

  this.timeFormatOptions = [
    'h:mma',
    'h:mma z',
    'HH:mm',
    'HH:mm z',
    'HH:mm:ss',
    'HH:mm:ss z',
    'Custom'
  ];

  // Helper to set 'timeFormat' and 'isCustomTimeFormat' from the set of default time format strings.
  this.standardTimeFormat = this.autoDispose(ko.computed({
    owner: this,
    read: function() { return this.isCustomTimeFormat() ? 'Custom' : this.timeFormat(); },
    write: function(val) {
      if (val === 'Custom') { this.isCustomTimeFormat.setAndSave(true); }
      else {
        this.isCustomTimeFormat.setAndSave(false);
        this.timeFormat.setAndSave(val);
      }
    }
  }));
}
dispose.makeDisposable(DateTimeTextBox);
_.extend(DateTimeTextBox.prototype, DateTextBox.prototype);

/**
 * Builds the config dom for the DateTime TextBox. If isTransformConfig is true,
 * builds only the necessary dom for the transform config menu.
 */
DateTimeTextBox.prototype.buildConfigDom = function(isTransformConfig) {
  var self = this;

  // Set up autocomplete for the timezone entry.
  var textDom = kf.text(self.timezone);
  var tzInput = textDom.querySelector('input');
  $(tzInput).autocomplete({
    source: self.timezoneOptions,
    minLength: 1,
    delay: 10,
    select: function(event, ui) {
      self.timezone(ui.item.value);
      return false;
    }
  });

  return dom('div',
    kf.row(
      1, dom('div.glyphicon.glyphicon-globe.config_icon'),
      8, kf.label('Timezone'),
      9, dom(textDom,
        kd.toggleClass('invalid-text', this.isInvalidTimezone),
        dom.testId("Widget_tz"),
        testId('widget-tz'))
    ),
    self.buildDateConfigDom(),
    kf.row(
      1, dom('div.glyphicon.glyphicon-dashboard.config_icon'),
      8, kf.label('Time Format'),
      9, dom(kf.select(self.standardTimeFormat, self.timeFormatOptions), dom.testId("Widget_timeFormat"))
    ),
    kd.maybe(self.isCustomTimeFormat, function() {
      return dom(kf.text(self.timeFormat), dom.testId("Widget_timeCustomFormat"));
    }),
    isTransformConfig ? null : cssRow(
      alignmentSelect(fromKoSave(this.alignment))
    )
  );
};

DateTimeTextBox.prototype.buildTransformConfigDom = function() {
  return this.buildConfigDom(true);
};

module.exports = DateTimeTextBox;