#include <print>
#include <iostream>
#include <fstream>
#include <string>
#include "coro_04.h"

const char ARTIST_CHAR = 'a';

// Die Coroutine
MyCoroutine<std::string> CoTask(std::ifstream& infile)
{
    std::string artist; // Interpreter
    std::string title;  // Titel
    // Zaehler fuer eingelesene Titel
    int lCounter = 1;

    // 1. Zeile mit den Spaltenueberschriften ueberspringen
    std::getline(infile, artist);
    // Alle Titel und Interpreter einlesen bis Dateiende
    // Anzahl der Interpreten zaehlen mit character beginnen
    do
    {
        // Titel einlesen
        lCounter++;
        std::getline(infile, title, ';');
        // Wenn nicht Dateiende erreicht, 
        if (!infile.eof())
        {
            std::getline(infile, artist, ';');
            // Wenn Interpret gefunden
            if (artist[0] == ARTIST_CHAR)
            {
                co_yield std::format("Zeile: {:4}, Interpr.: {}, Titel: {}",
                        lCounter, artist, title);
            }
            // Rest der Zeile ueberspringen
            std::getline(infile, title);
        }
    } while (!infile.eof());
    // Coroutine beenden, ohne einen Rueckgabewert
    co_return;
}

int main()
{
    // Eingabedatei oeffnen und eventl. Fehler abfangen
    std::ifstream infile("../../04_Data/swr1_hitparade.csv");
    if (!infile)
    {
        std::println("Fehler beim Oeffnen der Datei!");
        exit(1);
    }

    // Coroutinen-Objekt erstellen
    // coro1 ist das Ergebnis des Aufrufs von get_return_object()
    auto coro1 = CoTask(infile);
    // Zaehler fuer Abfrage ob weitere Daten
    // eingelesen werden soll
    int counter = 0;

    // Lese Daten solange ein, bis
    // - resume() false liefert
    //   (d.h. die Coroutine sich beendet)
    // - oder das Einlesen abgebrochen wird
    while (coro1.resume())
    {
        // Eingelesenes Datum holen und ausgeben
        auto retVal = coro1.GetActValue();
        std::println("{}", retVal);
        // Nach jedem 5. Datum Abfrage ob weiter
        // weitere Daten eingelesen werden sollen
        if (++counter == 5)
        {
            char answer;
            std::print("Weitere Daten einlesen (j/n)? ");
            std::cin >> answer;
            if (answer != 'j')
                break;
            counter = 0;
        }
    }
    // Und Datei wieder schliessen!!
    infile.close();
}
