text: // -*- mode: js2; indent-tabs-mode: nil; js2-basic-offset: 4 -*-
  // Adapted from lockkeys@vaina.lt and https://github.com/pop-os/gnome-shell-extension-pop-suspend-button
  
  const Gtk = imports.gi.Gtk;
  const Me = imports.misc.extensionUtils.getCurrentExtension();
  const Gettext = imports.gettext.domain('gnome-shell-extension-do-not-disturb');
  const _ = Gettext.gettext;
  const Settings = Me.imports.settings;
  const Lib = Me.imports.lib;
  
  function init() {}
  
  /**
   * Builds the GTK widget which displays all of the application specific settings.
   *
   * @returns {Gtk.Box} - The frame to display.
   */
  function buildPrefsWidget() {
    let settings = new Settings.SettingsManager();
    let frame = new Gtk.Box({
      orientation: Gtk.Orientation.VERTICAL,
      border_width: 10,
      margin: 20,
      spacing: 8
    });
  
    var box = new Gtk.Box({
      orientation: Gtk.Orientation.HORIZONTAL
    });
  
    frame.add(createSwitch(settings.shouldShowIcon(), (b) => {settings.setShowIcon(b); if (b) { box.show(); } else { box.hide(); } }, _("Enabled Icon"), _("Show an indicator icon when do not disturb is enabled.")));
  
    var indicatorLbl = new Gtk.Label({
      label: "Notification Indicator",
      xalign: 0
    });
  
    var showCountRadio = createRadioButton(settings.showCount, (b) => { settings.showCount = b }, _("Count"));
    var showDotRadio = createRadioButton(settings.showDot, (b) => { settings.showDot = b }, _("Dot"), showCountRadio);
    var showNothingRadio = createRadioButton(!(settings.showCount || settings.showDot), (b) => { }, _("Nothing"), showCountRadio);
  
  
    box.pack_start(indicatorLbl, true, true, 0);
    box.add(showCountRadio);
    box.add(showDotRadio);
    box.add(showNothingRadio);
  
    frame.add(box);
  
    frame.add(createSwitch(settings.shouldMuteSound(), (b) => settings.setShouldMuteSound(b), _("Mute Sounds"), _("Mutes all sound when do not disturb is enabled.")));
  
    frame.show_all();
  
    if (!settings.shouldShowIcon()){
      box.hide();
    }
  
    return frame;
  }
  
  function createRadioButton(active, set, text, group){
    var widget;
    if (group){
      widget = Gtk.RadioButton.new_with_label_from_widget(group, text);
      widget.set_active(active);
    } else {
      widget = new Gtk.RadioButton({
        active: active,
        label: text
      });
    }
    widget.connect('notify::active', function(switch_widget) {
      set(switch_widget.active);
    });
  
    return widget;
  }
  
  /**
   * Creates a switch setting.
   *
   * @param {boolean} active - The starting state of the switch.
   * @param {(boolean) => ()} set - The setter function which is passed the value of the switch on state change.
   * @param {string} text - The label of the widget.
   * @param {string} tooltip - The description text to display on hover.
   * @returns {Gtk.Box} - The widget containing the switch and label.
   */
  function createSwitch(active, set, text, tooltip) {
    let box = new Gtk.Box({
      orientation: Gtk.Orientation.HORIZONTAL
    });
    let label = new Gtk.Label({
      label: text,
      xalign: 0,
      tooltip_text: tooltip
    });
    let widget = new Gtk.Switch({
      active: active
    });
    widget.connect('notify::active', function(switch_widget) {
      set(switch_widget.active);
    });
  
    box.pack_start(label, true, true, 0);
    box.add(widget);
    return box;
  }
  
  Lib.initTranslations(Me);
  