@page "/produktion/störungen"
@using DxBlazorApplication2.Components.Formen
@using DxBlazorApplication2.Services.Produktion;
@using DxBlazorApplication2.Data.Produktion;
@rendermode InteractiveServer
@inject BDSTService _BDSTService;
@inject TabellenService _TabellenService;
@inject IDialogService DialogService;
@implements IDisposable

<PageTitle>Störungen</PageTitle>

<div class="border" style="padding: 20px; margin-top: 20px;">
    <table>
        <thead>
            <tr>
                <th width="100px">Linie</th>
                <th width="100px"></th>
                <th width="100px">Startzeit</th>
                <th width="150px">Kostenstelle</th>
                <th width="200px">Art</th>
                <th width="200px">Code</th>
                <th width="200px">Stillstand</th>
                <th width="50px">Schlosser</th>
                <th width="50px">Elektriker</th>
                <th width="50px">Sonstige</th>
                <th width="100px">Endzeit</th>
                <th width="100px"></th>
                <th width="100px"></th>
            </tr>
        </thead>
        <tbody>
        @foreach (var item in Items)
        {
            <tr>
                <td>
                    <div class="@ItemClass(item)">@item.BTLINI</div>
                </td>
                @if (item.Sichtbar)
                {
                        <td>
                            <DxButton class="btn btn-primary" onclick="@(() => Beenden(item))">Beenden</DxButton>
                        </td>
                        <td>
                            <DxTimeEdit @bind-Time="@item.BTTIMV"
                            NullText="Startzeit"
                            ClearButtonDisplayMode="DataEditorClearButtonDisplayMode.Auto"
                            InputId="deBTTIMV" />
                        </td>
                        <td>
                            <DxComboBox Data="_BTMTYP" ValueFieldName="@nameof(TabellenItem.TABKEY)" TextFieldName="@nameof(TabellenItem.TABTEXT)" @bind-Value="@item.BTMTYP"
                            InputId="deBTMTYP" />
                        </td>
                        <td>
                            <DxComboBox Data="_BTSTYP" ValueFieldName="@nameof(TabellenItem.TABKEY)" TextFieldName="@nameof(TabellenItem.TABTEXT)" @bind-Value="@item.BTSTYP"
                                        InputId="deBTSTYP" />
                        </td>
                        <td>
                            <DxComboBox Data="_BTSCOD" ValueFieldName="@nameof(TabellenItem.TABKEY)" TextFieldName="@nameof(TabellenItem.TABTEXT)" @bind-Value="@item.BTSCOD"
                            InputId="deBTSCOD" />
                        </td>
                        <td>
                            <DxComboBox Data="_BTSTIL" ValueFieldName="@nameof(TabellenItem.TABKEY)" TextFieldName="@nameof(TabellenItem.TABTEXT)" @bind-Value="@item.BTSTIL"
                            InputId="deBTSTIL" />
                        </td>
                        <td>
                            <DxMaskedInput @bind-Value="@item.BTSCHL"/>
                        </td>
                        <td>
                            <DxMaskedInput @bind-Value="@item.BTELEK"/>
                        </td>
                        <td>
                            <DxMaskedInput @bind-Value="@item.BTSONS" />
                        </td>
                        <td>
                            <DxTimeEdit @bind-Time="@item.BTTIMB"
                            NullText="Endzeit"
                            ClearButtonDisplayMode="DataEditorClearButtonDisplayMode.Auto"
                            InputId="deBTTIMB" />
                        </td>
                        <td>
                            <DxButton class="btn btn-primary" onclick="@(() => Speichern(item))">Speichern</DxButton>
                        </td>
                        <td>
                            <DxButton class="btn btn-danger" onclick="@(() => Löschen(item))">Löschen</DxButton>
                        </td>
                }
                @if (!item.Sichtbar)
                {
                        <td>
                            <DxButton class="btn btn-primary" onclick="@(() => StarteErfassung(item))">Störung!</DxButton>
                        </td>
                }
                </tr>
                @if(!string.IsNullOrWhiteSpace(item.Fehlertext))
                {
                    <tr>
                        <td></td>
                        <td colspan="10" class="text-danger">@item.Fehlertext</td>
                    </tr>
                }

            }
     </tbody>
</table>
</div>

<div class="border" style="padding: 20px">
    <div style="display: flex; align-items: center; width: 400px;">
        <div style="margin-right: 10px">Linie</div>
        <label for="NeueLinie" class="d-none">Linie</label>
        <DxTextBox @bind-Text="NeueLinie.LILINI" style="margin-right: 10px" id="NeueLinie" />
        <DxButton class="btn btn-primary" onclick="@(() => AddLinie(NeueLinie.LILINI))">Hinzufügen</DxButton>
        <DxButton class="btn btn-danger" onclick="@(() => RemoveLinie(NeueLinie.LILINI))">Entfernen</DxButton>
    </div>
</div>

<DxDialogProvider />

@code
{
    private LISTItem NeueLinie = new LISTItem();
    private List<LISTItem> Linien { get; set; } = new List<LISTItem>();
    private List<BDSTItemStörung> Items { get; set; } = new List<BDSTItemStörung>();
    private List<TabellenItem> _BTMTYP { get; set; } = new List<TabellenItem>();
    private List<TabellenItem> _BTSTYP { get; set; } = new List<TabellenItem>();
    private List<TabellenItem> _BTSCOD { get; set; } = new List<TabellenItem>();
    private List<TabellenItem> _BTSTIL { get; set; } = new List<TabellenItem>();


    protected override void OnInitialized()
    {
        _BTMTYP = _TabellenService.GetTabellenItems("BTMTYP");
        _BTSTYP = _TabellenService.GetTabellenItems("BTSTYP");
        _BTSCOD = _TabellenService.GetTabellenItems("BTSCOD");
        _BTSTIL = _TabellenService.GetTabellenItems("BTSTIL");
        Linien.Add(new LISTItem("BU01101"));
        Linien.Add(new LISTItem("BS02101"));
        Linien.Add(new LISTItem("BS03101"));
        Linien.Add(new LISTItem("BS04101"));
        Items = GetItems().ToList();
        this._BDSTService.OnItemChanged += this.OnItemChanged;
    }

    public void Dispose()
    {
        // Austragen, da Seite nicht mehr benutzt wird
        this._BDSTService.OnItemChanged -= this.OnItemChanged;
        objRef?.Dispose();
    }

    public string ItemClass(TodoItem item)
    {
        return item.Completed ? "item-completed" : "";
    }

    public void AddLinie(string linie)
    {
        foreach(LISTItem item in Linien)
            if (item.LILINI == linie)
                return;
        Linien.Add(new LISTItem(linie));
        Items = GetItems().ToList();
        StateHasChanged();
    }
    public void RemoveLinie(string linie)
    {
        foreach (LISTItem item in Linien)
            if (item.LILINI == linie)
            {
                Linien.Remove(item);
                break;
            }
        Items = GetItems().ToList();
        StateHasChanged();
    }

    public void StarteErfassung(BDSTItemStörung item)
    {
        item.Sichtbar = true;
        item.BTTIMV = DateTime.Now;
        item.Fehlertext = null;
        _BDSTService.AddItem(item);
        StateHasChanged();
    }
    public void Speichern(BDSTItemStörung item)
    {
        item.Fehlertext = null;
        _BDSTService.AddItem(item);
    }
    public async void Löschen(BDSTItemStörung item)
    {
        bool Result = await DialogService.ConfirmAsync(new MessageBoxOptions()
        {
            Text = $"Soll die Störung auf Linie {item.BTLINI} wirklich gelöscht werden?",
            OkButtonText = "Ja",
            CancelButtonText = "Nein",
            ShowIcon = false,
            ShowCloseButton = false,
            RenderStyle = MessageBoxRenderStyle.Danger,
        });
        if (Result == true)
        {
            Items.Remove(item);
            _BDSTService.RemoveItem(item);
        }
    }

private async Task OpenConfirmDialogAsync()
{
}

    public void Beenden(BDSTItemStörung item)
    {
        item.Fehlertext = null;
        if (string.IsNullOrWhiteSpace(item.BTMTYP))
            item.Fehlertext = "Kostenstelle fehlt";
        else if (string.IsNullOrWhiteSpace(item.BTSTYP))
            item.Fehlertext = "Störungsart fehlt";
        else if (string.IsNullOrWhiteSpace(item.BTSCOD))
            item.Fehlertext = "Störungscode fehlt";
        else if (string.IsNullOrWhiteSpace(item.BTSTIL))
            item.Fehlertext = "Stillstandsangabe fehlt";
        else
        {
            if (item.BTTIMB == DateTime.MinValue)
                item.BTTIMB = DateTime.Now;
            Items.Remove(item);
            _BDSTService.RemoveItem(item);
        }
        if (!string.IsNullOrWhiteSpace(item.Fehlertext))
            StateHasChanged();
    }


    public string ItemClass(BDSTItemStörung item)
    {
        return item.Sichtbar ? "stoerung_aktiv" : "";
    }


    private string LastKeyPressed { get; set; } = "N/A";
    private DotNetObjectReference<ToDoListe>? objRef;


    public async void OnItemChanged(object sender, BDSTServiceEventArgs args)
    {
        await InvokeAsync(() =>
        {
            // Falls das geänderte Item in der lokalen Liste ist, rauswerfen!
            if (Items.Contains((BDSTItemStörung)args.DataItem))
                Items.Remove((BDSTItemStörung)args.DataItem);
            // Item-Liste neu aufbauen
            Items = GetItems().ToList();
            StateHasChanged();
        });
    }

    public IEnumerable<BDSTItemStörung> GetItems()
    {
        Dictionary<string, BDSTItemStörung> currentItems = new Dictionary<string, BDSTItemStörung>();
        foreach (BDSTItemStörung item in Items)
            currentItems[item.BTLINI] = item;
        Dictionary<string, BDSTItemStörung> items = new Dictionary<string, BDSTItemStörung>();
        foreach (LISTItem linie in Linien)
        {
            if (_BDSTService.GetDictionary().ContainsKey(linie.LILINI))
            {
                items.Add(linie.LILINI, (BDSTItemStörung)_BDSTService.GetDictionary()[linie.LILINI]);
                items[linie.LILINI].Sichtbar = true;
                items[linie.LILINI].Fehlertext = null;
            }
            else if (currentItems.ContainsKey(linie.LILINI))
                items.Add(linie.LILINI, currentItems[linie.LILINI]);
            else 
                items.Add(linie.LILINI, new BDSTItemStörung(linie.LILINI));
        }
        return items.Values;
    }


}