using System.Globalization;
using System.Text.Json;
namespace XFEEDToolBox.Core.Galaxy;
/// <summary>
/// One coherent original metadata descriptor or an explicitly marked ready
/// classifier default. Neither proves full catalogue coverage. Numeric namespaces stay intact;
/// an unrecognised future enum is not converted to None or zero population.
/// </summary>
public sealed record GalaxyNativeBasicSystemFacts(ulong Population,uint GovernmentId,uint PrimaryEconomyId,
uint SecondaryEconomyId,uint FactionStateId,ulong AllegianceId,byte SecurityValue)
{
public string? AllegianceKey {get;init;}
/// <summary>Original ready classifier fallback for a confirmed absent row;
/// zero here is its classification input, not a measured global population.</summary>
public bool Defaulted {get;init;}
public string? Government=>GovernmentId<(uint)Governments.Length?Governments[GovernmentId]:null;
public string? PrimaryEconomy=>PrimaryEconomyId<(uint)Economies.Length?Economies[PrimaryEconomyId]:null;
public string? SecondaryEconomy=>SecondaryEconomyId<(uint)Economies.Length?Economies[SecondaryEconomyId]:null;
public string? BaseFactionState=>FactionStateId<(uint)FactionStates.Length&&FactionStateId!=14?FactionStates[FactionStateId]:null;
public long? PopulationForFilter=>Population<=long.MaxValue?(long)Population:null;
// Exact old1C40B90; its integer is preserved independently of public
// security names. Government None1/Anarchy2 always yields class0.
public int? SecurityClass=>GovernmentId>18?null:GovernmentId is 1 or 2?0:SecurityValue<40?2:SecurityValue<80?3:4;
// Original Security constructor3AD0BF0 keys the same class0/2/3/4
// by these resource names. Palette row order is not the numeric enum.
public string? SecurityKey=>SecurityClass switch
{0=>"Anarchy",2=>"LowSecurity",3=>"MediumSecurity",4=>"HighSecurity",_=>null};
public static GalaxyNativeBasicSystemFacts? FromWire(JsonElement value)
{
if(value.ValueKind==JsonValueKind.Null)return null;
if(value.ValueKind!=JsonValueKind.Object)throw new InvalidDataException("原基础星系资料回执无效。");
ulong Exact(string key)
{
if(!value.TryGetProperty(key,out var field)||field.ValueKind!=JsonValueKind.String||
!ulong.TryParse(field.GetString(),NumberStyles.None,CultureInfo.InvariantCulture,out var result))
throw new InvalidDataException("原基础星系64位资料无效:"+key);
return result;
}
uint Enum(string key)=>value.TryGetProperty(key,out var field)&&field.ValueKind==JsonValueKind.Number&&field.TryGetUInt32(out var number)
?number:throw new InvalidDataException("原基础星系枚举资料无效:"+key);
var security=Enum("securityValue");if(security>byte.MaxValue)throw new InvalidDataException("原基础星系安全原值无效。");
string? allegiance=null,rawAllegiance=null;
if(value.TryGetProperty("allegianceKey",out var key)&&key.ValueKind!=JsonValueKind.Null)
{
if(key.ValueKind!=JsonValueKind.String)throw new InvalidDataException("原阵营定义名称无效。");
rawAllegiance=key.GetString();allegiance=KnownAllegiance(rawAllegiance);
}
var defaulted=false;
if(value.TryGetProperty("defaulted",out var fallback))
{
if(fallback.ValueKind is not(JsonValueKind.True or JsonValueKind.False))throw new InvalidDataException("原基础星系分类来源无效。");
defaulted=fallback.GetBoolean();
}
var result=new GalaxyNativeBasicSystemFacts(Exact("population"),Enum("governmentId"),Enum("primaryEconomyId"),Enum("secondaryEconomyId"),Enum("factionStateId"),Exact("allegianceId"),(byte)security)
{AllegianceKey=allegiance,Defaulted=defaulted};
if(defaulted&&(result.Population!=0||result.GovernmentId!=1||result.PrimaryEconomyId!=1||result.SecondaryEconomyId!=1||
result.FactionStateId!=0||result.AllegianceId!=ulong.MaxValue||result.SecurityValue!=0||rawAllegiance is not(null or "None")))
throw new InvalidDataException("原缺行分类默认值不一致。");
return defaulted?result with{AllegianceKey="None"}:result;
}
public static string? KnownAllegiance(string? key)=>key is "None" or "Federation" or "Empire" or "Alliance" or "Independent"?key:null;
// Generated from the pinned original enum table and actual current map-AS
// FactionStates constants, never public website numeric ordering.
private static readonly string[] Governments=["Undefined","None","Anarchy","Colony","Democracy","Imperial","Corporate","Communism","Feudal","Dictatorship","Theocracy","Cooperative","Patronage","Confederacy","PrisonColony","Engineer","Prison","Carrier","Megaconstruction"];
private static readonly string[] Economies=["Undefined","None","Extraction","Agriculture","Industrial","Service","HighTech","Refinery","Military","Corporate","Governmental","Financial","Terraforming","Construction","Educational","Research","Monastic","Health","Penal","Retail","Tourism","Hospitality","Colony","Engineer","Damaged","Rescue","Repair","Prison","Carrier"];
private static readonly string[] FactionStates=["None","Boom","Bust","CivilUnrest","CivilWar","Famine","Outbreak","Expansion","War","Lockdown","Election","Retreat","Investment","Infested","Unknown","Incursion","InfestedCured","CivilLiberty","PirateAttack","InfrastructureFailure","PublicHoliday","NaturalDisaster","Aid","Colonisation","Drought","Revolution","ColdWar","TechnologicalLeap","TradeWar","TerroristAttack","HistoricEvent","IncursionPending","Blight","Thargoid_Probing","Thargoid_Harvest","Thargoid_Controlled","Thargoid_Stronghold","Thargoid_Recovery","Pseudo_HumanControlled","Pseudo_Unpopulated"];
}
using System.Globalization;
using System.Text.Json;
namespace XFEEDToolBox.Core.Galaxy;
/// <summary>
/// One coherent original metadata descriptor or an explicitly marked ready
/// classifier default. Neither proves full catalogue coverage. Numeric namespaces stay intact;
/// an unrecognised future enum is not converted to None or zero population.
/// </summary>
public sealed record GalaxyNativeBasicSystemFacts(ulong Population,uint GovernmentId,uint PrimaryEconomyId,
uint SecondaryEconomyId,uint FactionStateId,ulong AllegianceId,byte SecurityValue)
{
public string? AllegianceKey {get;init;}
/// <summary>Original ready classifier fallback for a confirmed absent row;
/// zero here is its classification input, not a measured global population.</summary>
public bool Defaulted {get;init;}
public string? Government=>GovernmentId<(uint)Governments.Length?Governments[GovernmentId]:null;
public string? PrimaryEconomy=>PrimaryEconomyId<(uint)Economies.Length?Economies[PrimaryEconomyId]:null;
public string? SecondaryEconomy=>SecondaryEconomyId<(uint)Economies.Length?Economies[SecondaryEconomyId]:null;
public string? BaseFactionState=>FactionStateId<(uint)FactionStates.Length&&FactionStateId!=14?FactionStates[FactionStateId]:null;
public long? PopulationForFilter=>Population<=long.MaxValue?(long)Population:null;
// Exact old1C40B90; its integer is preserved independently of public
// security names. Government None1/Anarchy2 always yields class0.
public int? SecurityClass=>GovernmentId>18?null:GovernmentId is 1 or 2?0:SecurityValue<40?2:SecurityValue<80?3:4;
// Original Security constructor3AD0BF0 keys the same class0/2/3/4
// by these resource names. Palette row order is not the numeric enum.
public string? SecurityKey=>SecurityClass switch
{0=>"Anarchy",2=>"LowSecurity",3=>"MediumSecurity",4=>"HighSecurity",_=>null};
public static GalaxyNativeBasicSystemFacts? FromWire(JsonElement value)
{
if(value.ValueKind==JsonValueKind.Null)return null;
if(value.ValueKind!=JsonValueKind.Object)throw new InvalidDataException("原基础星系资料回执无效。");
ulong Exact(string key)
{
if(!value.TryGetProperty(key,out var field)||field.ValueKind!=JsonValueKind.String||
!ulong.TryParse(field.GetString(),NumberStyles.None,CultureInfo.InvariantCulture,out var result))
throw new InvalidDataException("原基础星系64位资料无效:"+key);
return result;
}
uint Enum(string key)=>value.TryGetProperty(key,out var field)&&field.ValueKind==JsonValueKind.Number&&field.TryGetUInt32(out var number)
?number:throw new InvalidDataException("原基础星系枚举资料无效:"+key);
var security=Enum("securityValue");if(security>byte.MaxValue)throw new InvalidDataException("原基础星系安全原值无效。");
string? allegiance=null,rawAllegiance=null;
if(value.TryGetProperty("allegianceKey",out var key)&&key.ValueKind!=JsonValueKind.Null)
{
if(key.ValueKind!=JsonValueKind.String)throw new InvalidDataException("原阵营定义名称无效。");
rawAllegiance=key.GetString();allegiance=KnownAllegiance(rawAllegiance);
}
var defaulted=false;
if(value.TryGetProperty("defaulted",out var fallback))
{
if(fallback.ValueKind is not(JsonValueKind.True or JsonValueKind.False))throw new InvalidDataException("原基础星系分类来源无效。");
defaulted=fallback.GetBoolean();
}
var result=new GalaxyNativeBasicSystemFacts(Exact("population"),Enum("governmentId"),Enum("primaryEconomyId"),Enum("secondaryEconomyId"),Enum("factionStateId"),Exact("allegianceId"),(byte)security)
{AllegianceKey=allegiance,Defaulted=defaulted};
if(defaulted&&(result.Population!=0||result.GovernmentId!=1||result.PrimaryEconomyId!=1||result.SecondaryEconomyId!=1||
result.FactionStateId!=0||result.AllegianceId!=ulong.MaxValue||result.SecurityValue!=0||rawAllegiance is not(null or "None")))
throw new InvalidDataException("原缺行分类默认值不一致。");
return defaulted?result with{AllegianceKey="None"}:result;
}
public static string? KnownAllegiance(string? key)=>key is "None" or "Federation" or "Empire" or "Alliance" or "Independent"?key:null;
// Generated from the pinned original enum table and actual current map-AS
// FactionStates constants, never public website numeric ordering.
private static readonly string[] Governments=["Undefined","None","Anarchy","Colony","Democracy","Imperial","Corporate","Communism","Feudal","Dictatorship","Theocracy","Cooperative","Patronage","Confederacy","PrisonColony","Engineer","Prison","Carrier","Megaconstruction"];
private static readonly string[] Economies=["Undefined","None","Extraction","Agriculture","Industrial","Service","HighTech","Refinery","Military","Corporate","Governmental","Financial","Terraforming","Construction","Educational","Research","Monastic","Health","Penal","Retail","Tourism","Hospitality","Colony","Engineer","Damaged","Rescue","Repair","Prison","Carrier"];
private static readonly string[] FactionStates=["None","Boom","Bust","CivilUnrest","CivilWar","Famine","Outbreak","Expansion","War","Lockdown","Election","Retreat","Investment","Infested","Unknown","Incursion","InfestedCured","CivilLiberty","PirateAttack","InfrastructureFailure","PublicHoliday","NaturalDisaster","Aid","Colonisation","Drought","Revolution","ColdWar","TechnologicalLeap","TradeWar","TerroristAttack","HistoricEvent","IncursionPending","Blight","Thargoid_Probing","Thargoid_Harvest","Thargoid_Controlled","Thargoid_Stronghold","Thargoid_Recovery","Pseudo_HumanControlled","Pseudo_Unpopulated"];
}