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

constexpr const char* FILENAME = "../../04_Data/mitglieder.txt";

int main()
{
    // Tuple fuer Mitgliedsdaten: Eintrittsdatum (Jahr,Monat,Tag), Name
    // Durch die geschickte Anordnung der Daten im Tuple koennen
    // diese automatisch nach dem Eintrittsdatum sortiert werden!
    using data = std::tuple<unsigned short, unsigned short, unsigned short, std::string>;
    // Vektor fuer Mitgliedsdaten
    std::vector<data> mitglieder;

    // Datei mit Mitgliederliste oeffnen
    std::ifstream infile(FILENAME);
    if (!infile)
    {
        std::println("Mitgliederliste {} nicht gefunden!", FILENAME);
        exit(1);
    }

    // Daten aus Datei einlesen
    do
    {
        unsigned short tag, monat;
        unsigned short jahr;
        std::string name;

        // Name einlesen
        std::getline(infile,name,',');
        if (!infile.eof())
        {
            // Komma ueberspringen
            infile.ignore(1);
            // Datum einlesen in getrennten Variablen
            // Punkt jeweils ueberspringen
            infile >> tag;
            infile.ignore(1);
            infile >> monat;
            infile.ignore(1);
            infile >> jahr;
            infile.ignore();
            // Daten in Vektor ablegen
            mitglieder.emplace_back(jahr, monat, tag, name);
        }

    } while (!infile.eof());
    // Datei schliessen
    infile.close();

    // Mitgliederliste ausgeben
    std::println("Mitgliederliste unsortiert:");
    for (auto [jahr,monat,tag,name] : mitglieder)
        std::println("{}, {:02}.{:02}.{:04}",
            name, tag, monat, jahr);

    // Mitgliederliste nach Eintrittdatum sortieren
    // Durch die Anordnung der Daten im Tuple werden diese
    // automatisch nach dem Eintrittsdatum sortiert!
    std::ranges::sort(mitglieder);

    // Sortierte Mitgliederliste ausgeben
    std::println("\nMitgliederliste sortiert:");
    for (auto [jahr,monat,tag,name]: mitglieder)
        std::println("{}, {:02}.{:02}.{:04}",
            name, tag, monat, jahr);
}
