using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
namespace IdleSpectator;
public sealed class DisasterWarAuditResult
{
public bool Passed;
public string Detail = "";
public int DisasterTotal;
public int WarTypeTotal;
public int MissingDisaster;
public int OrphanDisaster;
public int MissingWarType;
public int OrphanWarType;
}
/// Live disasters + war_types library coverage audit.
public static class DisasterWarHarness
{
public static DisasterWarAuditResult RunAudit(string outputDirectory)
{
List disasters = ActivityAssetCatalog.EnumerateLiveDisasterIds();
List warTypes = ActivityAssetCatalog.EnumerateLiveWarTypeIds();
var authoredDisasters = new HashSet(StringComparer.OrdinalIgnoreCase);
foreach (string id in EventCatalog.Disaster.AuthoredIds)
{
authoredDisasters.Add(id);
}
var authoredWars = new HashSet(StringComparer.OrdinalIgnoreCase);
foreach (string id in EventCatalog.WarType.AuthoredIds)
{
authoredWars.Add(id);
}
int missingDisaster = 0;
int orphanDisaster = 0;
int missingWarType = 0;
int orphanWarType = 0;
var tsv = new StringBuilder();
tsv.AppendLine("kind\tid\tauthored\tevent_strength\tworld_log_id\tnotes");
var liveDisasters = new HashSet(StringComparer.OrdinalIgnoreCase);
for (int i = 0; i < disasters.Count; i++)
{
string id = disasters[i];
liveDisasters.Add(id);
DisasterInterestEntry entry = EventCatalog.Disaster.GetOrFallback(id);
bool has = EventCatalog.Disaster.HasAuthored(id) && !entry.IsFallback;
if (!has)
{
missingDisaster++;
}
tsv.Append("disaster\t").Append(id).Append('\t')
.Append(has ? "1" : "0").Append('\t')
.Append(entry.EventStrength.ToString("0.#")).Append('\t')
.Append(entry.WorldLogId ?? "").Append('\t')
.Append(has ? "ok" : "missing_authored").AppendLine();
}
foreach (string id in authoredDisasters)
{
if (!liveDisasters.Contains(id))
{
orphanDisaster++;
tsv.Append("disaster\t").Append(id).Append("\t1\t0\t\torphan_authored").AppendLine();
}
}
var liveWars = new HashSet(StringComparer.OrdinalIgnoreCase);
for (int i = 0; i < warTypes.Count; i++)
{
string id = warTypes[i];
liveWars.Add(id);
WarTypeInterestEntry entry = EventCatalog.WarType.GetOrFallback(id);
bool has = EventCatalog.WarType.HasAuthored(id) && !entry.IsFallback;
if (!has)
{
missingWarType++;
}
tsv.Append("war_type\t").Append(id).Append('\t')
.Append(has ? "1" : "0").Append('\t')
.Append(entry.EventStrength.ToString("0.#")).Append('\t')
.Append('\t')
.Append(has ? "ok" : "missing_authored").AppendLine();
}
foreach (string id in authoredWars)
{
if (!liveWars.Contains(id))
{
orphanWarType++;
tsv.Append("war_type\t").Append(id).Append("\t1\t0\t\torphan_authored").AppendLine();
}
}
try
{
if (!string.IsNullOrEmpty(outputDirectory))
{
Directory.CreateDirectory(outputDirectory);
File.WriteAllText(
Path.Combine(outputDirectory, "disaster-war-audit.tsv"),
tsv.ToString());
}
}
catch
{
// ignore
}
bool passed = disasters.Count > 0
&& warTypes.Count > 0
&& missingDisaster == 0
&& orphanDisaster == 0
&& missingWarType == 0
&& orphanWarType == 0;
return new DisasterWarAuditResult
{
Passed = passed,
DisasterTotal = disasters.Count,
WarTypeTotal = warTypes.Count,
MissingDisaster = missingDisaster,
OrphanDisaster = orphanDisaster,
MissingWarType = missingWarType,
OrphanWarType = orphanWarType,
Detail =
$"disasters={disasters.Count} missingDisaster={missingDisaster} orphanDisaster={orphanDisaster} "
+ $"war_types={warTypes.Count} missingWarType={missingWarType} orphanWarType={orphanWarType}"
};
}
}