using Blazorise;
using Blazorise.DataGrid;
using FoodsharingSiegen.Contracts.Entity;
using FoodsharingSiegen.Contracts.Helper;
using FoodsharingSiegen.Server.Data.Service;
using FoodsharingSiegen.Server.Dialogs;
using Microsoft.AspNetCore.Components;

namespace FoodsharingSiegen.Server.Pages
{
    /// <summary>
    ///     The users class (a. beging, 01.04.2022)
    /// </summary>
    public partial class Users
    {
        #region Dependencies

        ////////////////////////////////////////////////////////////////////////////////////////////////////
        /// <summary>   Gets or sets the user service. </summary>
        /// <value> The user service. </value>
        ////////////////////////////////////////////////////////////////////////////////////////////////////
        [Inject]
        public UserService UserService { get; set; } = null!;

        #endregion

        #region Private Properties

        /// <summary>
        ///     Gets or sets the value of the password modal (ab)
        /// </summary>
        private SetPasswordModal? PasswordModal { get; set; }

        /// <summary>
        ///     Gets or sets the value of the selected company texts (ab)
        /// </summary>
        private List<string> SelectedCompanyTexts { get; set; } = new();

        /// <summary>
        ///     Gets or sets the value of the selected user (ab)
        /// </summary>
        private User? SelectedUser { get; set; }

        /// <summary>
        ///     Gets or sets the value of the user data grid (ab)
        /// </summary>
        private DataGrid<User>? UserDataGrid { get; set; }

        /// <summary>
        ///     Gets the value of the user groups (ab)
        /// </summary>
        private IEnumerable<UserGroup> UserGroups => Enum.GetValues<UserGroup>();

        /// <summary>
        ///     Gets or sets the value of the user list (ab)
        /// </summary>
        private List<User>? UserList { get; set; }

        #endregion

        #region Override InitializeDataAsync

        /// <inheritdoc />
        protected override async Task InitializeDataAsync()
        {
            await LoadUsers();
        }

        #endregion

        #region Private Method LoadUsers

        /// <summary>
        ///     Loads the users (a. beging, 01.04.2022)
        /// </summary>
        private async Task LoadUsers()
        {
            var usersR = await UserService.GetUsersAsync();
            if (usersR.Success) UserList = usersR.Data;

            await InvokeAsync(StateHasChanged);
        }

        #endregion

        #region Private Method OnPasswordSet

        /// <summary>
        ///     Ons the password set using the specified user (a. beging, 23.05.2022)
        /// </summary>
        /// <param name="user">The user</param>
        private async Task OnPasswordSet(User user)
        {
            var setPasswordR = await UserService.SetPassword(user);
            if (setPasswordR.Success)
                await Notification.Success("Passwort gespeichert");
        }

        #endregion

        #region Private Method RowInserted

        /// <summary>
        ///     Rows the inserted using the specified arg (a. beging, 01.04.2022)
        /// </summary>
        /// <param name="arg">The arg</param>
        private async Task RowInserted(SavedRowItem<User, Dictionary<string, object>> arg)
        {
            var addUserR = await UserService.AddUserAsync(arg.Item);
            if (!addUserR.Success)
                await Notification.Error($"Fehler beim Anlegen: {addUserR.ErrorMessage}")!;
            else
                await LoadUsers();
        }

        #endregion

        #region Private Method RowRemoved

        /// <summary>
        ///     Rows the removed using the specified arg (a. beging, 08.02.2023)
        /// </summary>
        /// <param name="arg">The arg</param>
        private async Task RowRemoved(User arg)
        {
            var removeR = await UserService.RemoveAsync(arg.Id);
            if (!removeR.Success)
                await Notification.Error($"Löschen: {removeR.ErrorMessage}")!;
            else
                await LoadUsers();
        }

        #endregion

        #region Private Method RowRemoving

        /// <summary>
        ///     Rows the removing using the specified arg (a. beging, 08.02.2023)
        /// </summary>
        /// <param name="arg">The arg</param>
        private async Task RowRemoving(CancellableRowChange<User> arg)
        {
            if (arg.Item.IsAdmin())
            {
                await Notification.Error("Admins können nicht gelöscht werden!");
                arg.Cancel = true;
                return;
            }

            var confirm = await Message.Confirm($"User {arg.Item.Mail} löschen?", "Bestätigen", o =>
            {
                o.ConfirmButtonText = "Löschen";
                o.CancelButtonText = "Abbrechen";
                o.ShowMessageIcon = false;
                o.ConfirmButtonColor = Color.Danger;
            });

            arg.Cancel = !confirm;
        }

        #endregion

        #region Private Method RowUpdated

        /// <summary>
        ///     Rows the updated using the specified arg (a. beging, 01.04.2022)
        /// </summary>
        /// <param name="arg">The arg</param>
        private async Task RowUpdated(SavedRowItem<User, Dictionary<string, object>> arg)
        {
            if (arg.Item?.Id == null || arg.Item.Id.Equals(Guid.Empty) || arg.Values?.Any() != true) return;

            var updateR = await UserService.Update(arg.Item);
            if (!updateR.Success)
                await Notification.Error($"Fehler beim Speichern: {updateR.ErrorMessage}")!;
        }

        #endregion
    }
}