import { test, expect } from "bun:test";
import { Presets } from "../src";
import { runPresetUntilLaunched, spawnMiner } from "../src/cmd";
import { Chain, EventOutcome, Observe, runTest, TestCase } from "../src/test-case";
import { getApis, GlobalTimeout, logger, nullifyUnsigned } from "../src/utils";
import { commonSignedSteps } from "./common";

const PRESET: Presets = Presets.FakeDot;

test(
	`pruning era with signed (full solution) on ${PRESET}`,
	async () => {
		const { killZn, paraLog } = await runPresetUntilLaunched(PRESET);
		const apis = await getApis();
		const killMiner = await spawnMiner();

		// This test has no real assertions. Change the `HistoryDepth` to 1 in the runtime, run it,
		// and observe the logs and PoV sizes.
		const steps = [
			// first relay session change at block 11
			Observe.on(Chain.Relay, "Session", "NewSession").byBlock(11)
				.onPass(() => {
					nullifyUnsigned(apis.paraApi).then((ok) => {
						logger.verbose("Nullified signed phase:", ok);
					});
				}),
			Observe.on(Chain.Teyrchain, "Staking", "EraPruned")
				.withDataCheck((x) => x.index == 0),
			Observe.on(Chain.Teyrchain, "Staking", "EraPruned")
				.withDataCheck((x) => x.index == 1),
			// Observe.on(Chain.Teyrchain, "Staking", "EraPruned")
			// 	.withDataCheck((x) => x.index == 2),
			// Observe.on(Chain.Teyrchain, "Staking", "EraPruned")
			// 	.withDataCheck((x) => x.index == 3),
			// Observe.on(Chain.Teyrchain, "Staking", "EraPruned")
			// 	.withDataCheck((x) => x.index == 4),
		].map((s) => s.build())

		const testCase = new TestCase(
			steps,
			true,
			() => {
				killMiner();
				killZn();
			}
		);

		const outcome = await runTest(testCase, apis, paraLog);
		expect(outcome).toEqual(EventOutcome.Done);
	},
	{ timeout: GlobalTimeout * 10 }
);
