/* global storage: false */
/* global textsecure: false */
/* global i18n: false */
/* global Whisper: false */

/* eslint-disable */

(function() {
  'use strict';
  window.Whisper = window.Whisper || {};
  const { Database } = window.Whisper;
  const { OS, Logs } = window.Signal;
  const { Settings } = window.Signal.Types;

  var CheckboxView = Whisper.View.extend({
    initialize: function(options) {
      this.name = options.name;
      this.defaultValue = options.defaultValue;
      this.event = options.event;
      this.populate();
    },
    events: {
      change: 'change',
    },
    change: function(e) {
      var value = e.target.checked;
      storage.put(this.name, value);
      console.log(this.name, 'changed to', value);
      if (this.event) {
        this.$el.trigger(this.event);
      }
    },
    populate: function() {
      var value = storage.get(this.name, this.defaultValue);
      this.$('input').prop('checked', !!value);
    },
  });
  var RadioButtonGroupView = Whisper.View.extend({
    initialize: function(options) {
      this.name = options.name;
      this.defaultValue = options.defaultValue;
      this.event = options.event;
      this.populate();
    },
    events: {
      change: 'change',
    },
    change: function(e) {
      var value = this.$(e.target).val();
      storage.put(this.name, value);
      console.log(this.name, 'changed to', value);
      if (this.event) {
        this.$el.trigger(this.event);
      }
    },
    populate: function() {
      var value = storage.get(this.name, this.defaultValue);
      this.$('#' + this.name + '-' + value).attr('checked', 'checked');
    },
  });
  Whisper.SettingsView = Whisper.View.extend({
    className: 'settings modal expand',
    templateName: 'settings',
    initialize: function() {
      this.deviceName = textsecure.storage.user.getDeviceName();
      this.render();
      new RadioButtonGroupView({
        el: this.$('.notification-settings'),
        defaultValue: 'message',
        name: 'notification-setting',
      });
      new RadioButtonGroupView({
        el: this.$('.theme-settings'),
        defaultValue: 'android',
        name: 'theme-setting',
        event: 'change-theme',
      });
      if (Settings.isAudioNotificationSupported()) {
        new CheckboxView({
          el: this.$('.audio-notification-setting'),
          defaultValue: false,
          name: 'audio-notification',
        });
      }
      new CheckboxView({
        el: this.$('.menu-bar-setting'),
        defaultValue: false,
        name: 'hide-menu-bar',
        event: 'change-hide-menu',
      });
      if (textsecure.storage.user.getDeviceId() != '1') {
        var syncView = new SyncView().render();
        this.$('.sync-setting').append(syncView.el);
      }
    },
    events: {
      'click .close': 'remove',
      'click .clear-data': 'onClearData',
    },
    render_attributes: function() {
      return {
        deviceNameLabel: i18n('deviceName'),
        deviceName: this.deviceName,
        theme: i18n('theme'),
        notifications: i18n('notifications'),
        notificationSettingsDialog: i18n('notificationSettingsDialog'),
        settings: i18n('settings'),
        disableNotifications: i18n('disableNotifications'),
        nameAndMessage: i18n('nameAndMessage'),
        noNameOrMessage: i18n('noNameOrMessage'),
        nameOnly: i18n('nameOnly'),
        audioNotificationDescription: i18n('audioNotificationDescription'),
        isAudioNotificationSupported: Settings.isAudioNotificationSupported(),
        themeAndroidDark: i18n('themeAndroidDark'),
        hideMenuBar: i18n('hideMenuBar'),
        clearDataHeader: i18n('clearDataHeader'),
        clearDataButton: i18n('clearDataButton'),
        clearDataExplanation: i18n('clearDataExplanation'),
      };
    },
    onClearData: function() {
      var clearDataView = new ClearDataView().render();
      $('body').append(clearDataView.el);
    },
  });

  /* jshint ignore:start */
  /* eslint-enable */

  const CLEAR_DATA_STEPS = {
    CHOICE: 1,
    DELETING: 2,
  };
  const ClearDataView = Whisper.View.extend({
    templateName: 'clear-data',
    className: 'full-screen-flow overlay',
    events: {
      'click .cancel': 'onCancel',
      'click .delete-all-data': 'onDeleteAllData',
    },
    initialize() {
      this.step = CLEAR_DATA_STEPS.CHOICE;
    },
    onCancel() {
      this.remove();
    },
    async onDeleteAllData() {
      console.log('Deleting everything!');
      this.step = CLEAR_DATA_STEPS.DELETING;
      this.render();

      try {
        await Database.close();
        console.log('All database connections closed. Starting delete.');
      } catch (error) {
        console.log('Something went wrong closing all database connections.');
      }

      this.clearAllData();
    },
    async clearAllData() {
      try {
        await Promise.all([Logs.deleteAll(), Database.drop()]);
      } catch (error) {
        console.log(
          'Something went wrong deleting all data:',
          error && error.stack ? error.stack : error
        );
      }
      window.restart();
    },
    render_attributes() {
      return {
        isStep1: this.step === CLEAR_DATA_STEPS.CHOICE,
        header: i18n('deleteAllDataHeader'),
        body: i18n('deleteAllDataBody'),
        cancelButton: i18n('cancel'),
        deleteButton: i18n('deleteAllDataButton'),

        isStep2: this.step === CLEAR_DATA_STEPS.DELETING,
        deleting: i18n('deleteAllDataProgress'),
      };
    },
  });

  /* eslint-disable */
  /* jshint ignore:end */

  var SyncView = Whisper.View.extend({
    templateName: 'syncSettings',
    className: 'syncSettings',
    events: {
      'click .sync': 'sync',
    },
    enable: function() {
      this.$('.sync').text(i18n('syncNow'));
      this.$('.sync').removeAttr('disabled');
    },
    disable: function() {
      this.$('.sync').attr('disabled', 'disabled');
      this.$('.sync').text(i18n('syncing'));
    },
    onsuccess: function() {
      storage.put('synced_at', Date.now());
      console.log('sync successful');
      this.enable();
      this.render();
    },
    ontimeout: function() {
      console.log('sync timed out');
      this.$('.synced_at').hide();
      this.$('.sync_failed').show();
      this.enable();
    },
    sync: function() {
      this.$('.sync_failed').hide();
      if (textsecure.storage.user.getDeviceId() != '1') {
        this.disable();
        var syncRequest = window.getSyncRequest();
        syncRequest.addEventListener('success', this.onsuccess.bind(this));
        syncRequest.addEventListener('timeout', this.ontimeout.bind(this));
      } else {
        console.log('Tried to sync from device 1');
      }
    },
    render_attributes: function() {
      var attrs = {
        sync: i18n('sync'),
        syncNow: i18n('syncNow'),
        syncExplanation: i18n('syncExplanation'),
        syncFailed: i18n('syncFailed'),
      };
      var date = storage.get('synced_at');
      if (date) {
        date = new Date(date);
        attrs.lastSynced = i18n('lastSynced');
        attrs.syncDate = date.toLocaleDateString();
        attrs.syncTime = date.toLocaleTimeString();
      }
      return attrs;
    },
  });
})();
