#include <print>
#include <fstream>
#include <vector>
#include <charconv>
#include <string>

// Dateiname
constexpr const char* FNAME = "../../04_Data/aktien.csv";
// Eigenschaften einer Aktie
struct Aktie
{
    std::string name;
    float aktKurs;
    float maxKurs;
    std::string maxDatum;
};

int main()
{
    // Vektor fuer Aktiendaten
    std::vector<Aktie> aktien;

    // Datei oeffnen und Fehler abfangen
    std::ifstream infile(FNAME);
    if (!infile)
    {
        std::println("Datei nicht gefunden: {}\n", FNAME);
        exit(1);
    }
    // Daten einlesen
    do
    {
        // Eingelesen Zeile
        std::string line;
        // Aktiendaten
        std::string sname, smaxDatum;
        float faktKurs, fmaxKurs;

        // Zeile einlesen
        // Bei erreichen des Dateiendes den Rest überspringen
        if(getline(infile,line); infile.eof())
            continue;
        // 1. Semikolon suchen und Name extrahieren
        auto sepPos = line.find(';');
        sname = line.substr(0, sepPos);
        // aktuellen Kurs extrahieren
        auto res = std::from_chars(line.c_str() + sepPos+1,
                            line.c_str() + sepPos + 10, faktKurs);
        if (res.ec != std::errc())
        {
            std::println("Fehler _aktKurs in Zeile {}", line);
            exit(1);
        }
        // Hoechster Kurs
        res = std::from_chars(res.ptr + 1, res.ptr + 10, fmaxKurs);
        if (res.ec != std::errc())
        {
            std::println("Fehler _maxKurs in Zeile {}", line);
            exit(1);
        }
        // Datum hoechster Kurs
        // res.ptr zeigt bereits auf letztes Semikolon
        smaxDatum = line.substr(res.ptr+1 - line.c_str());
        // Daten in Vektor uebernehmen
        aktien.push_back({sname, faktKurs, fmaxKurs, smaxDatum});

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

    int mindex = 0;         // Index des groessen Verlusts
    float mdiff = 1.0f;     // maximaler Verlust
    int index = 0;          // Indexzaehler
    // Vektor durchlaufen und Daten auslesen (structured binding!)
    for (const auto& [sname,faktKurs,fmaxKurs,smaxDatum]: aktien)
    {
        // Daten ausgeben
        std::println("{} akt: {:.2F}, max: {:.2F} am {}",
                sname, faktKurs, fmaxKurs, smaxDatum);
        // Verlust in Prozent mit max. Verlust vergleichen
        auto verlust = faktKurs / fmaxKurs;
        if (verlust < mdiff)
        {
            // Neuer max. Verlust gefunden und merken
            mdiff = verlust;
            mindex = index;
        }
        // Index erhoehen
        index++;
    }
    // Daten des max. Verlust aus Vektor holen
    auto [untern,akt,hoch,dat] = aktien[mindex];
    // Und ausgeben
    std::println("\nGroesster Verlust: {} {:.0f} %\n", untern, (1.0f - mdiff) * 100.);
}
