
import * as NodeServices from '@effect/platform-node/NodeServices';
import * as NodeCrypto from '@effect/platform-node/NodeCrypto';
import * as NetService from '@t3tools/shared/Net';
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 EnvironmentAuth from './src/auth/EnvironmentAuth.ts';
import * as ServerConfig from './src/config.ts';
import { resolveCliAuthConfig } from './src/cli/config.ts';
import { readLiveServerRuntimeState } from './src/serverRuntimeState.ts';
import { mcpToolSession } from './src/mcp/AcpMcpStdioBridge.ts';
const [home, mode] = process.argv.slice(2);
const numbers = [29027,24468,24425,34977,28975,29861];
const result = await Effect.runPromise(Effect.gen(function* () {
  const config = yield* resolveCliAuthConfig({baseDir:Option.some(home)}, Option.none(), {quietLogs:true});
  return yield* Effect.gen(function* () {
    const runtime = yield* readLiveServerRuntimeState(config.serverRuntimeStatePath);
    if (Option.isNone(runtime)) throw new Error('Scenario server is not running');
    const auth = yield* EnvironmentAuth.EnvironmentAuth;
    const issued = yield* Effect.acquireRelease(
      auth.issueMcpClientSession({label:'PR watch scenario',access:'full-access',peerLink:false,client:{deviceType:'bot'}}),
      s => auth.revokeSession(s.sessionId).pipe(Effect.ignore),
    );
    const session = yield* mcpToolSession({endpoint:new URL('/mcp',runtime.value.origin).href,authorization:'Bearer '+issued.token,clientName:'pr-watch-scenario'});
    const call = Effect.fn('proof.call')(function* (tool,args) {
      const raw = yield* session.call(tool,args);
      if (raw.isError) throw new Error(JSON.stringify(raw));
      return raw.structuredContent;
    });
    const listed = yield* call('t3_thread_list',{allProjects:true,titleContains:'Watch six pull requests'});
    const threadId = listed.threads[0].threadId;
    if (mode === 'watch' || mode === 'unwatch') {
      for (const number of numbers) yield* call(mode === 'watch' ? 'watch_pull_request' : 'unwatch_pull_request',{threadId,repository:'pingdotgg/t3code',host:'github.com',number});
    }
    const read = yield* call('t3_thread_read',{threadId,view:'activity',limit:100,runLimit:50,maxCharsPerItem:50000});
    const wakes = read.items.filter(i=>i.type === 'notification');
    return {
      threadId,
      items:read.items,
      wakes:wakes.map(i=>({text:i.text,messageId:i.messageId,runId:i.runId})),
      runs:read.recentRuns.map(r=>({ordinal:r.ordinal,status:r.status})),
      runCount:read.thread.runCount,
      link:read.thread.link,
      completed:read.thread.activeRunId === null && read.recentRuns.every(r=>r.status==='completed'),
    };
  }).pipe(Effect.scoped,Effect.provide(EnvironmentAuth.layerRuntime.pipe(
    Layer.provide(ServerConfig.layer(config)),Layer.provide(Layer.succeed(References.MinimumLogLevel,'Error')),
  )));
}).pipe(Effect.provide([NodeServices.layer,NodeCrypto.layer,NetService.layer])));
console.log(JSON.stringify(result));
