#include <iostream>
#include <format>
#include <string>
#include <unordered_map>
#include <vector>
#include <algorithm>

using namespace std::string_literals;

// Aktiendepot als unordered_map da eine Aktie
// nur einmal im Depot vorkommen kann
// std::string enthaelt den Aktienname
// std::vector enthaelt die Aktienkurse
using adata = std::unordered_map<std::string, std::vector<float>>;
adata aktien;

// Gibt den Aktienname und den Kurs aus
// Wird ueber for_each() aufgerufen
// adata::value_type ist ein std::pair und enthaelt ein
// Element aus der unordered_map des Aktiendepots
auto PrintAktien = [](const adata::value_type& aktie)
{
    std::cout << std::format("{}: {:.02f}\n", aktie.first, aktie.second.back());
};


int main()
{

    // Aktien anlegen
    aktien["Addidas AG"s].push_back(275.00f);
    aktien["Allianz SE"s].push_back(212.00f);
    aktien["BASF SE"s].push_back(64.00f);
    aktien["Bayer AG"s].push_back(68.00f);
    // und ausgeben
	std::cout << "1. Tag:\n";
    std::ranges::for_each(aktien, PrintAktien);
    // Summe der Aktien berechnen
    // Letzter Eintrag im Kurs-Vektor enthaelt aktuellen Kurs
    // adata::value_type ist der Datentyp der im Vektor abgelegten Daten!
    float sum = 0.00f;
    std::ranges::for_each(aktien,
                [&sum](const adata::value_type& aktie)
                 { sum += aktie.second.back(); }
             );
    std::cout << std::format("Depotwert: {:.02f}\n", sum);

    // Neuen Aktienkurs eintragen
    aktien["Addidas AG"s].push_back(274.00f);
    aktien["Allianz SE"s].push_back(214.25f);
    aktien["BASF SE"s].push_back(65.00f);
    aktien["Bayer AG"s].push_back(65.30f);
    // und ausgeben
    std::cout << "\n2. Tag:\n";
    std::ranges::for_each(aktien, PrintAktien);
    // Summe der Aktien berechnen
    sum = 0.0f;
    for_each(aktien.begin(), aktien.end(),
                [&sum](const adata::value_type& aktie)
                 { sum += aktie.second.back(); }
             );
    std::cout << std::format("Depotwert: {:.02f}\n", sum);

    // Neuen Aktienkurs eintragen
    aktien["Addidas AG"s].push_back(272.30f);
    aktien["Allianz SE"s].push_back(215.75f);
    aktien["BASF SE"s].push_back(65.10f);
    aktien["Bayer AG"s].push_back(68.00f);
    // und ausgeben
    std::cout << "\n3. Tag:\n";
    std::ranges::for_each(aktien, PrintAktien);
    // Neue Summe der Aktien berechnen
    sum = 0.00f;
    std::ranges::for_each(aktien,
                [&sum](const adata::value_type& aktie)
                 { sum += aktie.second.back(); }
             );
    std::cout << std::format("Depotwert: {:.02f}\n", sum);

    // Aktienkurs-Verlauf ausgeben
    std::cout << "\nKursverlaeufe:\n";
    std::ranges::for_each(aktien,
                [](const adata::value_type& aktie)
                 {
            std::cout << std::format("{}: ", aktie.first);
            for (const auto& val : aktie.second)
                std::cout << std::format("{:.02f}, ", val);
            std::cout << '\n';
                 }
             );
}
