#include <print>
#include <coroutine>
#include <fstream>
#include <string>
#include "coro_02.h"

const int ARTIST_MAX = 10;
const char ARTIST_CHAR = 'a';

// Die Coroutine
MyCoroutine CoTask(std::ifstream& infile)
{
    std::string artist; // Interpreter
    std::string title;  // Titel
    // Zaehler fuer gefundene Interpreter
    int iCounter = 0;
    // 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 Dateiende erreicht, 
        if (infile.eof())
            break;
        std::getline(infile, artist, ';');
        // Wenn Interpret gefunden
        if (artist[0] == ARTIST_CHAR)
        {
            std::println("Zeile: {:4}, Interpr.: {}, Titel: {}",
                lCounter, artist, title);
            iCounter++;
        }
        // Rest der Zeile ueberspringen
        std::getline(infile, title);
    } while (iCounter != ARTIST_MAX);
    // 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);
    // Coroutine fortsetzen, da in initial_suspend()
    // die Coroutine unterbrochen wurde
    coro1.resume();

    // Und Datei wieder schliessen!!
    infile.close();
}
