import fs from "node:fs";
import path from "node:path";
import {spawn} from "node:child_process";

const root = path.resolve(import.meta.dirname, "..");
const dataDir = path.join(root, ".smoke-data");
fs.rmSync(dataDir, {recursive:true, force:true});
fs.mkdirSync(dataDir, {recursive:true});

const env = {
  ...process.env,
  DANOGO_MOBILE_OTA_HOST: "127.0.0.1",
  DANOGO_MOBILE_OTA_PORT: "18082",
  DANOGO_MOBILE_OTA_DATA_DIR: dataDir,
  DANOGO_MOBILE_OTA_ADMIN_TOKEN: "smoke-admin-token",
};

const child = spawn(process.execPath, ["src/server.mjs"], {
  cwd: root,
  env,
  stdio: ["ignore", "pipe", "pipe"],
});

let stderr = "";
child.stderr.on("data", (b) => { stderr += String(b); });

const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));

async function waitForHealth() {
  for (let i=0;i<50;i+=1) {
    try {
      const res = await fetch("http://127.0.0.1:18082/health");
      if (res.ok) return await res.json();
    } catch {}
    await sleep(100);
  }
  throw new Error("ota_health_timeout");
}

try {
  const health = await waitForHealth();
  if (health.ok !== true || health.database !== "sqlite") {
    throw new Error("ota_health_invalid");
  }

  const version = await fetch("http://127.0.0.1:18082/mobile-updates/version");
  if (!version.ok) throw new Error(`version_route_${version.status}`);

  const unauth = await fetch("http://127.0.0.1:18082/mobile-updates/api/bundles");
  if (unauth.status !== 401) {
    throw new Error(`management_guard_expected_401_got_${unauth.status}`);
  }

  const auth = await fetch("http://127.0.0.1:18082/mobile-updates/api/bundles", {
    headers: {Authorization: "Bearer smoke-admin-token"},
  });
  if (!auth.ok) throw new Error(`management_auth_route_${auth.status}`);

  const dbPath = path.join(dataDir, "metadata.sqlite");
  if (!fs.existsSync(dbPath)) throw new Error("sqlite_not_created");

  console.log(JSON.stringify({
    ok: true,
    health,
    versionStatus: version.status,
    anonymousManagementStatus: unauth.status,
    authorizedManagementStatus: auth.status,
    sqliteCreated: true,
  }, null, 2));
} finally {
  child.kill("SIGTERM");
  await sleep(250);
  fs.rmSync(dataDir, {recursive:true, force:true});
}

if (stderr.trim()) process.stderr.write(stderr);
