1// SPDX-License-Identifier: GPL-2.0-only
2// Copyright (c) 2026-present FERS Contributors (see AUTHORS.md).
4import type { PlatformComponent, ScenarioData } from './types';
6type ScenarioNameSource = Pick<
8 'waveforms' | 'timings' | 'antennas' | 'platforms'
11type UniqueNameOptions = {
15export function getComponentIdentityIds(
16 component: PlatformComponent
18 return component.type === 'monostatic'
19 ? [component.id, component.txId, component.rxId]
24 ignoredIds: Iterable<string | null | undefined> = []
26 const ignored = new Set<string>();
27 for (const id of ignoredIds) {
36 ids: Iterable<string | null | undefined>,
37 ignoredIds: Set<string>
39 for (const id of ids) {
40 if (id && ignoredIds.has(id)) {
47export function collectScenarioNames(
48 scenarioData: ScenarioNameSource,
49 ignoredIds: Iterable<string | null | undefined> = []
51 const ignored = toIgnoredSet(ignoredIds);
52 const names = new Set<string>();
56 ids: Iterable<string | null | undefined>
58 if (!shouldIgnore(ids, ignored)) {
63 for (const waveform of scenarioData.waveforms) {
64 addName(waveform.name, [waveform.id]);
66 for (const timing of scenarioData.timings) {
67 addName(timing.name, [timing.id]);
69 for (const antenna of scenarioData.antennas) {
70 addName(antenna.name, [antenna.id]);
72 for (const platform of scenarioData.platforms) {
73 addName(platform.name, [platform.id]);
74 for (const component of platform.components) {
75 addName(component.name, getComponentIdentityIds(component));
82export function createUniqueName(
84 existingNames: Set<string>,
85 options: UniqueNameOptions = {}
87 if (!options.copy && !existingNames.has(baseName)) {
91 let candidate = `${baseName} Copy`;
94 while (existingNames.has(candidate)) {
95 candidate = `${baseName} Copy ${suffix}`;
102export function createUniqueScenarioName(
103 scenarioData: ScenarioNameSource,
105 ignoredIds: Iterable<string | null | undefined> = []
107 return createUniqueName(
109 collectScenarioNames(scenarioData, ignoredIds)
113export function createUniqueScenarioCopyName(
114 scenarioData: ScenarioNameSource,
116 ignoredIds: Iterable<string | null | undefined> = []
118 return createUniqueName(
120 collectScenarioNames(scenarioData, ignoredIds),