@page "/account/manage"

@using Hcs.WebApp.Services
@using Microsoft.AspNetCore.Authorization

@attribute [Authorize]

@inject IdentityService IdentityService

<PageTitle>Профиль</PageTitle>

<RadzenTabs RenderMode="TabRenderMode.Server">
    <Tabs>
        <RadzenTabsItem Text="Пароль">
            <div style="max-width: 420px">
                <RadzenTemplateForm TItem="PasswordInputModel" Data=@PasswordInput Method="post" Submit="@ChangePasswordAsync">
                    <RadzenAlert AlertStyle="AlertStyle.Danger" Variant="Variant.Flat" Shade="Shade.Lighter" Visible="@hasError">
                        @errorMessage
                    </RadzenAlert>
                    <RadzenAlert AlertStyle="AlertStyle.Success" Variant="Variant.Flat" Shade="Shade.Lighter" Visible="@hasSuccess">
                        Пароль успешно изменен
                    </RadzenAlert>
                    <RadzenStack Gap="1rem" class="rz-p-sm-12">
                        <RadzenText TextStyle="TextStyle.H5">Смена пароля</RadzenText>
                        <RadzenFormField Text="Текущий пароль" Variant="Variant.Outlined">
                            <ChildContent>
                                <RadzenPassword Name="OldPassword" @bind-Value=@PasswordInput.OldPassword AutoCompleteType="AutoCompleteType.CurrentPassword" />
                            </ChildContent>
                            <Helper>
                                <RadzenRequiredValidator Component="OldPassword" Text="Поле 'Текущий пароль' обязательно к заполнению" />
                                <RadzenLengthValidator Component="OldPassword" Min="6" Text="Длина поля 'Текущий пароль' должна быть не меньше 6" />
                                <RadzenLengthValidator Component="OldPassword" Max="100" Text="Длина поля 'Текущий пароль' должна быть не больше 100" />
                            </Helper>
                        </RadzenFormField>
                        <RadzenFormField Text="Новый пароль" Variant="Variant.Outlined">
                            <ChildContent>
                                <RadzenPassword Name="NewPassword" @bind-Value=@PasswordInput.NewPassword AutoCompleteType="AutoCompleteType.NewPassword" />
                            </ChildContent>
                            <Helper>
                                <RadzenRequiredValidator Component="NewPassword" Text="Поле 'Новый пароль' обязательно к заполнению" />
                                <RadzenLengthValidator Component="NewPassword" Min="6" Text="Длина поля 'Новый пароль' должна быть не меньше 6" />
                                <RadzenLengthValidator Component="NewPassword" Max="100" Text="Длина поля 'Новый пароль' должна быть не больше 100" />
                            </Helper>
                        </RadzenFormField>
                        <RadzenFormField Text="Повторите новый пароль" Variant="Variant.Outlined">
                            <ChildContent>
                                <RadzenPassword Name="ConfirmNewPassword" @bind-Value=@PasswordInput.ConfirmNewPassword AutoCompleteType="AutoCompleteType.NewPassword" />
                            </ChildContent>
                            <Helper>
                                <RadzenRequiredValidator Component="ConfirmNewPassword" Text="Поле 'Повторите новый пароль' обязательно к заполнению" />
                                <RadzenCompareValidator Value=@PasswordInput.NewPassword Component="ConfirmNewPassword" Text="Пароли должны совпадать" />
                            </Helper>
                        </RadzenFormField>
                        <RadzenButton ButtonType="ButtonType.Submit" Text="Сменить пароль"></RadzenButton>
                    </RadzenStack>
                </RadzenTemplateForm>
            </div>
        </RadzenTabsItem>
    </Tabs>
</RadzenTabs>
<BusyOverlay @ref=@busyOverlay />

@code {
    sealed class PasswordInputModel
    {
        public string OldPassword { get; set; } = "";

        public string NewPassword { get; set; } = "";

        public string ConfirmNewPassword { get; set; } = "";
    }

    bool hasError;
    string? errorMessage;
    bool hasSuccess;
    BusyOverlay busyOverlay;

    [SupplyParameterFromForm]
    PasswordInputModel PasswordInput { get; set; } = new();

    async Task ChangePasswordAsync()
    {
        hasError = false;
        hasSuccess = false;

        try
        {
            busyOverlay.Show();

            await IdentityService.ChangePasswordAsync(PasswordInput.OldPassword, PasswordInput.NewPassword);

            hasSuccess = true;
        }
        catch (Exception e)
        {
            hasError = true;
            errorMessage = e.Message;
        }
        finally
        {
            busyOverlay.Hide();
        }
    }
}
