import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";

/**
 * Fail-Fast-Verhalten der kanonischen Env-Ladung.
 * Wir importieren env.ts dynamisch, damit jeder Test mit frischem process.env
 * und frischem Modul-Cache läuft.
 */

const VALID_ENV = {
  NODE_ENV: "test",
  DATABASE_URL: "postgres://user:pass@localhost:5432/floriannetz",
  AUTH_SECRET: "x".repeat(32),
  AUTH_URL: "http://localhost:3000",
  AUTHENTIK_ISSUER: "http://localhost:9000/application/o/floriannetz/",
  AUTHENTIK_CLIENT_ID: "client-id",
  AUTHENTIK_CLIENT_SECRET: "client-secret",
};

let snapshot: NodeJS.ProcessEnv;

beforeEach(() => {
  snapshot = { ...process.env };
  vi.resetModules();
});

afterEach(() => {
  process.env = snapshot;
});

function setEnv(overrides: Record<string, string | undefined>) {
  for (const [k, v] of Object.entries({ ...VALID_ENV, ...overrides })) {
    if (v === undefined) {
      delete process.env[k];
    } else {
      process.env[k] = v;
    }
  }
}

describe("env", () => {
  it("lädt gültige Umgebungsvariablen erfolgreich", async () => {
    setEnv({});
    const mod = await import("../env");
    expect(mod.env.DATABASE_URL).toBe(VALID_ENV.DATABASE_URL);
    expect(mod.env.GEO_HTTP_TIMEOUT_MS).toBe(4000);
  });

  it("setzt isHttps=false bei http AUTH_URL", async () => {
    setEnv({ AUTH_URL: "http://localhost:3000" });
    const mod = await import("../env");
    expect(mod.isHttps).toBe(false);
  });

  it("setzt isHttps=true bei https AUTH_URL", async () => {
    setEnv({ AUTH_URL: "https://florian.example.at" });
    const mod = await import("../env");
    expect(mod.isHttps).toBe(true);
  });

  it("wirft Fehler (Fail-Fast) bei fehlender DATABASE_URL", async () => {
    setEnv({ DATABASE_URL: undefined });
    await expect(import("../env")).rejects.toThrow(
      /Umgebungsvariablen-Validierung fehlgeschlagen/,
    );
  });

  it("wirft Fehler bei zu kurzem AUTH_SECRET", async () => {
    setEnv({ AUTH_SECRET: "kurz" });
    await expect(import("../env")).rejects.toThrow(
      /Umgebungsvariablen-Validierung fehlgeschlagen/,
    );
  });
});
