@using AIStudio.Provider
@using AIStudio.Provider.SelfHosted

<MudDialog>
    <DialogContent>
        <MudForm @ref="@this.form" @bind-IsValid="@this.dataIsValid" @bind-Errors="@this.dataIssues">
            <MudStack Row="@true" AlignItems="AlignItems.Center">
                @* ReSharper disable once CSharpWarnings::CS8974 *@
                <MudSelect @bind-Value="@this.DataLLMProvider" Label="Provider" Class="mb-3" OpenIcon="@Icons.Material.Filled.AccountBalance" AdornmentColor="Color.Info" Adornment="Adornment.Start" Validation="@this.providerValidation.ValidatingProvider">
                    @foreach (LLMProviders provider in Enum.GetValues(typeof(LLMProviders)))
                    {
                        if (provider.ProvideEmbeddings())
                        {
                            <MudSelectItem Value="@provider">@provider</MudSelectItem>
                        }
                    }
                </MudSelect>
                <MudButton Disabled="@(!this.DataLLMProvider.ShowRegisterButton())" Variant="Variant.Filled" Size="Size.Small" StartIcon="@Icons.Material.Filled.OpenInBrowser" Href="@this.DataLLMProvider.GetCreationURL()" Target="_blank">Create account</MudButton>
            </MudStack>
            
            @* ReSharper disable once CSharpWarnings::CS8974 *@
            <MudTextField
                T="string"
                @bind-Text="@this.dataAPIKey"
                Label="@this.APIKeyText"
                Disabled="@(!this.DataLLMProvider.IsAPIKeyNeeded(this.DataHost))"
                Class="mb-3"
                Adornment="Adornment.Start"
                AdornmentIcon="@Icons.Material.Filled.VpnKey"
                AdornmentColor="Color.Info"
                InputType="InputType.Password"
                Validation="@this.providerValidation.ValidatingAPIKey"
            />
            
            <MudTextField
                T="string"
                @bind-Text="@this.DataHostname"
                Label="Hostname"
                Disabled="@(!this.DataLLMProvider.IsHostnameNeeded())"
                Class="mb-3"
                Adornment="Adornment.Start"
                AdornmentIcon="@Icons.Material.Filled.Dns"
                AdornmentColor="Color.Info"
                Validation="@this.providerValidation.ValidatingHostname"
                UserAttributes="@SPELLCHECK_ATTRIBUTES"
            />

            <MudSelect Disabled="@(!this.DataLLMProvider.IsHostNeeded())" @bind-Value="@this.DataHost" Label="Host" Class="mb-3" OpenIcon="@Icons.Material.Filled.ExpandMore" AdornmentColor="Color.Info" Adornment="Adornment.Start" Validation="@this.providerValidation.ValidatingHost">
                @foreach (Host host in Enum.GetValues(typeof(Host)))
                {
                    if (host.AreEmbeddingsSupported())
                    {
                        <MudSelectItem Value="@host">@host.Name()</MudSelectItem>
                    }
                }
            </MudSelect>

            <MudStack Row="@true" AlignItems="AlignItems.Center">
                @if (this.DataLLMProvider.IsEmbeddingModelProvidedManually(this.DataHost))
                {
                    <MudTextField
                        T="string"
                        @bind-Text="@this.dataManuallyModel"
                        Label="Model"
                        Class="mb-3"
                        Adornment="Adornment.Start"
                        AdornmentIcon="@Icons.Material.Filled.Dns"
                        AdornmentColor="Color.Info"
                        Validation="@this.ValidateManuallyModel"
                        UserAttributes="@SPELLCHECK_ATTRIBUTES"
                        HelperText="Currently, we cannot query the embedding models of self-hosted systems. Therefore, enter the model name manually."
                    />
                }
                else
                {
                    <MudButton Disabled="@(!this.DataLLMProvider.CanLoadModels(this.DataHost, this.dataAPIKey))" Variant="Variant.Filled" Size="Size.Small" StartIcon="@Icons.Material.Filled.Refresh" OnClick="this.ReloadModels">Load</MudButton>
                    <MudSelect Disabled="@this.IsNoneProvider" @bind-Value="@this.DataModel" Label="Model" Class="mb-3" OpenIcon="@Icons.Material.Filled.FaceRetouchingNatural" AdornmentColor="Color.Info" Adornment="Adornment.Start" Validation="@this.providerValidation.ValidatingModel">
                        @foreach (var model in this.availableModels)
                        {
                            <MudSelectItem Value="@model">@model</MudSelectItem>
                        }
                    </MudSelect>
                }
            </MudStack>

            @* ReSharper disable once CSharpWarnings::CS8974 *@
            <MudTextField
                T="string"
                @bind-Text="@this.DataName"
                Label="Instance Name"
                Class="mb-3"
                MaxLength="40"
                Counter="40"
                Immediate="@true"
                Adornment="Adornment.Start"
                AdornmentIcon="@Icons.Material.Filled.Lightbulb"
                AdornmentColor="Color.Info"
                Validation="@this.providerValidation.ValidatingInstanceName"
                UserAttributes="@SPELLCHECK_ATTRIBUTES"
            />
            
        </MudForm>
        <Issues IssuesData="@this.dataIssues"/>
    </DialogContent>
    <DialogActions>
        <MudButton OnClick="@this.Cancel" Variant="Variant.Filled">Cancel</MudButton>
        <MudButton OnClick="@this.Store" Variant="Variant.Filled" Color="Color.Primary">
            @if(this.IsEditing)
            {
                @:Update
            }
            else
            {
                @:Add
            }
        </MudButton>
    </DialogActions>
</MudDialog>