@page "/sysSetting/user"
@using log4net;
@code {
    @inject IUserDao userDao;
    @inject IRoleDao roleDao;
    @inject DialogService dialogService;
    @inject NotificationService _message
    RadzenDataGrid grid;
    bool isLoading;
    int count;
    private IEnumerable? userList;
    string nickname;
    DateTime OrderDate;
    private readonly ILog logger = LogManager.GetLogger(typeof(Pages.User));
    List roles;
    List usersToInsert = new List();
    List usersToUpdate = new List();
    protected override async Task OnInitializedAsync()
    {
        await base.OnInitializedAsync();
        roles = await roleDao.GetAllRoles();
    }
    void Reset()
    {
        usersToInsert.Clear();
        usersToUpdate.Clear();
    }
    async Task Reg2ZWJ(Pojo.User user)
    {
        await dialogService.OpenAsync(
                $"录入指纹",
              new Dictionary() { { "userId", user.Id } },
              new DialogOptions() { Width = "55vw", Resizable = true, Draggable = true, ShowClose = false }
        );
    }
    async Task Signatrue(Pojo.User user)
    {
        var flag = await dialogService.OpenAsync(
                $"签名-{user.NickName}",
              new Dictionary() { { "user", user } },
              new DialogOptions() { Width = "55vw", Resizable = true, Draggable = true, ShowClose = true }
        );
        if(flag != null && flag)
        {
            await reloadGrid();
        }
    }
    void Reset(Pojo.User user)
    {
        usersToInsert.Remove(user);
        usersToUpdate.Remove(user);
    }
    void OnCurrentDateChanged(DateTime args)
    {
        OrderDate = new DateTime(args.Year, args.Month, args.Day);
    }
    async Task LoadData(LoadDataArgs args)
    {
        isLoading = true;
        var result = await userDao.GetAllByNickname(nickname, args.Top, args.Skip);
        // Update the Data property
        userList = result.Desserts;
        // Update the count
        count = result.TotalDesserts;
        isLoading = false;
    }
    async Task reloadGrid()
    {
        nickname = "";
        await grid.Reload();
    }
    async Task EditRow(Pojo.User user)
    {
        Reset();
        usersToUpdate.Add(user);
        await grid.EditRow(user);
    }
    void OnUpdateRow(Pojo.User user)
    {
        Reset(user);
        // 数据库更新
        userDao.UpdateUser(user);
        if(user.role.Id != user.RoleId)
        {
            grid.Reload();
        }
    }
    async Task SaveRow(Pojo.User user)
    {
        await grid.UpdateRow(user);
    }
    void CancelEdit(Pojo.User user)
    {
        Reset(user);
        grid.CancelEditRow(user);
        grid.Reload();
    }
    async Task DeleteRow(Pojo.User user)
    {
        Reset(user);
        if (userList.Contains(user))
        {
            //弹出确认提示框
            var b = await dialogService.OpenAsync(
               $"删除确认",
             new Dictionary() { { "confirmInfo", "确认要删除用户:"+user.Username+"吗?" } },
             new DialogOptions() { Width = "45vw", Resizable = true, Draggable = true, ShowClose = false });
            if (b)
            {
                // 数据库删除
                userDao.DeleteeUser(user.Id);
            }
            await grid.Reload();
        }
        else
        {
            grid.CancelEditRow(user);
            await grid.Reload();
        }
    }
    //重置密码
    async Task ResetPasswordRow(Pojo.User user)
    {
        Reset(user);
        if (userList.Contains(user))
        {
            //弹出确认提示框
            var b = await dialogService.OpenAsync(
               $"密码重置确认",
             new Dictionary() { { "confirmInfo", "确认要重置用户:" + user.Username+" 的密码吗?" } },
             new DialogOptions() { Width = "45vw", Resizable = true, Draggable = true, ShowClose = false });
            if (b)
            {
                // 数据库重置密码
                userDao.ResetPassword(user.Id);
                //提示密码已重置,下次登录请使用重置后的密码
                _message.Notify(new NotificationMessage { Severity = NotificationSeverity.Success, Summary = "提示", Detail = $"密码已重置,下次登录请使用重置后的密码", Duration = 4000 });
            }
            await grid.Reload();
        }
        else
        {
            grid.CancelEditRow(user);
            await grid.Reload();
        }
    }
    async Task InsertRow()
    {
        
        Reset();
        var user = new Pojo.User()
        {
            RoleId = roles[0].Id,
        };
        usersToInsert.Add(user);
        await grid.InsertRow(user);
    }
    void OnCreateRow(Pojo.User user)
    {
        // 数据库添加用户
        userDao.InsertUser(user);
        usersToInsert.Remove(user);
        grid.Reload();
    }
}