using TechKey = Volpe.Cafe.TechKeys.TechKey128;

namespace Volpe.Cafe.VehicleSimulation
{
    /// <summary>
    /// Provides vehicle simulation results for a single technology combination.
    /// </summary>
    public interface ISimulationResult
    {
        /// <summary>
        /// Gets the key representing a single technology combination associated with this simulation result.
        /// </summary>
        TechKey TechKey { get; }

        /// <summary>
        /// Gets an array of primary fuel economy adjustment factors for all technology classes and for a technology
        /// combination represented by <see cref="TechKey"/>.
        /// </summary>
        double[] FE1Adjustments { get; }

        /// <summary>
        /// Gets an array of secondary fuel economy adjustment factors for all technology classes and for a technology
        /// combination represented by <see cref="TechKey"/>.
        /// </summary>
        double[] FE2Adjustments { get; }

        /// <summary>
        /// Gets an array of battery costs for all technology classes and for a technology combination represented by
        /// <see cref="TechKey"/>.
        /// </summary>
        double[] BatteryCosts { get; }

        /// <summary>
        /// Gets an array of total battery energy values (in kWh) for a technology combination represented by
        /// <see cref="TechKey"/>.
        /// </summary>
        double[] BatteryEnergy { get; }

        /// <summary>
        /// Gets an array of primary motor's peak power ratings (in kW) for a technology combination represented by 
        /// <see cref="TechKey"/>.
        /// </summary>
        double[] Motor1PeakPower { get; }

        /// <summary>
        /// Gets an array of primary motor's continuous power ratings (in kW) for a technology combination 
        /// represented by  <see cref="TechKey"/>.
        /// </summary>
        double[] Motor1ContPower { get; }

        /// <summary>
        /// Gets an array of secondary motor's peak power ratings (in kW) for a technology combination represented by 
        /// <see cref="TechKey"/>.
        /// </summary>
        double[] Motor2PeakPower { get; }

        /// <summary>
        /// Gets an array of secondary motor's continuous power ratings (in kW) for a technology combination 
        /// represented by <see cref="TechKey"/>.
        /// </summary>
        double[] Motor2ContPower { get; }

        /// <summary>
        /// Gets whether this simulation result is empty (that is, does not contain any valid data).
        /// </summary>
        bool IsEmpty { get; }

        /// <summary>
        /// Gets the primary fuel economy adjustment factor for the specified technology class and a technology
        /// combination associated with this simulation result, or 0 (zero), if the technology combination does not
        /// include results for the primary fuel economy adjustment factors.
        /// </summary>
        /// <param name="techClass">
        ///     The technology class for which to obtain the primary fuel economy adjustment factor.
        /// </param>
        /// <returns>
        /// The primary fuel economy adjustment factor for the specified technology class and a technology combination
        /// associated with this simulation result.
        /// </returns>
        double GetFE1Adjustment(TechnologyClass techClass);

        /// <summary>
        /// Gets the secondary fuel economy adjustment factor for the specified technology class and a technology
        /// combination associated with this simulation result, or 0 (zero), if the technology combination does not
        /// include results for the secondary fuel economy adjustment factors.
        /// </summary>
        /// <param name="techClass">
        ///     The technology class for which to obtain the secondary fuel economy adjustment factor.
        /// </param>
        /// <returns>
        /// The secondary fuel economy adjustment factor for the specified technology class and a technology
        /// combination associated with this simulation result.
        /// </returns>
        double GetFE2Adjustment(TechnologyClass techClass);

        /// <summary>
        /// Gets the battery cost for the specified technology class and a technology combination associated with this
        /// simulation result, or 0 (zero), if the technology combination does not include results for the battery
        /// costs.
        /// </summary>
        /// <param name="techClass">The technology class for which to obtain the battery cost.</param>
        /// <returns>
        /// The battery cost for the specified technology class and a technology combination associated with this
        /// simulation result.
        /// </returns>
        double GetBatteryCost(TechnologyClass techClass);

        /// <summary>
        /// Gets the total battery energy (in kWh) for the specified technology class and a technology combination 
        /// associated with this simulation result, or 0 (zero), if the technology combination does not include 
        /// results for the battery energy. 
        /// </summary>
        /// <param name="techClass">
        ///     The technology class for which to obtain the total battery energy.
        /// </param>
        /// <returns>
        /// The total battery energy (in kWh) for the specified technology class and a technology combination 
        /// associated with this simulation result.
        /// </returns>
        double GetBatteryEnergy(TechnologyClass techClass);

        /// <summary>
        /// Gets the primary motor's peak power rating (in kW) for the specified technology class and a technology 
        /// combination associated with this simulation result, or 0 (zero), if the technology combination does not 
        /// include results for the primary motor's peak power rating. 
        /// </summary>
        /// <param name="techClass">
        ///     The technology class for which to obtain the primary motor's peak power rating.
        /// </param>
        /// <returns>
        /// The primary motor's peak power rating (in kW) for the specified technology class and a technology 
        /// combination associated with this simulation result.
        /// </returns>
        double GetMotor1PeakPower(TechnologyClass techClass);

        /// <summary>
        /// Gets the primary motor's continuous power rating (in kW) for the specified technology class and a 
        /// technology combination associated with this simulation result, or 0 (zero), if the technology combination 
        /// does not include results for the primary motor's continuous power rating. 
        /// </summary>
        /// <param name="techClass">
        ///     The technology class for which to obtain the primary motor's continuous power rating.
        /// </param>
        /// <returns>
        /// The primary motor's continuous power rating (in kW) for the specified technology class and a technology 
        /// combination associated with this simulation result.
        /// </returns>
        double GetMotor1ContPower(TechnologyClass techClass);

        /// <summary>
        /// Gets the secondary motor's peak power rating (in kW) for the specified technology class and a technology 
        /// combination associated with this simulation result, or 0 (zero), if the technology combination does not 
        /// include results for the secondary motor's peak power rating. 
        /// </summary>
        /// <param name="techClass">
        ///     The technology class for which to obtain the secondary motor's peak power rating.
        /// </param>
        /// <returns>
        /// The secondary motor's peak power rating (in kW) for the specified technology class and a technology 
        /// combination associated with this simulation result.
        /// </returns>
        double GetMotor2PeakPower(TechnologyClass techClass);

        /// <summary>
        /// Gets the secondary motor's continuous power rating (in kW) for the specified technology class and a 
        /// technology combination associated with this simulation result, or 0 (zero), if the technology combination 
        /// does not include results for the secondary motor's continuous power rating. 
        /// </summary>
        /// <param name="techClass">
        ///     The technology class for which to obtain the secondary motor's continuous power rating.
        /// </param>
        /// <returns>
        /// The secondary motor's continuous power rating (in kW) for the specified technology class and a technology 
        /// combination associated with this simulation result.
        /// </returns>
        double GetMotor2ContPower(TechnologyClass techClass);

    }
}
