@inherits CmdBase
@attribute [MongoCommand(CmdType.Admin, "Create index", "Indexes")]

@*
 *                                dbMango
 *
 * Copyright 2025 Deutsche Bank AG
 * SPDX-License-Identifier: Apache-2.0
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *@

<style>
    .CodeMirror {
    width: 800px;
    height: 800px;
    max-height: 800px;
    }
</style>

<div class="@Class">
    <div class="form-row">
        <IndexEditComponent @bind-Json="IndexJson" @bind-IsValid="@IsValid" Collection="@Collection" />
    </div>
    <div class="form-row">
        <FormJson Value="@(Parameters?.CommandJson)" Class="cmd-json" />
    </div>
    <div class="form-row">
        <FormJson Value="@Result" Class="res-json"/>
    </div>
</div>

@code {
    private string IndexJson
    {
        get;
        set
        {
            if (field == value)
                return;
            field = value;
            UpdateCommand();
        }
    } = "{}";

    private bool IsValid 
    {
        get;
        set
        {
            if (field == value)
                return;
            field = value;
            Validate();
        }
    }

    private void UpdateCommand()
    {
        if (Parameters == null)
            return;

        Parameters.CommandJson = JsonUtils.FormatJson($@"{{
    ""createIndexes"": ""{Collection}"",
    ""indexes"": [ {IndexJson} ],
    ""comment"" : ""Created by {UserSession.User.GetEmail()}""
}}");
        Parameters.NeedConfirmation = true;
        Validate();
        InvokeAsync(StateHasChanged);
    }

    protected override void Validate()
    {
        if (Parameters != null && Parameters.CanExecute != IsValid)
        {
            Parameters.CanExecute = IsValid;
            InvokeAsync(StateHasChanged);
        }

    }

    protected override Task OnCollectionChanged()
    {
        IndexJson = "{}";
        UpdateCommand();
        return Task.CompletedTask;
    }

}