namespace Volpe.Cafe.MarketData.Design
{
    /// <summary>
    /// Defines basic information about a vehicle, with descriptions of its engineering characteristics.
    /// </summary>
    /// <seealso cref="IVehicle"/>
    /// <seealso cref="IVehicleRevision"/>
    public interface IVehicleInfo : IOEMProductInfo
    {
        //----- general vehicle info -----
        /// <summary>Gets the brand of the vehicle.</summary>
        string Brand { get; }
        /// <summary>Gets the model name of the vehicle.</summary>
        string Model { get; }
        /// <summary>Gets the nameplate of the vehicle.</summary>
        string Nameplate { get; }

        /// <summary>Gets the code of the platform that the vehicle uses.</summary>
        int PlatformCode { get; }
        /// <summary>Gets the code of the engine that the vehicle uses.</summary>
        int EngineCode { get; }
        /// <summary>Gets the code of the transmission that the vehicle uses.</summary>
        int TransmissionCode { get; }

        //----- fuel-economy values -----
        /// <summary>
        /// Gets the CAFE fuel economy rating of the vehicle for each fuel type.
        /// </summary>
        FuelValue FuelEconomy { get; }
        /// <summary>
        /// Gets 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>
        FuelValue FuelShare { get; }
        /// <summary>
        /// Gets the type(s) of fuel used by the vehicle.
        /// </summary>
        FuelType FuelType { get; }

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

        //----- regulatory classification -----
        /// <summary>Gets the vehicle's CAFE regulatory class assignment.</summary>
        RegulatoryClass RegClass { get; }
        /// <summary>Gets the vehicle's safety class assignment.</summary>
        SafetyClass SafetyClass { get; }
        /// <summary>Gets the vehicle's classification.</summary>
        VehicleClass VehicleClass { get; }

        /// <summary>Gets the vehicle's technology class assignment.</summary>
        TechnologyClass TechnologyClass { get; }
        /// <summary>Gets the vehicle's engine technology class assignment.</summary>
        EngineTechnologyClass EngineTechnologyClass { get; }

        /// <summary>
        /// Gets whether the vehicle is a preferred candidate for ZEV technology application.
        /// </summary>
        bool IsZevCandidate { get; }
        /// <summary>
        /// Gets whether the vehicle is a preferred candidate for ZEV technology application.
        /// If this value is null, the vehicle is not a ZEV candidate. Otherwise, this value specifies one of PHEV,
        /// BEV, or FCV technologies that a vehicle will be converted to on or after the specified
        /// <see cref="ZevApplicationYear"/>.
        /// </summary>
        int? ZEVCandidate { get; }
        /// <summary>
        /// Gets the earliest model year during which a vehicle that is a preferred candidate for ZEV technology
        /// application may be converted to a specific ZEV technology.
        /// </summary>
        int ZevApplicationYear { get; }
        /// <summary>
        /// Gets the code of the vehicle that serves as the reference vehicle for shifting sales as part of complying
        /// with the ZEV requirements. During analysis, a portion of sales from the ZEV reference vehicle may be
        /// shifted to this vehicle. The reference vehicle may not itself be a ZEV candidate.
        /// This value is ignored if the vehicle is NOT a preferred candidate for ZEV technology application.
        /// </summary>
        int ZevReferenceVehicleCode { get; }

        /// <summary>Gets whether the vehicle's manufacturer is subject to the CARB agreement.</summary>
        bool CARBAgreement { get; }

        //----- vehicle characteristics -----
        /// <summary>Gets whether the vehicle is produced domestically or is imported.</summary>
        Origin Origin { get; }

        /// <summary>Gets the vehicle's style.</summary>
        VehicleStyle Style { get; }
        /// <summary>Gets the vehicle's structure.</summary>
        VehicleFrame Structure { get; }
        /// <summary>Gets the vehicle's drive type.</summary>
        DriveType Drive { get; }

        /// <summary>Gets the vehicle's footprint.</summary>
        double Footprint { get; }

        /// <summary>Gets the "reference" curb weight of the vehicle (negating any mass reduction).</summary>
        double CurbWeightMR0 { get; }
        /// <summary>Gets the vehicle's curb weight.</summary>
        double CurbWeight { get; }
        /// <summary>Gets the vehicle's Gross Vehicle Weight Rating (GVWR).</summary>
        double GVWR { get; }
        /// <summary>Gets the vehicle's Gross Combined Weight Rating (GCWR).</summary>
        double GCWR { get; }

        /// <summary>Gets the vehicle's fuel tank capacity.</summary>
        double FuelCapacity { get; }

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

    }
}
