using Volpe.Cafe.MarketData.BaselineInfo;

namespace Volpe.Cafe.MarketData.Design
{
    /// <summary>
    /// Defines a revision of a vehicle, with descriptions of its engineering characteristics and/or compliance
    /// attributes for a specific model year.
    /// </summary>
    /// <seealso cref="IVehicle"/>
    /// <seealso cref="IVehicleInfo"/>
    public interface IVehicleRevision : IOEMProductRevision, IVehicleInfo
    {
        /// <summary>
        /// Gets the underlying <see cref="IVehicle"/> associated with this vehicle revision.
        /// </summary>
        IVehicle Vehicle { get; }

        /// <summary>
        /// Gets a description of baseline engineering characteristics for the <see cref="IVehicle"/> associated with
        /// this vehicle revision.
        /// </summary>
        new BaselineVehicle BaselineInfo { get; }

        //----- general vehicle info -----
        /// <summary>Gets or sets the code of the platform that the vehicle uses.</summary>
        new int PlatformCode { get; set; }
        /// <summary>Gets or sets the code of the engine that the vehicle uses.</summary>
        new int EngineCode { get; set; }
        /// <summary>Gets or sets the code of the transmission that the vehicle uses.</summary>
        new int TransmissionCode { get; set; }

        //----- fuel-economy values -----
        /// <summary>
        /// Gets or sets the CAFE fuel economy rating of the vehicle for each fuel type.
        /// </summary>
        new FuelValue FuelEconomy { get; set; }
        /// <summary>
        /// Gets or sets the percent share that the vehicle operates on for each fuel type. That is, the amount of
        /// miles driven by the vehicle on each fuel type.
        /// </summary>
        new FuelValue FuelShare { get; set; }

        //----- sales/msrp -----
        /// <summary>Gets or sets the vehicle's forecast of sales.</summary>
        new double Sales { get; set; }
        /// <summary>Gets or sets the vehicle's manufacturer suggested retail price (MSRP).</summary>
        new double Msrp { get; set; }

        //----- regulatory classification -----
        /// <summary>Gets or sets the vehicle's CAFE regulatory class assignment.</summary>
        new RegulatoryClass RegClass { get; set; }

        //----- vehicle characteristics -----
        /// <summary>Gets or sets the vehicle's footprint.</summary>
        new double Footprint { get; set; }

        /// <summary>Gets or sets the vehicle's curb weight.</summary>
        new double CurbWeight { get; set; }
        /// <summary>Gets or sets the vehicle's Gross Vehicle Weight Rating (GVWR).</summary>
        new double GVWR { get; set; }
        /// <summary>Gets or sets the vehicle's Gross Combined Weight Rating (GCWR).</summary>
        new double GCWR { get; set; }

        //----- vehicle powertrain -----
        /// <summary>
        /// Gets or sets whether the vehicle uses a conventional or a hybrid/electric powertrain.
        /// </summary>
        new HEVType HevType { get; set; }

        //----- values updated at end of model year -----
        /// <summary>
        /// Gets or sets the compliance costs associated with application of fuel improving technologies, as well as
        /// costs associated with credits and adjustments from off-cycle technologies.
        /// </summary>
        ComplianceCosts ComplianceCosts { get; set; }

        /// <summary>
        /// Gets or sets the auxiliary costs associated with the hybrid/electric technology used on a vehicle,
        /// applicable to a vehicle's unaltered state (before any new technology application).
        /// </summary>
        AuxiliaryHEVCosts InitAuxiliaryHevCosts { get; set; }
        /// <summary>
        /// Gets or sets the auxiliary costs associated with the hybrid/electric technology used on a vehicle,
        /// applicable to a vehicle's "final" state for a specific model year.
        /// </summary>
        AuxiliaryHEVCosts AuxiliaryHevCosts { get; set; }

        /// <summary>
        /// Gets or sets the additional amount a buyer is expected to pay for the purchase of a new vehicle model
        /// (beyond the vehicle's MSRP), based on a vehicle's unaltered state (before any new technology application).
        /// </summary>
        OwnershipCosts InitOwnershipCosts { get; set; }
        /// <summary>
        /// Gets or sets the additional amount a buyer is expected to pay for the purchase of a new vehicle model
        /// (beyond the vehicle's MSRP), based on a vehicle's "final" state for a specific model year.
        /// </summary>
        OwnershipCosts OwnershipCosts { get; set; }

        /// <summary>
        /// Gets or sets the vehicle's payback years. That is, the number of years before increases in vehicle costs
        /// due to technology application are repaid.
        /// </summary>
        double Payback { get; set; }
        /// <summary>
        /// Gets or sets the vehicle's payback years based on total costs of ownership. That is, the number of years
        /// before increases in vehicle total costs of ownership due to technology application are repaid.
        /// </summary>
        double PaybackTCO { get; set; }

        /// <summary>Gets or sets the ZEV credits accumulated by the vehicle.</summary>
        double ZEVCredits { get; set; }

    }
}
