@namespace Oqtane.Modules.Admin.Users
@inherits ModuleBase
@inject NavigationManager NavigationManager
@inject IUserService UserService
@inject IProfileService ProfileService
@inject ISettingService SettingService

<TabStrip>
    <TabPanel Name="Identity">
        @if (profiles != null)
        {
            <table class="table table-borderless">
                <tr>
                    <td>
                        <label class="control-label">Username: </label>
                    </td>
                    <td>
                        <input class="form-control" @bind="@username" />
                    </td>
                </tr>
                <tr>
                    <td>
                        <label class="control-label">Password: </label>
                    </td>
                    <td>
                        <input type="password" class="form-control" @bind="@password" />
                    </td>
                </tr>
                <tr>
                    <td>
                        <label class="control-label">Confirm Password: </label>
                    </td>
                    <td>
                        <input type="password" class="form-control" @bind="@confirm" />
                    </td>
                </tr>
                <tr>
                    <td>
                        <label class="control-label">Email: </label>
                    </td>
                    <td>
                        <input class="form-control" @bind="@email" />
                    </td>
                </tr>
                <tr>
                    <td>
                        <label class="control-label">Full Name: </label>
                    </td>
                    <td>
                        <input class="form-control" @bind="@displayname" />
                    </td>
                </tr>
            </table>
        }
    </TabPanel>
    <TabPanel Name="Profile">
        @if (profiles != null)
        {
        <table class="table table-borderless">
            @foreach (Profile profile in profiles)
            {
                var p = profile;
                if (p.Category != category)
                {
                    <tr>
                        <th colspan="2" style="text-align: center;">
                            @p.Category
                        </th>
                    </tr>
                    category = p.Category;
                }
                <tr>
                    <td>
                        <label for="@p.Name" class="control-label">@p.Title: </label>
                    </td>
                    <td>
                        <input class="form-control" maxlength="@p.MaxLength" placeholder="@p.Description" @onchange="@(e => ProfileChanged(e, p.Name))" />
                    </td>
                </tr>
            }
        </table>
        }
    </TabPanel>
</TabStrip>

<button type="button" class="btn btn-primary" @onclick="SaveUser">Save</button>
<NavLink class="btn btn-secondary" href="@NavigateUrl()">Cancel</NavLink>

@code {
    private string username = string.Empty;
    private string password = string.Empty;
    private string confirm = string.Empty;
    private string email = string.Empty;
    private string displayname = string.Empty;
    private List<Profile> profiles;
    private Dictionary<string, string> settings;
    private string category = string.Empty;

    public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Admin;

    protected override async Task OnInitializedAsync()
    {
        try
        {
            profiles = await ProfileService.GetProfilesAsync(ModuleState.SiteId);
            settings = new Dictionary<string, string>();
        }
        catch (Exception ex)
        {
            await logger.LogError(ex, "Error Loading User Profile {Error}", ex.Message);
            AddModuleMessage("Error Loading User Profile", MessageType.Error);
        }
    }

    private async Task SaveUser()
    {
        try
        {
            if (username != string.Empty && password != string.Empty && confirm != string.Empty && email != string.Empty)
            {
                if (password == confirm)
                {
                    var user = new User();
                    user.SiteId = PageState.Site.SiteId;
                    user.Username = username;
                    user.Password = password;
                    user.Email = email;
                    user.DisplayName = string.IsNullOrWhiteSpace(displayname) ? username : displayname;
                    user.PhotoFileId = null;

                    user = await UserService.AddUserAsync(user);

                    if (user != null)
                    {
                        await SettingService.UpdateUserSettingsAsync(settings, user.UserId);
                        await logger.LogInformation("User Created {User}", user);
                        NavigationManager.NavigateTo(NavigateUrl());
                    }
                    else
                    {
                        await logger.LogError("Error Adding User {Username} {Email}", username, email);
                        AddModuleMessage("Error Adding User. Please Ensure Password Meets Complexity Requirements And Username Is Not Already In Use.", MessageType.Error);
                    }
                }
                else
                {
                    AddModuleMessage("Passwords Entered Do Not Match", MessageType.Warning);
                }
            }
            else
            {
                AddModuleMessage("You Must Provide A Username, Password, and Email Address", MessageType.Warning);
            }
        }
        catch (Exception ex)
        {
            await logger.LogError(ex, "Error Adding User {Username} {Email} {Error}", username, email, ex.Message);
            AddModuleMessage("Error Adding User", MessageType.Error);
        }
    }

    private void ProfileChanged(ChangeEventArgs e, string SettingName)
    {
        var value = (string)e.Value;
        settings = SettingService.SetSetting(settings, SettingName, value);
    }

}
