// Scratch driver for #26450: resolve a stored link the way a forwarded tool call does.
// Usage: node resolve-link.ts resolve <baseDir> <environmentId>
//        node resolve-link.ts link-as <baseDir> <environmentId> <label> <pairingCode> <url> [alternateUrl...]
// link-as sends what Settings → Linked environments → Link sends for a picked machine.
import { createRequire } from "node:module";
const W = "/home/ubuntu/wt/issue-26450/apps/server";
const req = createRequire(`${W}/package.json`);
const imp = (m: string) => import(req.resolve(m));
const Effect = await imp("effect/Effect");
const Layer = await imp("effect/Layer");
const Option = await imp("effect/Option");
const References = await imp("effect/References");
const FetchHttpClient = await imp("effect/http/FetchHttpClient");
const NodeServices = await imp("@effect/platform-node/NodeServices");
const NetService = await import("/home/ubuntu/wt/issue-26450/packages/shared/src/Net.ts");
const ServerSecretStore = await import(`${W}/src/auth/ServerSecretStore.ts`);
const ServerConfig = await import(`${W}/src/config.ts`);
const ServerEnvironment = await import(`${W}/src/environment/ServerEnvironment.ts`);
const PeerLinks = await import(`${W}/src/peer/PeerLinks.ts`);
const ServerSettings = await import(`${W}/src/serverSettings.ts`);
const SqlitePersistence = await import(`${W}/src/persistence/Sqlite.ts`);
const { resolveCliAuthConfig } = await import(`${W}/src/cli/config.ts`);
const [mode, baseDir, environmentId, label, pairingCode, url, ...alternateUrls] = process.argv.slice(2);
const run = (links: any) =>
  mode === "resolve"
    ? links.resolve(environmentId).pipe(
        Effect.map((resolved: any) => ({ url: resolved.url, label: resolved.link.label, tokenLength: resolved.token.length })),
      )
    : links.link({ url, alternateUrls, pairingCode, access: "read-only", expectedEnvironmentId: environmentId, expectedLabel: label }).pipe(
        Effect.map((link: any) => ({ linked: link.label, urls: link.urls })),
      );

const program = Effect.gen(function* () {
  const config = yield* resolveCliAuthConfig({ baseDir: Option.some(baseDir) }, Option.some("Error"));
  return yield* PeerLinks.PeerLinks.pipe(
    Effect.flatMap(run),
    Effect.provide(
      PeerLinks.layer.pipe(
        Layer.provide(Layer.mergeAll(ServerSecretStore.layer, SqlitePersistence.layerConfig, FetchHttpClient.layer)),
        Layer.provide(ServerEnvironment.layer.pipe(Layer.provide(ServerSecretStore.layer))),
        Layer.provide(ServerSettings.layer.pipe(Layer.provide(Layer.mergeAll(ServerSecretStore.layer, SqlitePersistence.layerConfig)))),
        Layer.provide(ServerConfig.layer(config)),
        Layer.provide(Layer.succeed(References.MinimumLogLevel, "Error")),
      ),
    ),
  );
}).pipe(Effect.provide(Layer.mergeAll(NodeServices.layer, NetService.layer)));

Effect.runPromise(Effect.result(program)).then((r: any) => {
  console.log(JSON.stringify(r._tag === "Success" ? { ok: r.success } : { refused: r.failure?.message ?? String(r.failure) }));
});
