// Coverage for the F8-12 / #29 planet-label formatting. The
// renderer's per-Pixi.Text drawing lives behind Pixi APIs (and is
// exercised by Playwright); this file pins the pure data step.

import { describe, expect, test } from "vitest";

import type { GameReport } from "../src/api/game-state";
import { buildPlanetLabels } from "../src/map/labels";
import { EMPTY_SHIP_GROUPS } from "./helpers/empty-ship-groups";

function makeReport(overrides: Partial<GameReport> = {}): GameReport {
	return {
		turn: 1,
		mapWidth: 100,
		mapHeight: 100,
		planetCount: 0,
		planets: [],
		race: "",
		localShipClass: [],
		routes: [],
		localPlayerDrive: 0,
		localPlayerWeapons: 0,
		localPlayerShields: 0,
		localPlayerCargo: 0,
		...EMPTY_SHIP_GROUPS,
		...overrides,
	};
}

describe("buildPlanetLabels", () => {
	test("named planet with showNames=true emits both lines", () => {
		const report = makeReport({
			planets: [
				{
					number: 5,
					name: "Tancordia",
					kind: "local",
					x: 10,
					y: 20,
					owner: null,
					size: null,
					resources: null,
					industryStockpile: null,
					materialsStockpile: null,
					industry: null,
					population: null,
					colonists: null,
					production: null,
					freeIndustry: null,
				},
			],
		});
		const out = buildPlanetLabels(report, { showNames: true });
		expect(out).toEqual([
			{
				planetNumber: 5,
				x: 10,
				y: 20,
				name: "Tancordia",
				numberLabel: "#5",
			},
		]);
	});

	test("named planet with showNames=false drops the name line", () => {
		const report = makeReport({
			planets: [
				{
					number: 5,
					name: "Tancordia",
					kind: "local",
					x: 10,
					y: 20,
					owner: null,
					size: null,
					resources: null,
					industryStockpile: null,
					materialsStockpile: null,
					industry: null,
					population: null,
					colonists: null,
					production: null,
					freeIndustry: null,
				},
			],
		});
		const out = buildPlanetLabels(report, { showNames: false });
		expect(out[0].name).toBeNull();
		expect(out[0].numberLabel).toBe("#5");
	});

	test("unidentified planet always renders #N only, ignoring the toggle", () => {
		const report = makeReport({
			planets: [
				{
					number: 42,
					name: "Tancordia",
					kind: "unidentified",
					x: 5,
					y: 5,
					owner: null,
					size: null,
					resources: null,
					industryStockpile: null,
					materialsStockpile: null,
					industry: null,
					population: null,
					colonists: null,
					production: null,
					freeIndustry: null,
				},
			],
		});
		const on = buildPlanetLabels(report, { showNames: true });
		const off = buildPlanetLabels(report, { showNames: false });
		expect(on[0].name).toBeNull();
		expect(off[0].name).toBeNull();
		expect(on[0].numberLabel).toBe("#42");
	});

	test("empty-name planet falls back to #N", () => {
		const report = makeReport({
			planets: [
				{
					number: 9,
					name: "",
					kind: "uninhabited",
					x: 1,
					y: 1,
					owner: null,
					size: null,
					resources: null,
					industryStockpile: null,
					materialsStockpile: null,
					industry: null,
					population: null,
					colonists: null,
					production: null,
					freeIndustry: null,
				},
			],
		});
		const out = buildPlanetLabels(report, { showNames: true });
		expect(out[0].name).toBeNull();
		expect(out[0].numberLabel).toBe("#9");
	});
});
