/* global Whisper, i18n, Signal, passwordUtil */

// eslint-disable-next-line func-names
(function() {
  'use strict';

  window.Whisper = window.Whisper || {};

  Whisper.SeedDialogView = Whisper.View.extend({
    className: 'loki-dialog seed-dialog modal',
    templateName: 'seed-dialog',
    initialize(options = {}) {
      this.okText = options.okText || i18n('ok');
      this.cancelText = options.cancelText || i18n('cancel');
      this.confirmText = options.confirmText || i18n('confirm');
      this.copyText = options.copyText || i18n('copySeed');
      this.seed = options.seed || '-';

      this.render();
      this.showSeedView(false);
      this.initPasswordHash();

      this.$('#password').bind('keyup', event => this.onKeyup(event));
    },
    events: {
      'click .ok': 'close',
      'click .confirm': 'confirmPassword',
      'click .copy-seed': 'copySeed',
    },
    render_attributes() {
      return {
        passwordViewTitle: i18n('passwordViewTitle'),
        seedViewTitle: i18n('seedViewTitle'),
        ok: this.okText,
        copyText: this.copyText,
        confirm: this.confirmText,
        cancel: this.cancelText,
      };
    },
    async initPasswordHash() {
      const hash = await Signal.Data.getPasswordHash();
      this.passwordHash = hash;
      this.showSeedView(!hash);
    },
    showSeedView(show) {
      const seedView = this.$('.seedView');
      const passwordView = this.$('.passwordView');
      if (show) {
        this.$('.seed').html(this.seed);
        seedView.show();
        passwordView.hide();
      } else {
        this.$('.seed').html('');
        passwordView.show();
        this.$('#password').focus();
        seedView.hide();
      }
    },
    confirmPassword() {
      this.$('.error').html();
      const password = this.$('#password').val();
      if (
        this.passwordHash &&
        !passwordUtil.matchesHash(password, this.passwordHash)
      ) {
        this.$('.error').html(`Error: ${i18n('invalidPassword')}`);
        return;
      }

      this.showSeedView(true);
    },
    close() {
      this.remove();
    },
    copySeed() {
      window.clipboard.writeText(this.seed);

      const toast = new Whisper.MessageToastView({
        message: i18n('copiedMnemonic'),
      });
      toast.$el.appendTo(this.$el);
      toast.render();
    },
    onKeyup(event) {
      switch (event.key) {
        case 'Enter':
          this.confirmPassword();
          break;
        case 'Escape':
        case 'Esc':
          this.close();
          break;
        default:
          break;
      }
    },
  });
})();