// Gnome imports
import Adw from "gi://Adw";
import Gtk from "gi://Gtk";
import GObject from "gi://GObject";

// Shared state
import { Logger } from "../shared/logger.js";
import { production } from "../shared/settings.js";

// Prefs UI
import { DropDownRow, SwitchRow, PreferencesPage, EntryRow } from "./widgets.js";

// Extension imports
import { gettext as _ } from "resource:///org/gnome/Shell/Extensions/js/extensions/prefs.js";
import { PACKAGE_VERSION } from "resource:///org/gnome/Shell/Extensions/js/misc/config.js";

import { developers } from "./metadata.js";

function showAboutWindow(parent, { version, description: comments }) {
  version = version ?? "development";
  const abt = new Adw.AboutWindow({
    ...(parent && { transient_for: parent }),
    // TODO: fetch these from github at build time
    application_name: _("Forge"),
    application_icon: "forge-logo-symbolic",
    version: `${PACKAGE_VERSION}-${version.toString()}`,
    copyright: `© 2021-${new Date().getFullYear()} jmmaranan`,
    issue_url: "https://github.com/forge-ext/forge/issues/new",
    license_type: Gtk.License.GPL_3_0,
    website: "https://github.com/forge-ext/forge",
    developers,
    comments,
    designers: [],
    translator_credits: _("translator-credits"),
  });
  abt.present();
}

function makeAboutButton(parent, metadata) {
  const button = new Gtk.Button({
    icon_name: "help-about-symbolic",
    tooltip_text: _("About"),
    valign: Gtk.Align.CENTER,
  });
  button.connect("clicked", () => showAboutWindow(parent, metadata));
  return button;
}

export class SettingsPage extends PreferencesPage {
  static {
    GObject.registerClass(this);
  }

  constructor({ settings, window, metadata }) {
    super({ title: _("Tiling"), icon_name: "view-grid-symbolic" });
    this.add_group({
      title: _("Behavior"),
      description: _("Change how the tiling behaves"),
      header_suffix: makeAboutButton(window, metadata),
      children: [
        new SwitchRow({
          title: _("Focus on Hover"),
          subtitle: _("Window focus follows the pointer"),
          experimental: true,
          settings,
          bind: "focus-on-hover-enabled",
        }),
        new SwitchRow({
          title: _("Move pointer with focused window"),
          subtitle: _("Moves the pointer when focusing or swapping via keyboard"),
          experimental: true,
          settings,
          bind: "move-pointer-focus-enabled",
        }),
        new SwitchRow({
          title: _("Quarter tiling"),
          subtitle: _("Places new windows in a clock-wise fashion"),
          experimental: true,
          settings,
          bind: "auto-split-enabled",
        }),
        new SwitchRow({
          title: _("Stacked tiling"),
          subtitle: _("Stacks windows on top of each other while still tiling them"),
          experimental: true,
          settings,
          bind: "stacked-tiling-mode-enabled",
        }),
        new SwitchRow({
          title: _("Tabbed tiling"),
          subtitle: _("Groups windows as tabs"),
          experimental: true,
          settings,
          bind: "tabbed-tiling-mode-enabled",
        }),
        new SwitchRow({
          title: _("Auto exit tabbed tiling"),
          subtitle: _("Exit tabbed tiling mode when only a single tab remains"),
          settings,
          bind: "auto-exit-tabbed",
        }),
        new DropDownRow({
          title: _("Drag-and-drop behavior"),
          subtitle: _("What to do when dragging one window on top of another"),
          settings,
          type: "s",
          bind: "dnd-center-layout",
          items: [
            { id: "swap", name: _("Swap") },
            { id: "tabbed", name: _("Tabbed") },
            { id: "stacked", name: _("Stacked") },
          ],
        }),
        new SwitchRow({
          title: _("Always on Top mode for floating windows"),
          subtitle: _("Makes floating windows appear above tiled windows"),
          experimental: true,
          settings,
          bind: "float-always-on-top-enabled",
        }),
      ],
    });
    this.add_group({
      title: _("Non-tiling workspaces"),
      description: _("Disables tiling on specified workspaces. Starts from 0, separated by commas"),
      children: [
        new EntryRow({
          title: _("Example: 0,1,2"),
          settings,
          bind: "workspace-skip-tile",
        }),
      ],
    });
    if (!production) {
      this.add_group({
        title: _("Logger"),
        children: [
          new DropDownRow({
            title: _("Log level"),
            settings,
            bind: "log-level",
            items: Object.entries(Logger.LOG_LEVELS).map(([name, id]) => ({ id, name })),
            type: "u",
          }),
        ],
      });
    }
  }
}
