module;
#include <iostream>
#include <string>
#include <string_view>

export module Vehicle;

// Basisklasse
// Alle Eigenschaften sind protected, somit kann
// kein Objekt vom Typ Vehicle definiert werden!
class Vehicle
{
protected:
    std::string model;  // Modellbezeichnung
    unsigned int range; // Reichweite
    // ctor
    Vehicle(std::string_view _model, unsigned int _range) :
        model(_model), range(_range)
    {
    }
    // Ausgabe der Eigenschaften
    void VehiclePrint() const
    {
        std::cout << "Modell: " << model << ", Reichweite: " << range;
    }
};

// Verbrenner ist ein Fahrzeug
export class Petrol : public Vehicle
{
    unsigned int tank;  // Tankinhalt
public:
    // ctor
    Petrol(std::string_view _model, unsigned int _range,
        unsigned char _tank) :
        Vehicle(_model, _range), tank(_tank)
    {
    }
    // Ueberladener Operator zur Ausgabe der Daten
    friend std::ostream& operator << (std::ostream& out, const Petrol& obj);
};

// E-Auto ist ein Fahrzeug
export class Electric : public Vehicle
{
    unsigned int battery;   // Batteriekapauitaet
public:
    // ctor
    Electric(std::string_view _model, unsigned int _range,
        unsigned int _bat) :
        Vehicle(_model, _range), battery(_bat)
    {
    }
    // Ausgabe der Daten
    friend std::ostream& operator << (std::ostream& out, const Electric& obj);
};
// Definition der ueberladenen Operatoren <<
export std::ostream& operator << (std::ostream& out, const Petrol& obj)
{
    obj.VehiclePrint();
    std::cout << ", Tankinhalt: " << obj.tank << " ltr.\n";
    return out;
}
export std::ostream& operator << (std::ostream& out, const Electric& obj)
{
    obj.VehiclePrint();
    std::cout << ", Batteriekapazitaet: " << obj.battery << " kWh\n";
    return out;
}