@page "/inventur/vorbereiten"
@using Blazor.IndexedDB
@using ScannerPilot.Data
@using System.Net.Http.Headers
@using System.Text.Json
@using static System.Net.WebRequestMethods
@using Art = ScannerPilot.Data.Artikel

@inject IIndexedDbFactory DbFactory
@inject HttpClient httpClient
@inject IJSRuntime JS

<PageTitle>Home</PageTitle>

<h3>Artikelliste</h3>

@if (!string.IsNullOrEmpty(message))
{
    <div class="alert alert-warning">
        ⚠ @message
        <NavLink class="alert-link" href="/einstellungen"> → zu den Einstellungen</NavLink>
    </div>

    @artikelmessage
}

<div class="mb-3">
    <button class="btn btn-primary" @onclick="InsertFromApi">Artikel aus API einfügen</button>
    <button class="btn btn-secondary ms-2" @onclick="Reload">Neu laden</button>
    <button class="btn btn-danger ms-2" @onclick="ForceRefresh">Alles löschen</button>
</div>

@if (artikelliste is null)
{
    <p class="text-muted">Lade…</p>
}
else if (artikelliste.Count == 0)
{
    <p><i>Keine Artikel vorhanden.</i></p>
}
else
{
    <div class="table-responsive">
        <table class="table table-sm table-striped align-middle">
            <thead class="table-light">
                <tr>
                    <th style="width:80px">Key</th>
                    <th>Artikel-Nr.</th>
                    <th>Variante</th>
                    <th>Bezeichnung</th>
                    <th>Barcode</th>
                    <th class="text-end">Nettogewicht (g)</th>
                </tr>
            </thead>
            <tbody>
                @foreach (var a in artikelliste)
                {
                    <tr>
                        <td>@a.ArtikelVariantenId</td>
                        <td>@a.Nummer</td>
                        <td>@a.Variante</td>
                        <td>@a.Bezeichnung</td>
                        <td>@a.Barcode</td>
                        <td class="text-end">@a.NettoGewicht.ToString("0.###")</td>
                    </tr>
                }
            </tbody>
        </table>
    </div>
}

@code {
    private List<Artikel>? artikelliste;

    private string? message;
    private string? artikelmessage;

    private string? filialId;

    protected override async Task OnInitializedAsync()
    {
        filialId = await JS.InvokeAsync<string?>("localStorage.getItem", "scannerpilot.filialId");

        if (string.IsNullOrWhiteSpace(filialId))
        {
            message = "⚠ Bitte zuerst eine Filial-ID in den Einstellungen hinterlegen!";
            filialId = "000";
        }

        await Reload();
    }

    private async Task Reload()
    {
        using var db = await DbFactory.Create<ScannerPilotDB>();
        artikelmessage = db.ArtikelListe.Count().ToString();
        // artikelliste = db.ArtikelListe.ToList();
        StateHasChanged();
    }

    private async Task ForceRefresh()
    {
        using var db = await DbFactory.Create<ScannerPilotDB>();
        db.ArtikelListe.Clear();
        await db.SaveChanges();
        await Reload();
    }

    public class ApiArtikelDto
    {
        public string ArtikelVariantenId { get; set; }
        public string Barcode { get; set; }
        public string Nummer { get; set; }
        public string Bezeichnung { get; set; }
        public string Mengeneinheit { get; set; }
        public double NettoGewicht { get; set; }
        public string Variante { get; set; }
    }

    private async Task InsertFromApi()
    {
        string url = @"http://192.168.178.187:7000/GetArtikelliste";
        //string url = "https://feiertage-api.de/api/?jahr=2025&nur_land=SN";

        try
        {
            using var req = new HttpRequestMessage(HttpMethod.Get, url);
            using var resp = await httpClient.SendAsync(req, HttpCompletionOption.ResponseHeadersRead);

            var body = await resp.Content.ReadAsStringAsync();
            // Console.WriteLine(body); // Debug-Ausgabe


            var artikelVonApi = JsonSerializer.Deserialize<Dictionary<string, ApiArtikelDto>>(body);

            // if (artikelVonApi != null)
            // {
            //     foreach (var a in artikelVonApi)
            //     {
            //         Console.WriteLine($"Name: {a.Key}");
            //         Console.WriteLine($"ArtikelVariantenId: {a.Value.ArtikelVariantenId}");
            //         Console.WriteLine($"Nummer: {a.Value.Nummer}");
            //         Console.WriteLine("------");
            //     }
            // }


            if (artikelVonApi != null && artikelVonApi.Count > 0)
            {
                using var db = await DbFactory.Create<ScannerPilotDB>();

                foreach (var kv in artikelVonApi)
                {
                    var dto = kv.Value;

                    // DTO → IndexedDB-Entity mappen
                    var artikel = new Artikel
                        {
                            ArtikelVariantenId = int.TryParse(dto.ArtikelVariantenId, out var id) ? id : 0,
                            Barcode = dto.Barcode,
                            Nummer = dto.Nummer,
                            Bezeichnung = dto.Bezeichnung,
                            Mengeneinheit = dto.Mengeneinheit,
                            NettoGewicht = dto.NettoGewicht,
                            Variante = string.IsNullOrWhiteSpace(dto.Variante) ? "0" : dto.Variante
                        };

                    // Upsert in IndexedDB per ArtikelVariantenId
                    var existing = db.ArtikelListe.FirstOrDefault(x => x.ArtikelVariantenId == artikel.ArtikelVariantenId);
                    if (existing is not null)
                    {
                        db.ArtikelListe.Remove(existing);
                    }

                    db.ArtikelListe.Add(artikel);
                }

                await db.SaveChanges();
                await Reload();
            }


















            // using var db = await DbFactory.Create<ScannerPilotDB>();

            // foreach (var a in artikelVonApi)
            // {

            //     db.ArtikelListe.Add(a.Key);
            // }

            // await db.SaveChanges();
            // await Reload();
            }
            catch (Exception ex)
            {
                Console.WriteLine($"Fehler beim API-Insert: {ex}");
            } 
        }
    }
}

