import test from "node:test";
import assert from "node:assert/strict";
import { mkdtempSync, rmSync } from "node:fs";
import { join } from "node:path";
import { tmpdir } from "node:os";

let tmpDir: string;
let origHome: string | undefined;

test.before(() => {
  tmpDir = mkdtempSync(join(tmpdir(), "omniroute-tray-test-"));
  origHome = process.env.HOME;
  // Redirecionar HOME para tmpDir para isolar testes de autostart
  process.env.HOME = tmpDir;
});

test.after(() => {
  if (origHome === undefined) delete process.env.HOME;
  else process.env.HOME = origHome;
  try {
    rmSync(tmpDir, { recursive: true, force: true });
  } catch {}
});

test("tray/index.mjs pode ser importado sem erro", async () => {
  const mod = await import("../../bin/cli/tray/index.mjs");
  assert.equal(typeof mod.initTray, "function");
  assert.equal(typeof mod.killTray, "function");
  assert.equal(typeof mod.isTrayActive, "function");
  assert.equal(typeof mod.isTraySupported, "function");
});

test("isTraySupported retorna boolean", async () => {
  const { isTraySupported } = await import("../../bin/cli/tray/index.mjs");
  assert.equal(typeof isTraySupported(), "boolean");
});

test("isTrayActive retorna false antes de iniciar", async () => {
  const { isTrayActive } = await import("../../bin/cli/tray/index.mjs");
  assert.equal(isTrayActive(), false);
});

test("tray/autostart.mjs pode ser importado sem erro", async () => {
  const mod = await import("../../bin/cli/tray/autostart.mjs");
  assert.equal(typeof mod.enable, "function");
  assert.equal(typeof mod.disable, "function");
  assert.equal(typeof mod.isAutostartEnabled, "function");
});

test("autostart.isAutostartEnabled retorna boolean", async () => {
  const { isAutostartEnabled } = await import("../../bin/cli/tray/autostart.mjs");
  const result = isAutostartEnabled();
  assert.equal(typeof result, "boolean");
  assert.equal(result, false, "autostart não deve estar habilitado em tmpDir isolado");
});

test("autostart.enable registers Linux autostart (systemd and/or desktop)", async () => {
  if (process.platform !== "linux") return;
  const { enable, isAutostartEnabled, disable, getAutostartStatus } =
    await import("../../bin/cli/tray/autostart.mjs");
  const ok = enable();
  assert.equal(typeof ok, "boolean");
  if (ok) {
    assert.equal(isAutostartEnabled(), true, "isAutostartEnabled deve ser true após enable");
    const status = getAutostartStatus();
    assert.ok(
      status.mechanism === "systemd-user" || status.mechanism === "xdg-desktop",
      "expected systemd-user or xdg-desktop mechanism"
    );
  }
  disable();
  assert.equal(isAutostartEnabled(), false, "isAutostartEnabled deve ser false após disable");
});

test("commands/tray.mjs pode ser importado sem erro", async () => {
  const mod = await import("../../bin/cli/commands/tray.mjs");
  assert.equal(typeof mod.registerTray, "function");
});

test("commands/autostart.mjs pode ser importado sem erro", async () => {
  const mod = await import("../../bin/cli/commands/autostart.mjs");
  assert.equal(typeof mod.registerAutostart, "function");
});
