import type { ProtocolFixture } from "./types.js";

const sharedEvents = [
  { seq: 1, type: "progress", payload: { pct: 50 } },
  { seq: 2, type: "progress", payload: { pct: 100 } },
  { seq: 3, type: "terminal", payload: { status: "ok" } },
];

const frameLines = [
  '{"seq":1,"type":"progress","payload":{"pct":50}}',
  '{"seq":2,"type":"progress","payload":{"pct":100}}',
  '{"seq":3,"type":"terminal","payload":{"status":"ok"}}',
];

const fullStream = `${frameLines.join("\n")}\n`;

const sharedObservation = {
  events: sharedEvents,
  terminalCount: 1,
  parseErrors: [] as string[],
};

export const protocolKnownGood: ProtocolFixture = {
  fixtureId: "protocol/known-good",
  protocolVersion: "1.0",
  scenarios: [
    {
      scenarioId: "chunk-boundary-independence",
      kind: "stream-decode",
      frames: frameLines,
      terminalType: "terminal",
      constraints: {
        preserveOrder: true,
        requireSingleTerminal: true,
        chunkBoundaryIndependent: true,
        requireParseable: true,
      },
      chunkings: [
        {
          chunkingId: "single-chunk",
          chunks: [fullStream],
          observation: sharedObservation,
        },
        {
          chunkingId: "per-frame",
          chunks: frameLines.map((line) => `${line}\n`),
          observation: sharedObservation,
        },
        {
          chunkingId: "mid-frame-split",
          chunks: [
            '{"seq":1,"type":"progress","payload":{"pct":',
            '50}}\n{"seq":2,"type":"progress","payload":{"pct":100}}\n',
            '{"seq":3,"type":"terminal","payload":{"status":"ok"}}\n',
          ],
          observation: sharedObservation,
        },
        {
          chunkingId: "arbitrary-boundaries",
          chunks: [
            '{"seq":1,"type":"prog',
            'ress","payload":{"pct":50}}\n{"seq":2,"type":"progress","payload":{"pct":100}}\n{"seq":3,"type":"terminal","payload":{"status":"ok"}}\n',
          ],
          observation: sharedObservation,
        },
      ],
    },
    {
      scenarioId: "stdout-protocol-only",
      kind: "stdout-purity",
      stdout: fullStream,
      stderr: "[worker] ready\n",
      declaredSideChannels: ["stderr"],
      terminalType: "terminal",
      observation: {
        protocolFrames: frameLines,
        contaminations: [],
        partialFrames: 0,
        terminalCount: 1,
        duplicateTerminalCount: 0,
        postTerminalEvents: 0,
      },
    },
    {
      scenarioId: "serialization-round-trip",
      kind: "serialization-round-trip",
      typedValue: { version: 1, name: "widget", count: 3 },
      compatibilityContract: {
        allowUnknownFields: false,
        rejectVersionSkew: true,
        expectedVersion: 1,
        charset: "utf-8",
        newline: "lf",
        bom: "forbid",
        compression: "none",
        rejectPartialWrites: true,
      },
      observation: {
        serialized: '{"version":1,"name":"widget","count":3}\n',
        deserialized: { version: 1, name: "widget", count: 3 },
        metadata: {
          contentType: "application/json",
          hasBom: false,
          newlineStyle: "lf",
          compressed: false,
          partialWrite: false,
          unknownFields: [],
          inputVersion: 1,
          outputVersion: 1,
        },
      },
    },
  ],
};
