namespace ReactorMaintenance.Simulation;

internal static class SimulationBands
{
    public static EBand SurfaceBand(SurfaceState surface, ECarrierType carrier)
    {
        return carrier switch {
            ECarrierType.Fuel => Fuel(surface.Fuel),
            ECarrierType.Coolant => Coolant(surface.Coolant),
            ECarrierType.Electricity => Electricity(surface.Electricity),
            _ => throw new ArgumentOutOfRangeException(nameof(carrier), carrier, "Unsupported carrier.")
        };
    }

    public static EBand NetworkBand(UndergroundCell underground, ECarrierType carrier, ENetworkValueKind valueKind)
    {
        var value = valueKind == ENetworkValueKind.Amount ? underground.Amount : underground.Intensity;
        return carrier switch {
            ECarrierType.Fuel => Fuel(value),
            ECarrierType.Coolant => Coolant(value),
            ECarrierType.Electricity => Electricity(value),
            _ => throw new ArgumentOutOfRangeException(nameof(carrier), carrier, "Unsupported carrier.")
        };
    }

    public static EBand Fuel(float value)
    {
        return Balancing.Current.Band(value, Balancing.Current.FuelCaution, Balancing.Current.FuelCritical);
    }

    public static EBand Coolant(float value)
    {
        return Balancing.Current.Band(value, Balancing.Current.CoolantCaution, Balancing.Current.CoolantCritical);
    }

    public static EBand Electricity(float value)
    {
        return Balancing.Current.Band(value, Balancing.Current.ElectricityCaution, Balancing.Current.ElectricityCritical);
    }

    public static EBand Heat(float value)
    {
        return Balancing.Current.Band(value, Balancing.Current.HeatCaution, Balancing.Current.HeatCritical);
    }
}