#include <print>
#include <algorithm>
#include <vector>
#include <string>

using namespace std::string_literals;

int main()
{
    // Vektor mit Abflugdaten
    // Uhrzeit, Ort, Flugnummer
    struct fdata
    {
        std::string time;
        std::string destination;
        std::string flightnr;
    };
    std::vector<fdata> fluege
    {
        {"10:20"s, "Hamburg"s, "EW2046"s},
        {"10:40"s, "Atlanta"s, "DL117"s},
        {"10:45"s, "Frankfurt"s, "LH133"s},
        {"10:45"s, "Rom"s, "EW2884"s},
        {"10:50"s, "Kavala"s, "EW2688"s},
        {"11:00"s, "Istanbul"s, "TK1702"s}
    };

    // Suche ersten Flug nach 10:45
    auto iterTime = std::ranges::find_if(fluege,
                                [](const fdata& val)
                                  { return val.time > "10:45"s; }
                                 );
    std::println("Erster Flug nach 10:45 um {}: {} nach {}",
        iterTime->time, iterTime->flightnr, iterTime->destination);

    // Suche Flug nach Atlanta
    // Projektion (auszuwertendes Datum) ist destination
    auto iterAtlanta = std::ranges::find(fluege, "Atlanta"s, &fdata::destination);
    // Wenn Flug gefunden, Abflugzeit auch 10:48
    if (iterAtlanta != fluege.end())
        iterAtlanta->time = "10:48"s;

    // Suche ersten Flug nach 10:45
    iterTime = std::ranges::find_if(fluege,
                              [] (const fdata& val)
                                 { return val.time > "10:45"s; }
                              );
    std::println("Erster Flug nach 10:45 um {}: {} nach {}",
        iterTime->time, iterTime->flightnr, iterTime->destination);
}
