using System.Collections.Generic;
using Oxide.Core.Plugins;
using Oxide.Game.Rust.Cui;
using Oxide.Game.Rust.Libraries;
using UnityEngine;

namespace Oxide.Plugins
{
    [Info("InfoPanel", "abdyrval", "0.0.1")]
    public class InfoPanel : RustPlugin
    {
        #region Variables

        [PluginReference] private Plugin ImageLibrary;
        private Dictionary<ulong, bool> playerModes = new Dictionary<ulong, bool>();
        private List<string> messageList = new List<string>
        {
            "ГРУППА СЕРВЕРА <color=#66adff>VK.COM/RUST</color>",
            "НАШ САЙТ <color=orange>TEST.RU</color>",
            "ОБРАЩАЙТЕСЬ ЗА ПОМОЩЬЮ <color=red>VK.COM/RUST</color>"
        };

        private string HeliIcon = "https://i.imgur.com/m6DgtBf.png";
        private string BradleyIcon = "https://i.imgur.com/qlqH5gt.png";
        private string ChinIcon = "https://i.imgur.com/xIidCPG.png";
        private string AirIcon = "https://i.imgur.com/40DM4mw.png";
        private string CargoIcon = "https://i.imgur.com/2WC5Xwe.png";
        
        private string Layer = "UI_InterfaceInfo";
        private BaseEntity heli = null;
        private BaseEntity bradley = null;
        private BaseEntity air = null;
        private BaseEntity chin = null;
        private BaseEntity cargo = null;
        
        #endregion

        #region Initialization

        private void OnServerInitialized()
        {
            foreach (BasePlayer player in BasePlayer.activePlayerList) OnPlayerConnected(player);

            ImageLibrary.Call("AddImage", HeliIcon, "HeliIcon");
            ImageLibrary.Call("AddImage", BradleyIcon, "BradleyIcon");
            ImageLibrary.Call("AddImage", ChinIcon, "ChinIcon");
            ImageLibrary.Call("AddImage", AirIcon, "AirIcon");
            ImageLibrary.Call("AddImage", CargoIcon, "CargoIcon");
                timer.Every(5, () => {
                    foreach (var p in BasePlayer.activePlayerList) 
                    {
                        UpdateClock(p);
                        UpdateMessages(p);
                    } 
                });
        }


        private void Unload()
        {
            foreach (var p in BasePlayer.activePlayerList)
            {
                CuiHelper.DestroyUi(p, Layer);
            }
        }
        #endregion

        #region Commands

        [ConsoleCommand("UI_InfoHide")]
        private void cmdConsoleHandler(ConsoleSystem.Arg args)
        {
            if (args.Player() != null && playerModes.ContainsKey(args.Player().userID))
            {
                if (playerModes[args.Player().userID])
                    playerModes[args.Player().userID] = false;
                else
                    playerModes[args.Player().userID] = true;
                
                DrawInfo(args.Player(), playerModes[args.Player().userID]);
            }
        }

        #endregion

        #region Hooks

        private void OnPlayerConnected(BasePlayer player)
        {

            if (!playerModes.ContainsKey(player.userID))
                playerModes.Add(player.userID, true);
            
            DrawInfo(player, playerModes[player.userID]);
            foreach (var p in BasePlayer.activePlayerList) UpdateOnline(p);
        }
		
		private void OnPlayerDisconnected(BasePlayer player, string reason)
		{
			NextTick(() => {				
				foreach (var p in BasePlayer.activePlayerList) UpdateOnline(p);
			});
		}

        private void OnEntitySpawned(BaseNetworkable entity)
        {
            if (entity is BaseHelicopter)
            {
                heli = entity as BaseEntity;
                foreach (var p in BasePlayer.activePlayerList) UpdateHeli(p, true);
                return;
            }
            if (entity is BradleyAPC)
            {
                bradley = entity as BaseEntity;
                foreach (var p in BasePlayer.activePlayerList) UpdateBradley(p, true);
                return;
            }
            if (entity is CH47Helicopter)
            {
                chin = entity as BaseEntity;
                foreach (var p in BasePlayer.activePlayerList) UpdateChinook(p, true);
                return;
            }
            if (entity is CargoPlane)
            {
                air = entity as BaseEntity;
                foreach (var p in BasePlayer.activePlayerList) UpdateAir(p, true);
                return;
            }
            if (entity is CargoShip)
            {
                cargo = entity as BaseEntity;
                foreach (var p in BasePlayer.activePlayerList) UpdateCargoShip(p, true);
                return;
            }
        }
        
        private void OnPlayerSleepEnded(BasePlayer player)
        {
            if (player.IsReceivingSnapshot)
            {
                NextTick(() =>
                {
                    OnPlayerConnected(player);
                    return;
                });
                return;
            }
            if (!playerModes.ContainsKey(player.userID))
                playerModes.Add(player.userID, true);
            
            DrawInfo(player, playerModes[player.userID]);
        }

		
		private void OnPlayerDeath(BasePlayer player, HitInfo info)
		{
			CuiHelper.DestroyUi(player, Layer);
			return;
		}
		
        private void OnEntityKill(BaseNetworkable entity)
        {
            if (entity is BaseHelicopter)
            {
                heli = null;
                foreach (var p in BasePlayer.activePlayerList) UpdateHeli(p, false);
                return;
            }
            if (entity is BradleyAPC)
            {
                bradley = entity as BaseEntity;
                foreach (var p in BasePlayer.activePlayerList) UpdateBradley(p, false);
                return;
            }
            if (entity is CH47Helicopter)
            {
                chin = null;
                foreach (var p in BasePlayer.activePlayerList) UpdateChinook(p, false);
                return;
            }
            if (entity is CargoPlane)
            {
                air = null;
                foreach (var p in BasePlayer.activePlayerList) UpdateAir(p, false);
                return;
            }
            if (entity is CargoShip)
            {
                cargo = null;
                foreach (var p in BasePlayer.activePlayerList) UpdateCargoShip(p, false);
                return;
            }
        }

        #endregion

        #region GUI
        private void DrawInfo(BasePlayer player, bool Message)
        {
            CuiHelper.DestroyUi(player, Layer);
            CuiElementContainer container = new CuiElementContainer();

            string y = playerModes[player.userID] ? "0.65" : "-0.137";

            container.Add(new CuiPanel
            {
                CursorEnabled = false,
                RectTransform = { AnchorMin = $"{y} 0.0250001", AnchorMax = $"{y} 0.0250001", OffsetMax = "268 59.3" },
                Image = { Color = "0 0 0 0" }
            }, "Overlay", Layer);
            
            //---------
            container.Add(new CuiElement
            {
                Name = Layer + ".CargoShipHandler",
                Parent = Layer,
                Components =
                {
                    new CuiImageComponent { Color = "1 1 1 0.1" },
                    new CuiRectTransformComponent { AnchorMin = "0.31 0.56",AnchorMax = "0.41 0.97", OffsetMax = "0 0"}
                }
            });
            //---------
            container.Add(new CuiElement
            {
                Name = Layer + ".BradleyHandler",
                Parent = Layer,
                Components =
                {
                    new CuiImageComponent { Color = "1 1 1 0.1" },
                    new CuiRectTransformComponent { AnchorMin = "0.54 0.1",AnchorMax = "0.64 0.5", OffsetMax = "0 0"}
                }
            });
            //---------
            container.Add(new CuiElement
            {
                Name = Layer + ".HeliHandler",
                Parent = Layer,
                Components =
                {
                    new CuiImageComponent { Color = "1 1 1 0.1" },
                    new CuiRectTransformComponent { AnchorMin = "0.42 0.56",AnchorMax = "0.53 0.97", OffsetMax = "0 0"}
                }
            });
            //---------
            container.Add(new CuiElement
            {
                Name = Layer + ".ChinookHandler",
                Parent = Layer,
                Components =
                {
                    new CuiImageComponent { Color = "1 1 1 0.1" },
                    new CuiRectTransformComponent { AnchorMin = "0.65 0.58",AnchorMax = "0.75 0.97", OffsetMax = "0 0"}
                }
            });
            //---------
            container.Add(new CuiElement
            {
                Name = Layer + ".AirHandler",
                Parent = Layer,
                Components =
                {
                    new CuiImageComponent { Color = "1 1 1 0.1" },
                    new CuiRectTransformComponent { AnchorMin = "0.54 0.56",AnchorMax = "0.64 0.97", OffsetMax = "0 0"}
                }
            });
            //---------
            

            CuiHelper.AddUi(player, container);
            
            UpdateClock(player);
            UpdateOnline(player);
            UpdateHeli(player, (heli != null));
            UpdateBradley(player, (bradley != null));
            UpdateChinook(player, (chin != null));
            UpdateCargoShip(player, (cargo != null));
            UpdateAir(player, (air != null));

            if (playerModes[player.userID])
            {
                UpdateMessages(player);
            }
            
            container.Clear();
            
            container.Add(new CuiElement
            {
                Name = Layer + ".ButtonHandler",
                Parent = Layer,
                Components =
                {
                    new CuiImageComponent { Color = "1 1 1 0.1" },
                    new CuiRectTransformComponent { AnchorMin = "0.65 0.1",AnchorMax = "0.75 0.5", OffsetMax = "0 0"}
                }
            });
            container.Add(new CuiButton
            {
                RectTransform = { AnchorMin = "-0.1 -0.1",AnchorMax = "1.1 1.1", OffsetMax = "0 0"},
                Button = { Close = Layer, Command = "UI_InfoHide", Color = "0 0 0 0" },
                Text = { Text = playerModes[player.userID] ? "←" : "→", Color = "0.89 0.89 0.89 1", Align = TextAnchor.MiddleCenter, FontSize = 20 }
            }, Layer + ".ButtonHandler");

            
            CuiHelper.AddUi(player, container);
        }

        private void UpdateClock(BasePlayer player)
        {
            CuiHelper.DestroyUi(player, Layer + "ClockText");
            CuiElementContainer container = new CuiElementContainer();

                container.Add(new CuiElement
                {
                    Name = Layer + ".ClockHandler",
                    Parent = Layer,
                    Components =
                    {
                        new CuiImageComponent { Color = "1 1 1 0" },
                        new CuiRectTransformComponent { AnchorMin = "0.11 0.56", AnchorMax = "0.30 0.97", OffsetMax = "0 0" }
                    }
                });

            container.Add(new CuiElement
            {
                FadeOut = 0.5f,
                Parent = Layer + ".ClockHandler",
                Name = Layer + "ClockText",
                Components =
                {
                    new CuiTextComponent { FadeIn = 0.5f, Text = TOD_Sky.Instance.Cycle.DateTime.ToShortTimeString(), Color = "1 1 1 0.5", FontSize = 16, Font = "robotocondensed-bold.ttf", Align = TextAnchor.MiddleCenter },
                    new CuiRectTransformComponent { AnchorMin = "0.1 0", AnchorMax = "0.93 1", OffsetMax = "0 0" }
                }
            });

            CuiHelper.AddUi(player, container);
        }

        private void UpdateOnline(BasePlayer player)
        {
            CuiHelper.DestroyUi(player, Layer + "OnlineText");
            CuiElementContainer container = new CuiElementContainer();

                container.Add(new CuiElement
                {
                    Name = Layer + ".PlayerHandler",
                    Parent = Layer,
                    Components =
                    {
                        new CuiImageComponent { Color = "0 0.5 0.2 0" },
                        new CuiRectTransformComponent { AnchorMin = "0.11 0.1", AnchorMax = "0.53 0.5", OffsetMax = "0 0" }
                    }
                });

            container.Add(new CuiElement
            {
                Parent = Layer + ".PlayerHandler",
                Name = Layer + "OnlineText",
                Components =
                {
                    new CuiTextComponent { Text = $" онлайн {BasePlayer.activePlayerList.Count} из {ConVar.Server.maxplayers}", Color = "1 1 1 0.5", FontSize = 14, Font = "robotocondensed-bold.ttf", Align = TextAnchor.MiddleCenter },
                    new CuiRectTransformComponent { AnchorMin = "0 0", AnchorMax = "0.93 1", OffsetMax = "0 0" }
                }
            });

            CuiHelper.AddUi(player, container);
        }

        private void UpdateHeli(BasePlayer player, bool active)
        {
            CuiHelper.DestroyUi(player, Layer + "HeliIcon");
            CuiElementContainer container = new CuiElementContainer();

            container.Add(new CuiElement
            {
                Name = Layer + "HeliIcon",
                Parent = Layer + ".HeliHandler",
                Components =
                {
                    new CuiRawImageComponent { Png = (string) ImageLibrary.Call("GetImage", "HeliIcon"), Color = active ? "0.93 0.50 0.50" : "1 1 1 0.5" },
                    new CuiRectTransformComponent { AnchorMin = "0.1 0",AnchorMax = "-0.04 -0.25", OffsetMax = "28.666 28.666"}
                }
            });

            CuiHelper.AddUi(player, container);
        }

        private void UpdateBradley(BasePlayer player, bool active)
        {
            CuiHelper.DestroyUi(player, Layer + "BradleyIcon");
            CuiElementContainer container = new CuiElementContainer();

            container.Add(new CuiElement
            {
                Name = Layer + "BradleyIcon",
                Parent = Layer + ".BradleyHandler",
                Components =
                {
                    new CuiRawImageComponent { Png = (string) ImageLibrary.Call("GetImage", "BradleyIcon"), Color = active ? "0.56 0.86 0.56" : "1 1 1 0.5" },
                    new CuiRectTransformComponent { AnchorMin = "0.05 -0.1",AnchorMax = "-0.1 -0.17", OffsetMax = "28.666 28.666"}
                }
            });

            CuiHelper.AddUi(player, container);
        }

        private void UpdateAir(BasePlayer player, bool active)
        {
            CuiHelper.DestroyUi(player, Layer + "AirIcon");
            
            CuiElementContainer container = new CuiElementContainer();

            container.Add(new CuiElement
            {
                Name = Layer + "AirIcon",
                Parent = Layer + ".AirHandler",
                Components =
                {
                    new CuiRawImageComponent { Png = (string) ImageLibrary.Call("GetImage", "AirIcon"), Color = active ? "0 0.73 1" : "1 1 1 0.5" },
                    new CuiRectTransformComponent { AnchorMin = "0 0.1",AnchorMax = "-0.05 -0.25", OffsetMax = "28.666 28.666"}
                }
            });

            CuiHelper.AddUi(player, container);
        }

        private void UpdateChinook(BasePlayer player, bool active)
        {
            CuiHelper.DestroyUi(player, Layer + "ChinIcon");
            CuiElementContainer container = new CuiElementContainer();

            container.Add(new CuiElement
            {
                Name = Layer + "ChinIcon",
                Parent = Layer + ".ChinookHandler",
                Components =
                {
                    new CuiRawImageComponent { Png = (string) ImageLibrary.Call("GetImage", "ChinIcon"), Color = active ? "0.83 0.68 1" : "1 1 1 0.5" },
                    new CuiRectTransformComponent { AnchorMin = "0 0.02",AnchorMax = "-0.05 -0.1", OffsetMax = "28.666 28.666"}
                }
            });

            CuiHelper.AddUi(player, container);
        }

        private void UpdateCargoShip(BasePlayer player, bool active)
        {
            CuiHelper.DestroyUi(player, Layer + "CargoIcon");
            CuiElementContainer container = new CuiElementContainer();

            container.Add(new CuiElement
            {
                Name = Layer + "CargoIcon",
                Parent = Layer + ".CargoShipHandler",
                Components =
                {
                    new CuiRawImageComponent { Png = (string) ImageLibrary.Call("GetImage", "CargoIcon"), Color = active ? "0 0.73 1" : "1 1 1 0.5" },
                    new CuiRectTransformComponent { AnchorMin = "0.055 0.05",AnchorMax = "-0.1 -0.2", OffsetMax = "28.666 28.666"}
                }
            });

            CuiHelper.AddUi(player, container);
        }

        private void UpdateMessages(BasePlayer player)
        {
            if (playerModes[player.userID])
            {
                CuiHelper.DestroyUi(player, Layer + "MessageHandler");
                CuiElementContainer container = new CuiElementContainer();

                container.Add(new CuiElement
                {
                    Name = Layer + "MessageHandler",
                    Parent = Layer,
                    Components =
                    {
                        new CuiImageComponent { Color = "1 1 1 0" },
                        new CuiRectTransformComponent { AnchorMin = "-1.55 -0.34", AnchorMax = "0 0", OffsetMax = "0 0" }
                    }
                });
            
                container.Add(new CuiElement
                {
                    Parent = Layer + "MessageHandler",
                    Components =
                    {
                        new CuiTextComponent { Text = messageList.GetRandom(), FontSize = 14, Font = "robotocondensed-bold.ttf", Color = "0.89 0.89 0.89 1", Align = TextAnchor.MiddleCenter },
                        new CuiRectTransformComponent { AnchorMin = "0.02 0", AnchorMax = "1 1", OffsetMax = "0 0" }
                    }
                });

                CuiHelper.AddUi(player, container);
            }
            
        }

        #endregion
    }
}