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

const char ARTIST_CHAR = 'a';

// Die Coroutine
MyCoroutine<int> 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 nicht Dateiende erreicht, 
        if (!infile.eof())
        {
            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 (!infile.eof());
    // Coroutine beenden, ohne einen Rueckgabewert
    co_return iCounter;
}

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();
    // Ergebnis abholen
    std::println("{} Interpreten mit {} gefunden.",
        coro1.GetValue(), ARTIST_CHAR);
}
