#include <print>
#include <string>
#include <utility>
#include <vector>
#include <algorithm>
#include <ranges>
using namespace std::literals;

// Datentyp fuer Artikel
using dtArtikel = std::pair<unsigned long, std::string>;

// Lambda-Funktion zur Ausgabe eines Artikels
auto PrintArtikel = [] (const dtArtikel& data)
{
    std::println("Artikel-Nr: {}, Artikel: {}",data.first,data.second);
};

// Lagerliste
std::vector<dtArtikel> lager
{
    {10'0919, "Lego-Technik"s},
    {20'0454, "Kochtoepfe"s},
    {20'0562, "Besteck"s},
    {10'2333, "Puppen"s},
    {30'4234, "Herren-Oberbekleidung"s},
    {30'2342, "Damen-Oberbekleidung"s},
    {20'7535, "Porzellan"s},
    {10'5634, "PC Spiele"s}
};

int main()
{
    // Lagerliste ausgeben
    std::println("Lagerliste:");
    std::ranges::for_each (lager, PrintArtikel);

    // Liste mit 10'... Artikel zusammenstellen
    std::vector<dtArtikel> artikel10;
    std::ranges::copy_if(lager,std::back_inserter(artikel10),
        [](const dtArtikel& data)
        {
            return (data.first >= 10'0000) && (data.first < 20'0000);
        });

    // Liste mit 20'... Artikel zusammenstellen
    std::vector<dtArtikel> artikel20;
    std::ranges::copy_if(lager, std::back_inserter(artikel20),
        [](const dtArtikel& data)
        {
            return (data.first >= 20'0000) && (data.first < 30'0000);
        });

    // Liste mit 30'... Artikel zusammenstellen
    std::vector<dtArtikel> artikel30;
    std::ranges::copy_if(lager, std::back_inserter(artikel30),
        [](const dtArtikel& data)
        {
            return (data.first >= 30'0000) && (data.first < 40'0000);
        });

    // Listen ausgeben
    std::println("\nArtikelgruppe 10'0000");
    std::ranges::for_each(artikel10, PrintArtikel);
    std::println("\nArtikelgruppe 20'0000");
    std::ranges::for_each(artikel20, PrintArtikel);
    std::println("\nArtikelgruppe 30'0000");
    std::ranges::for_each(artikel30, PrintArtikel);

    // Alternative Loesung wenn lediglich eine Sicht auf
    // eine Artikelgruppe benoetigt wird
    std::println("\nArtikelgruppe 10'0000 (View!)");
    auto filter_10 = [](const dtArtikel& data)
    {
        return (data.first >= 10'0000) && (data.first < 20'0000);
    };
    std::ranges::for_each(lager | std::views::filter(filter_10), PrintArtikel);
}
