@namespace Oqtane.Modules.Admin.Roles
@inherits ModuleBase
@inject IRoleService RoleService
@inject IUserRoleService UserRoleService
@inject IStringLocalizer<Users> Localizer

@if (userroles == null)
{
    <p><em>@Localizer["Loading..."]</em></p>
}
else
{
    <table class="table table-borderless">
        <tr>
            <td>
                <Label For="role" HelpText="The role you are assigning users to" ResourceKey="Role">Role: </Label>
            </td>
            <td>
                <input id="role" class="form-control" @bind="@name" disabled />
            </td>
        </tr>
        <tr>
            <td>
                <Label For="user" HelpText="Select a user" ResourceKey="User">User: </Label>
            </td>
            <td>
                <select id="user" class="form-control" @bind="@userid">
                    <option value="-1">&lt;@Localizer["Select User"]&gt;</option>
                    @foreach (UserRole userrole in users)
                    {
                        <option value="@(userrole.UserId)">@userrole.User.DisplayName</option>
                    }
                </select>
            </td>
        </tr>
        <tr>
            <td>
                <Label For="effectiveDate" HelpText="The date that this role assignment is active" ResourceKey="EffectiveDate">Effective Date: </Label>
            </td>
            <td>
                <input type="date" id="effectiveDate" class="form-control" @bind="@effectivedate" />
            </td>
        </tr>
        <tr>
            <td>
                <Label For="expiryDate" HelpText="The date that this role assignment expires" ResourceKey="ExpiryDate">Expiry Date: </Label>
            </td>
            <td>
                <input type="date" id="expiryDate" class="form-control" @bind="@expirydate" />
            </td>
        </tr>
    </table>
    <button type="button" class="btn btn-success" @onclick="SaveUserRole">@Localizer["Save"]</button>
    <NavLink class="btn btn-secondary" href="@NavigateUrl()">@Localizer["Cancel"]</NavLink>

    <hr class="app-rule" />
    <p align="center">
        <Pager Items="@userroles">
            <Header>
                <th>@Localizer["Users"]</th>
                <th>@Localizer["Effective"]</th>
                <th>@Localizer["Expiry"]</th>
                <th>&nbsp;</th>
            </Header>
            <Row>
                <td>@context.User.DisplayName</td>
                <td>@context.EffectiveDate</td>
                <td>@context.ExpiryDate</td>
                <td>
                    <ActionDialog Header="Remove User" Message="@Localizer["Are You Sure You Wish To Remove {0} From This Role?", context.User.DisplayName]" Action="Delete" Security="SecurityAccessLevel.Admin" Class="btn btn-danger" OnClick="@(async () => await DeleteUserRole(context.UserRoleId))" Disabled="@(context.Role.IsAutoAssigned)" ResourceKey="DeleteUserRole" />
                </td>
            </Row>
        </Pager>
    </p>
}

@code {
    private int roleid;
    private string name = string.Empty;
    private List<UserRole> users;
    private int userid = -1;
    private DateTime? effectivedate = null;
    private DateTime? expirydate = null;
    private List<UserRole> userroles;

    public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Admin;

    protected override async Task OnInitializedAsync()
    {
        try
        {
            roleid = Int32.Parse(PageState.QueryString["id"]);
            Role role = await RoleService.GetRoleAsync(roleid);
            name = role.Name;
            users = await UserRoleService.GetUserRolesAsync(PageState.Site.SiteId);
            users = users
                .Where(u => u.Role.Name == RoleNames.Registered)
                .OrderBy(u => u.User.DisplayName)
                .ToList();
            await GetUserRoles();
        }
        catch (Exception ex)
        {
            await logger.LogError(ex, "Error Loading Users {Error}", ex.Message);
            AddModuleMessage(Localizer["Error Loading Users"], MessageType.Error);
        }
    }

    private async Task GetUserRoles()
    {
        try
        {
            userroles = await UserRoleService.GetUserRolesAsync(PageState.Site.SiteId);
            userroles = userroles.Where(item => item.RoleId == roleid).ToList();
        }
        catch (Exception ex)
        {
            await logger.LogError(ex, "Error Loading User Roles {RoleId} {Error}", roleid, ex.Message);
            AddModuleMessage(Localizer["Error Loading User Roles"], MessageType.Error);
        }
    }

    private async Task SaveUserRole()
    {
        try
        {
            if (userid != -1)
            {
                var userrole = userroles.Where(item => item.UserId == userid && item.RoleId == roleid).FirstOrDefault();
                if (userrole != null)
                {
                    userrole.EffectiveDate = effectivedate;
                    userrole.ExpiryDate = expirydate;
                    await UserRoleService.UpdateUserRoleAsync(userrole);
                }
                else
                {
                    userrole = new UserRole();
                    userrole.UserId = userid;
                    userrole.RoleId = roleid;
                    userrole.EffectiveDate = effectivedate;
                    userrole.ExpiryDate = expirydate;

                    await UserRoleService.AddUserRoleAsync(userrole);
                }

                await logger.LogInformation("User Assigned To Role {UserRole}", userrole);
                AddModuleMessage(Localizer["User Assigned To Role"], MessageType.Success);
                await GetUserRoles();
                StateHasChanged();
            }
            else
            {
                AddModuleMessage(Localizer["You Must Select A User"], MessageType.Warning);
            }
        }
        catch (Exception ex)
        {
            await logger.LogError(ex, "Error Saving User Roles {RoleId} {Error}", roleid, ex.Message);
            AddModuleMessage(Localizer["Error Saving User Roles"], MessageType.Error);
        }
    }

    private async Task DeleteUserRole(int UserRoleId)
    {
        try
        {
            await UserRoleService.DeleteUserRoleAsync(UserRoleId);
            await logger.LogInformation("User Removed From Role {UserRoleId}", UserRoleId);
            AddModuleMessage(Localizer["User Removed From Role"], MessageType.Success);
            await GetUserRoles();
            StateHasChanged();
        }
        catch (Exception ex)
        {
            await logger.LogError(ex, "Error Removing User From Role {UserRoleId} {Error}", UserRoleId, ex.Message);
            AddModuleMessage(Localizer["Error Removing User From Role"], MessageType.Error);
        }
    }
}
