#include <print>
#include <list>
#include <tuple>
#include <string>

using namespace std::string_literals;

// tuple fuer Abflugdaten
// Stunde, Minute, Flugnummer, Zielort
using data = std::tuple<int,int,std::string, std::string>;

// Vergleichsfunktion, wird von sort() aufgerufen
bool SortIt(const data& tup1, const data& tup2)
{
    // Zielorte vergleichen
    return std::get<3>(tup1) > std::get<3>(tup2);
}

int main()
{
    // Liste mit Flugdaten
    std::list<data> flights;
    // Flugdaten hinzufuegen
    flights.emplace_back(10,30,"X 53"s,"Palma de Mallorca"s);
    flights.emplace_back(15,15,"LH 333"s,"Alicante"s);
    flights.emplace_back(8,10,"AA 657"s,"New York"s);
    flights.emplace_back(8,0,"GW 392"s,"Hamburg"s);

    // Flugdaten ausgeben
    for (const auto& [hour, minute, num, dest] : flights)
        std::println("{:02}:{:02}, Flug {:7} nach {}",
            hour, minute, num, dest);

    // Fluege nach Abflugzeiten sortieren
    // Standard sort() kann deswegen verwendet werden, da ein
    // tuple Vergleichsoperatoren ueberlaedt und der
    // Vergleich in der Reihenfolge der Elemente erfolgt
    flights.sort();

    // Sortierte Flugdaten ausgeben
    std::println("\nSortiert nach Abflugzeit:");
    for (const auto& [hour, minute, num, dest]: flights)
        std::println("{:02}:{:02}, Flug {:7} nach {}",
            hour, minute, num, dest);

    // Sortieren nach Zielort, absteigend
    flights.sort(SortIt);
    std::println("\nSortiert nach Zielort:");
    for (const auto& [hour, minute, num, dest]: flights)
        std::println("{:02}:{:02}, Flug {:7} nach {}",
            hour, minute, num, dest);
}
