@using ZB.MOM.WW.OtOpcUa.Admin.Services
@using ZB.MOM.WW.OtOpcUa.Configuration.Entities
@using ZB.MOM.WW.OtOpcUa.Configuration.Validation
@inject EquipmentService EquipmentSvc
@inject NavigationManager Nav

<div class="d-flex justify-content-between mb-3">
    <h4>Equipment (draft gen @GenerationId)</h4>
    <div>
        <button class="btn btn-outline-primary btn-sm me-2" @onclick="GoImport">Import CSV…</button>
        <button class="btn btn-primary btn-sm" @onclick="StartAdd">Add equipment</button>
    </div>
</div>

@if (_equipment is null)
{
    <p>Loading…</p>
}
else if (_equipment.Count == 0 && !_showForm)
{
    <p class="text-muted">No equipment in this draft yet.</p>
}
else if (_equipment.Count > 0)
{
    <table class="table table-sm table-hover">
        <thead>
            <tr>
                <th>EquipmentId</th><th>Name</th><th>MachineCode</th><th>ZTag</th><th>SAPID</th>
                <th>Manufacturer / Model</th><th>Serial</th><th></th>
            </tr>
        </thead>
        <tbody>
        @foreach (var e in _equipment)
        {
            <tr>
                <td><code>@e.EquipmentId</code></td>
                <td>@e.Name</td>
                <td>@e.MachineCode</td>
                <td>@e.ZTag</td>
                <td>@e.SAPID</td>
                <td>@e.Manufacturer / @e.Model</td>
                <td>@e.SerialNumber</td>
                <td>
                    <button class="btn btn-sm btn-outline-secondary me-1" @onclick="() => StartEdit(e)">Edit</button>
                    <button class="btn btn-sm btn-outline-danger" @onclick="() => DeleteAsync(e.EquipmentRowId)">Remove</button>
                </td>
            </tr>
        }
        </tbody>
    </table>
}

@if (_showForm)
{
    <div class="card mt-3">
        <div class="card-body">
            <h5>@(_editMode ? "Edit equipment" : "New equipment")</h5>
            <EditForm Model="_draft" OnValidSubmit="SaveAsync" FormName="equipment-form">
                <DataAnnotationsValidator/>
                <div class="row g-3">
                    <div class="col-md-4">
                        <label class="form-label">Name (UNS segment)</label>
                        <InputText @bind-Value="_draft.Name" class="form-control"/>
                        <ValidationMessage For="() => _draft.Name"/>
                    </div>
                    <div class="col-md-4">
                        <label class="form-label">MachineCode</label>
                        <InputText @bind-Value="_draft.MachineCode" class="form-control"/>
                    </div>
                    <div class="col-md-4">
                        <label class="form-label">DriverInstanceId</label>
                        <InputText @bind-Value="_draft.DriverInstanceId" class="form-control"/>
                    </div>
                    <div class="col-md-4">
                        <label class="form-label">UnsLineId</label>
                        <InputText @bind-Value="_draft.UnsLineId" class="form-control"/>
                    </div>
                    <div class="col-md-4">
                        <label class="form-label">ZTag</label>
                        <InputText @bind-Value="_draft.ZTag" class="form-control"/>
                    </div>
                    <div class="col-md-4">
                        <label class="form-label">SAPID</label>
                        <InputText @bind-Value="_draft.SAPID" class="form-control"/>
                    </div>
                </div>

                <IdentificationFields Equipment="_draft"/>

                @if (_error is not null) { <div class="alert alert-danger mt-3">@_error</div> }

                <div class="mt-3">
                    <button type="submit" class="btn btn-primary btn-sm">Save</button>
                    <button type="button" class="btn btn-secondary btn-sm ms-2" @onclick="Cancel">Cancel</button>
                </div>
            </EditForm>
        </div>
    </div>
}

@code {
    [Parameter] public long GenerationId { get; set; }
    [Parameter] public string ClusterId { get; set; } = string.Empty;

    private void GoImport() => Nav.NavigateTo($"/clusters/{ClusterId}/draft/{GenerationId}/import-equipment");
    private List<Equipment>? _equipment;
    private bool _showForm;
    private bool _editMode;
    private Equipment _draft = NewBlankDraft();
    private string? _error;

    private static Equipment NewBlankDraft() => new()
    {
        EquipmentId = string.Empty, DriverInstanceId = string.Empty,
        UnsLineId = string.Empty, Name = string.Empty, MachineCode = string.Empty,
    };

    protected override async Task OnParametersSetAsync() => await ReloadAsync();

    private async Task ReloadAsync()
    {
        _equipment = await EquipmentSvc.ListAsync(GenerationId, CancellationToken.None);
    }

    private void StartAdd()
    {
        _draft = NewBlankDraft();
        _editMode = false;
        _error = null;
        _showForm = true;
    }

    private void StartEdit(Equipment row)
    {
        // Shallow-clone so Cancel doesn't mutate the list-displayed row with in-flight form edits.
        _draft = new Equipment
        {
            EquipmentRowId = row.EquipmentRowId,
            GenerationId = row.GenerationId,
            EquipmentId = row.EquipmentId,
            EquipmentUuid = row.EquipmentUuid,
            DriverInstanceId = row.DriverInstanceId,
            DeviceId = row.DeviceId,
            UnsLineId = row.UnsLineId,
            Name = row.Name,
            MachineCode = row.MachineCode,
            ZTag = row.ZTag,
            SAPID = row.SAPID,
            Manufacturer = row.Manufacturer,
            Model = row.Model,
            SerialNumber = row.SerialNumber,
            HardwareRevision = row.HardwareRevision,
            SoftwareRevision = row.SoftwareRevision,
            YearOfConstruction = row.YearOfConstruction,
            AssetLocation = row.AssetLocation,
            ManufacturerUri = row.ManufacturerUri,
            DeviceManualUri = row.DeviceManualUri,
            EquipmentClassRef = row.EquipmentClassRef,
            Enabled = row.Enabled,
        };
        _editMode = true;
        _error = null;
        _showForm = true;
    }

    private void Cancel()
    {
        _showForm = false;
        _editMode = false;
    }

    private async Task SaveAsync()
    {
        _error = null;
        try
        {
            if (_editMode)
            {
                await EquipmentSvc.UpdateAsync(_draft, CancellationToken.None);
            }
            else
            {
                _draft.EquipmentUuid = Guid.NewGuid();
                _draft.EquipmentId = DraftValidator.DeriveEquipmentId(_draft.EquipmentUuid);
                _draft.GenerationId = GenerationId;
                await EquipmentSvc.CreateAsync(GenerationId, _draft, CancellationToken.None);
            }
            _showForm = false;
            _editMode = false;
            await ReloadAsync();
        }
        catch (Exception ex) { _error = ex.Message; }
    }

    private async Task DeleteAsync(Guid id)
    {
        await EquipmentSvc.DeleteAsync(id, CancellationToken.None);
        await ReloadAsync();
    }
}
