#include <iostream>
#include <format>
#include <string>
#include <string_view>
#include <queue>
using namespace std::string_literals;

// Klasse für Flugdaten
class Flight
{
    std::string     number;         // Flugnummer
    unsigned char   arrivalHour;    // Ankunftszeit Stunde
    unsigned char   arrivalMinute;  // Ankunftszeit Minute
  public:
    // ctor, erhaelt Flugnummer und Ankunftszeit
    Flight(std::string_view num, unsigned char hour, unsigned char minute): number(num)
    {
        arrivalHour = hour;
        arrivalMinute = minute;
    }
    // Vergleichsoperatoren für priority_queue
    auto operator <=> (const Flight& rhs) const
    {
        // Vergleiche Stunde
        auto res = rhs.arrivalHour <=> arrivalHour;
        // Wenn Stunde gleich, vergleiche Minuten
        if (res == 0)
            res = arrivalMinute <=> rhs.arrivalMinute;
        return res;
    }
    // Ueberladener Ausgabestream Operator
    friend std::ostream& operator << (std::ostream& os, const Flight& rhs);
};

// Ueberladener Operator für Ausgabestream
inline std::ostream& operator << (std::ostream& os, const Flight& rhs)
{
    os << std::format("Flug: {:>6}, Ankunft: {:02d}:{:02d}\n",
        rhs.number, rhs.arrivalHour, rhs.arrivalMinute);
    return os;
}

int main()
{
    // Prioritaetsqueue definieren
    std::priority_queue<Flight> Arrivals;

    // Fluege in Queue ablegen: flugnr, std, min
    Arrivals.push(Flight("EW 333",17,38));
    Arrivals.push(Flight("X 111",10,59));
    Arrivals.push(Flight("LH 444",10,38));
    Arrivals.push(Flight("UA 222",9,0));

    // Alle Fluege nun ausgeben und nach der Ausgabe
    // auch wieder entfernen
    while (!Arrivals.empty())
    {
        std::cout << Arrivals.top();
        Arrivals.pop();
    }
}
