using Content.Client.Eui;
using Content.Shared.Eui;
using Content.Shared.Ghost.Roles;
using JetBrains.Annotations;
using Robust.Client.Console;
using Robust.Client.Player;
using Robust.Shared.GameObjects;
using Robust.Shared.IoC;
using Robust.Shared.Utility;

namespace Content.Client.Ghost.Roles.UI
{
    [UsedImplicitly]
    public sealed class MakeGhostRoleEui : BaseEui
    {
        [Dependency] private readonly IPlayerManager _playerManager = default!;
        [Dependency] private readonly IClientConsoleHost _consoleHost = default!;

        private readonly MakeGhostRoleWindow _window;

        public MakeGhostRoleEui()
        {
            _window = new MakeGhostRoleWindow();

            _window.OnClose += OnClose;
            _window.OnMake += OnMake;
        }

        public override void HandleState(EuiStateBase state)
        {
            if (state is not MakeGhostRoleEuiState uiState)
            {
                return;
            }

            _window.SetEntity(uiState.EntityUid);
        }

        public override void Opened()
        {
            base.Opened();
            _window.OpenCentered();
        }

        private void OnMake(EntityUid uid, string name, string description, string rules, bool makeSentient)
        {
            var player = _playerManager.LocalPlayer;
            if (player == null)
            {
                return;
            }

            var makeGhostRoleCommand =
                $"makeghostrole " +
                $"\"{CommandParsing.Escape(uid.ToString())}\" " +
                $"\"{CommandParsing.Escape(name)}\" " +
                $"\"{CommandParsing.Escape(description)}\" " +
                $"\"{CommandParsing.Escape(rules)}\"";

            _consoleHost.ExecuteCommand(player.Session, makeGhostRoleCommand);

            if (makeSentient)
            {
                var makeSentientCommand = $"makesentient \"{CommandParsing.Escape(uid.ToString())}\"";
                _consoleHost.ExecuteCommand(player.Session, makeSentientCommand);
            }

            _window.Close();
        }

        private void OnClose()
        {
            base.Closed();
            SendMessage(new MakeGhostRoleWindowClosedMessage());
        }
    }
}
