@page "/clusters/new"
@using System.ComponentModel.DataAnnotations
@using ZB.MOM.WW.OtOpcUa.Admin.Services
@using ZB.MOM.WW.OtOpcUa.Configuration.Entities
@using ZB.MOM.WW.OtOpcUa.Configuration.Enums
@inject ClusterService ClusterSvc
@inject GenerationService GenerationSvc
@inject NavigationManager Nav

<h1 class="mb-4">New cluster</h1>

<EditForm Model="_input" OnValidSubmit="CreateAsync" FormName="new-cluster">
    <DataAnnotationsValidator/>

    <div class="row g-3">
        <div class="col-md-6">
            <label class="form-label">ClusterId <span class="text-danger">*</span></label>
            <InputText @bind-Value="_input.ClusterId" class="form-control"/>
            <div class="form-text">Stable internal ID. Lowercase alphanumeric + hyphens; ≤ 64 chars.</div>
            <ValidationMessage For="() => _input.ClusterId"/>
        </div>
        <div class="col-md-6">
            <label class="form-label">Display name <span class="text-danger">*</span></label>
            <InputText @bind-Value="_input.Name" class="form-control"/>
            <ValidationMessage For="() => _input.Name"/>
        </div>
        <div class="col-md-4">
            <label class="form-label">Enterprise</label>
            <InputText @bind-Value="_input.Enterprise" class="form-control"/>
        </div>
        <div class="col-md-4">
            <label class="form-label">Site</label>
            <InputText @bind-Value="_input.Site" class="form-control"/>
        </div>
        <div class="col-md-4">
            <label class="form-label">Redundancy</label>
            <InputSelect @bind-Value="_input.RedundancyMode" class="form-select">
                <option value="@RedundancyMode.None">None (single node)</option>
                <option value="@RedundancyMode.Warm">Warm (2 nodes)</option>
                <option value="@RedundancyMode.Hot">Hot (2 nodes)</option>
            </InputSelect>
        </div>
    </div>

    @if (!string.IsNullOrEmpty(_error))
    {
        <div class="alert alert-danger mt-3">@_error</div>
    }

    <div class="mt-4">
        <button type="submit" class="btn btn-primary" disabled="@_submitting">Create cluster</button>
        <a href="/clusters" class="btn btn-secondary ms-2">Cancel</a>
    </div>
</EditForm>

@code {
    private sealed class Input
    {
        [Required, RegularExpression("^[a-z0-9-]{1,64}$", ErrorMessage = "Lowercase alphanumeric + hyphens only")]
        public string ClusterId { get; set; } = string.Empty;

        [Required, StringLength(128)]
        public string Name { get; set; } = string.Empty;

        [StringLength(32)] public string Enterprise { get; set; } = "zb";
        [StringLength(32)] public string Site { get; set; } = "dev";
        public RedundancyMode RedundancyMode { get; set; } = RedundancyMode.None;
    }

    private Input _input = new();
    private bool _submitting;
    private string? _error;

    private async Task CreateAsync()
    {
        _submitting = true;
        _error = null;

        try
        {
            var cluster = new ServerCluster
            {
                ClusterId = _input.ClusterId,
                Name = _input.Name,
                Enterprise = _input.Enterprise,
                Site = _input.Site,
                RedundancyMode = _input.RedundancyMode,
                NodeCount = _input.RedundancyMode == RedundancyMode.None ? (byte)1 : (byte)2,
                Enabled = true,
                CreatedBy = "admin-ui",
            };

            await ClusterSvc.CreateAsync(cluster, createdBy: "admin-ui", CancellationToken.None);
            await GenerationSvc.CreateDraftAsync(cluster.ClusterId, createdBy: "admin-ui", CancellationToken.None);

            Nav.NavigateTo($"/clusters/{cluster.ClusterId}");
        }
        catch (Exception ex)
        {
            _error = ex.Message;
        }
        finally { _submitting = false; }
    }
}
