@using AIStudio.Provider
@using AIStudio.Provider.SelfHosted
@inherits MSGComponentBase

<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="@T("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.ProvideTranscriptionAPI() || provider is LLMProviders.NONE)
                        {
                            <MudSelectItem Value="@provider">
                                @provider.ToName()
                            </MudSelectItem>
                        }
                    }
                </MudSelect>
                <MudButton Disabled="@(!this.DataLLMProvider.ShowRegisterButton())" Variant="Variant.Filled" Size="Size.Small" StartIcon="@Icons.Material.Filled.OpenInBrowser" Href="@this.DataLLMProvider.GetCreationURL()" Target="_blank">
                    @T("Create account")
                </MudButton>
            </MudStack>
            
            @if (this.DataLLMProvider.IsAPIKeyNeeded(this.DataHost))
            {
                <SecretInputField Secret="@this.dataAPIKey" SecretChanged="@this.OnAPIKeyChanged" Label="@this.APIKeyText" Validation="@this.providerValidation.ValidatingAPIKey"/>
            }

            @if (this.DataLLMProvider.IsHostnameNeeded())
            {
                <MudTextField
                    T="string"
                    @bind-Text="@this.DataHostname"
                    Label="@T("Hostname")"
                    Class="mb-3"
                    Adornment="Adornment.Start"
                    AdornmentIcon="@Icons.Material.Filled.Dns"
                    AdornmentColor="Color.Info"
                    Validation="@this.providerValidation.ValidatingHostname"
                    UserAttributes="@SPELLCHECK_ATTRIBUTES"/>
            }

            @if (this.DataLLMProvider.IsHostNeeded())
            {
                <MudSelect T="Host" Value="@this.DataHost" ValueChanged="@this.OnHostChanged" Label="@T("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.IsTranscriptionSupported())
                        {
                            <MudSelectItem Value="@host">
                                @host.Name()
                            </MudSelectItem>
                        }
                    }
                </MudSelect>
            }

            @if (!this.DataLLMProvider.IsTranscriptionModelSelectionHidden(this.DataHost))
            {
                <MudField FullWidth="true" Label="@T("Model selection")" Variant="Variant.Outlined" Class="mb-3">
                    <MudStack Row="@true" AlignItems="AlignItems.Center" StretchItems="StretchItems.End">
                        @if (this.DataLLMProvider.IsTranscriptionModelProvidedManually(this.DataHost))
                        {
                            <MudTextField
                                T="string"
                                @bind-Text="@this.dataManuallyModel"
                                Label="@T("Model")"
                                Class="mb-3"
                                Adornment="Adornment.Start"
                                AdornmentIcon="@Icons.Material.Filled.Dns"
                                AdornmentColor="Color.Info"
                                Validation="@this.ValidateManuallyModel"
                                UserAttributes="@SPELLCHECK_ATTRIBUTES"
                                HelperText="@T("Currently, we cannot query the transcription models for the selected provider and/or host. Therefore, please 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">
                                @T("Load")
                            </MudButton>
                            @if(this.availableModels.Count is 0)
                            {
                                <MudText Typo="Typo.body1">
                                    @T("No models loaded or available.")
                                </MudText>
                            }
                            else
                            {
                                <MudSelect Disabled="@this.IsNoneProvider" @bind-Value="@this.DataModel" Label="@T("Model")"
                                           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>
                    @if (!string.IsNullOrWhiteSpace(this.dataLoadingModelsIssue))
                    {
                        <MudAlert Severity="Severity.Error" Class="mt-3">
                            @this.dataLoadingModelsIssue
                        </MudAlert>
                    }
                </MudField>
            }
            else
            {
                <MudField FullWidth="true" Label="@T("Model selection")" Variant="Variant.Outlined" Class="mb-3">
                    <MudText Typo="Typo.body1">
                        @T("This host uses the model configured at the provider level. No model selection is available.")
                    </MudText>
                </MudField>
            }

            @* ReSharper disable once CSharpWarnings::CS8974 *@
            <MudTextField
                T="string"
                @bind-Text="@this.DataName"
                Label="@T("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">
            @T("Cancel")
        </MudButton>
        <MudButton OnClick="@this.Store" Variant="Variant.Filled" Color="Color.Primary">
            @if(this.IsEditing)
            {
                @T("Update")
            }
            else
            {
                @T("Add")
            }
        </MudButton>
    </DialogActions>
</MudDialog>