namespace XFEEDToolBox.Core.Galaxy;
/// <summary>Actual original UID/name bindings; observed market IDs never resolve a UID.</summary>
public static class GalaxyOriginalCommodities
{
public static GalaxyNativeCommodityOption? Resolve(IReadOnlyList<GalaxyNativeCommodityOption> options,uint uid)=>options.FirstOrDefault(c=>c.Uid==uid);
public static GalaxyFilterChoice Choice(GalaxyNativeCommodityOption original)
{
var key=GalaxyMapFilter.Normalize(original.Name);
// A symbol/name alias may provide a display name, never a UID or parent.
var observed=GalaxyCommodityTree.Definitions.FirstOrDefault(d=>GalaxyMapFilter.Normalize(d.Symbol)==key||GalaxyMapFilter.Normalize(d.Name)==key);
return new(GalaxyMapFilter.Normalize(observed?.Name??original.Name),observed?.Name??original.Name);
}
public static GalaxyCommodityDirection? SingleDirectionFromSavedPriceMode(int mode)=>mode switch{1=>GalaxyCommodityDirection.Imports,2=>GalaxyCommodityDirection.Exports,_=>null};
public static GalaxyCommodityDirection? DirectionFromSavedPriceMode(int mode)=>mode switch{0 or 3=>GalaxyCommodityDirection.Both,_=>SingleDirectionFromSavedPriceMode(mode)};
public static GalaxyMapFilter WithOptions(GalaxyMapFilter filter,IReadOnlyList<GalaxyNativeCommodityOption> options)
{
var same=filter.OriginalCommodityOptions.SequenceEqual(options);var result=same?filter:filter with{OriginalCommodityOptions=options};
if(filter.OriginalCommodityUid is not {} uid||Resolve(options,uid) is not {} selected)return result;
// A real definition may currently fail the original cargo predicate.
// Keep the pending UID, but never restore it as an available choice.
var values=selected.PublisherEligible==false?new HashSet<string>(StringComparer.Ordinal):new HashSet<string>([Choice(selected).Key],StringComparer.Ordinal);
if(result.SavedValues.TryGetValue(GalaxyFilterCategory.Commodity,out var saved)&&saved?.SetEquals(values)==true&&
(result.Category!=GalaxyFilterCategory.Commodity||result.Values?.SetEquals(values)==true))return result;
var selections=new Dictionary<GalaxyFilterCategory,IReadOnlySet<string>?>(result.SavedValues){[GalaxyFilterCategory.Commodity]=values};
return result with{SavedValues=selections,Values=result.Category==GalaxyFilterCategory.Commodity?values:result.Values};
}
public static bool TrySavedUid(string value,out uint uid)
{
if(int.TryParse(value,System.Globalization.NumberStyles.Integer,System.Globalization.CultureInfo.InvariantCulture,out var signed)){uid=unchecked((uint)signed);return uid!=uint.MaxValue;}
return uint.TryParse(value,System.Globalization.NumberStyles.None,System.Globalization.CultureInfo.InvariantCulture,out uid)&&uid!=uint.MaxValue;
}
}
namespace XFEEDToolBox.Core.Galaxy;
/// <summary>Actual original UID/name bindings; observed market IDs never resolve a UID.</summary>
public static class GalaxyOriginalCommodities
{
public static GalaxyNativeCommodityOption? Resolve(IReadOnlyList<GalaxyNativeCommodityOption> options,uint uid)=>options.FirstOrDefault(c=>c.Uid==uid);
public static GalaxyFilterChoice Choice(GalaxyNativeCommodityOption original)
{
var key=GalaxyMapFilter.Normalize(original.Name);
// A symbol/name alias may provide a display name, never a UID or parent.
var observed=GalaxyCommodityTree.Definitions.FirstOrDefault(d=>GalaxyMapFilter.Normalize(d.Symbol)==key||GalaxyMapFilter.Normalize(d.Name)==key);
return new(GalaxyMapFilter.Normalize(observed?.Name??original.Name),observed?.Name??original.Name);
}
public static GalaxyCommodityDirection? SingleDirectionFromSavedPriceMode(int mode)=>mode switch{1=>GalaxyCommodityDirection.Imports,2=>GalaxyCommodityDirection.Exports,_=>null};
public static GalaxyCommodityDirection? DirectionFromSavedPriceMode(int mode)=>mode switch{0 or 3=>GalaxyCommodityDirection.Both,_=>SingleDirectionFromSavedPriceMode(mode)};
public static GalaxyMapFilter WithOptions(GalaxyMapFilter filter,IReadOnlyList<GalaxyNativeCommodityOption> options)
{
var same=filter.OriginalCommodityOptions.SequenceEqual(options);var result=same?filter:filter with{OriginalCommodityOptions=options};
if(filter.OriginalCommodityUid is not {} uid||Resolve(options,uid) is not {} selected)return result;
// A real definition may currently fail the original cargo predicate.
// Keep the pending UID, but never restore it as an available choice.
var values=selected.PublisherEligible==false?new HashSet<string>(StringComparer.Ordinal):new HashSet<string>([Choice(selected).Key],StringComparer.Ordinal);
if(result.SavedValues.TryGetValue(GalaxyFilterCategory.Commodity,out var saved)&&saved?.SetEquals(values)==true&&
(result.Category!=GalaxyFilterCategory.Commodity||result.Values?.SetEquals(values)==true))return result;
var selections=new Dictionary<GalaxyFilterCategory,IReadOnlySet<string>?>(result.SavedValues){[GalaxyFilterCategory.Commodity]=values};
return result with{SavedValues=selections,Values=result.Category==GalaxyFilterCategory.Commodity?values:result.Values};
}
public static bool TrySavedUid(string value,out uint uid)
{
if(int.TryParse(value,System.Globalization.NumberStyles.Integer,System.Globalization.CultureInfo.InvariantCulture,out var signed)){uid=unchecked((uint)signed);return uid!=uint.MaxValue;}
return uint.TryParse(value,System.Globalization.NumberStyles.None,System.Globalization.CultureInfo.InvariantCulture,out uid)&&uid!=uint.MaxValue;
}
}