// Scratch: mint a T3 MCP client bearer for a dev server's base dir, the way `t3 thread` does.
// Copy into <checkout>/apps/server/ and run: node mint-mcp-token.ts <baseDir>
import * as NodeRuntime from "@effect/platform-node/NodeRuntime";
import * as NodeCrypto from "@effect/platform-node/NodeCrypto";
import * as NodeServices from "@effect/platform-node/NodeServices";
import * as Effect from "effect/Effect";
import * as Layer from "effect/Layer";
import * as Option from "effect/Option";
import * as References from "effect/References";
import * as NetService from "@t3tools/shared/Net";
import * as EnvironmentAuth from "./src/auth/EnvironmentAuth.ts";
import * as ServerConfig from "./src/config.ts";
import { resolveCliAuthConfig } from "./src/cli/config.ts";

const program = Effect.gen(function* () {
  const config = yield* resolveCliAuthConfig({ baseDir: Option.some(process.argv[2]!) }, Option.none(), { quietLogs: true });
  return yield* Effect.gen(function* () {
    const auth = yield* EnvironmentAuth.EnvironmentAuth;
    const issued = yield* auth.issueMcpClientSession({
      label: "issue-33454 driver",
      access: "full-access",
      peerLink: false,
      client: { deviceType: "bot" },
    });
    process.stdout.write(issued.token);
  }).pipe(
    Effect.provide(
      EnvironmentAuth.layerRuntime.pipe(
        Layer.provide(ServerConfig.layer(config)),
        Layer.provide(Layer.succeed(References.MinimumLogLevel, config.logLevel)),
      ),
    ),
  );
});
NodeRuntime.runMain(program.pipe(Effect.provide(Layer.mergeAll(NodeServices.layer, NodeCrypto.layer, NetService.layer))) as Effect.Effect<void>);
