using System.Collections.Generic;
using System.Linq;
using GTANetworkAPI;
using Newtonsoft.Json;
using ReallifeGamemode.Server.Entities;
using ReallifeGamemode.Server.Extensions;
using ReallifeGamemode.Server.Models;

namespace ReallifeGamemode.Server.Events
{
    public class UpdateCharacterCloth : Script
    {
        [RemoteEvent("updateDutyProp")]
        public void UpdateDutyProp(Client player, int componentId, int componentVariation)
        {
            if (componentId != -1)
            {
                player.SetAccessories(componentId, componentVariation, 0);
            }
            else
            {
                player.ClearAccessory(0);
            }

        }

        [RemoteEvent("updateDutyCloth")]
        public void UpdateDutyCloth(Client player, int componentId, int componentVariation)
        {
            if (componentId == 11)
            {
                //TODO Spezielle Duty Kleidung in Datenbank einpflegen (Ergibt bei Cop-Kleidung NULL)
                using (var context = new DatabaseContext())
                {
                    var character = player.GetUser().GetCharacter();

                    var combination = context.ClothCombinations.FirstOrDefault(c => c.Top == componentVariation && c.Gender == character.Gender);
                    player.SetClothes(11, componentVariation, 0);
                    if (combination != null)
                    {
                        player.SetClothes(3, combination.Torso, 0);
                        player.SetClothes(8, combination.Undershirt, 0);
                    }
                }
            }
            else
            {
                player.SetClothes(componentId, componentVariation, 0);
            }
        }

        [RemoteEvent("saveCharacterCloth")]
        public void SaveDutyCloth(Client client, string JSlotType, string JSlotId, string JClothId)
        {
            using (var context = new DatabaseContext())
            {
                int[] slotType = JsonConvert.DeserializeObject<int[]>(JSlotType);
                int[] slotId = JsonConvert.DeserializeObject<int[]>(JSlotId);
                int[] clothId = JsonConvert.DeserializeObject<int[]>(JClothId);

                User user = client.GetUser();
                user = context.Users.FirstOrDefault(u => u.Id == user.Id);

                var character = client.GetUser().GetCharacter();

                var charClothes = context.CharacterClothes.FirstOrDefault(c => c.UserId == user.Id);
                if (charClothes == null)
                {
                    for (var x = 0; x < slotType.Length; x++)
                    {
                        CharacterCloth newCloth = new CharacterCloth
                        {
                            UserId = user.Id,

                            Duty = true,

                            SlotType = (byte)slotType[x],
                            SlotId = slotId[x],
                            ClothId = clothId[x]
                        };
                        context.CharacterClothes.Add(newCloth);
                    }
                    if (user.GetCharacter().Gender == false)
                    {
                        CharacterCloth newTorso = new CharacterCloth
                        {
                            UserId = user.Id,

                            Duty = true,

                            SlotType = 0,
                            SlotId = 3,
                            ClothId = context.ClothCombinations.FirstOrDefault(c => c.Top == clothId[1] && c.Gender == character.Gender).Torso
                        };
                        CharacterCloth newUndershirt = new CharacterCloth
                        {
                            UserId = user.Id,

                            Duty = true,

                            SlotType = 0,
                            SlotId = 8,
                            ClothId = context.ClothCombinations.FirstOrDefault(c => c.Top == clothId[1] && c.Gender == character.Gender).Undershirt
                        };
                        context.CharacterClothes.Add(newTorso);
                        context.CharacterClothes.Add(newUndershirt);
                    }
                }
                else
                {
                    for (var x = 0; x < slotType.Length; x++)
                    {
                        var loopCloth = context.CharacterClothes.FirstOrDefault(u => u.UserId == user.Id && u.SlotType == slotType[x] && u.SlotId == slotId[x]);
                        loopCloth.ClothId = clothId[x];
                    }
                    CharacterCloth torso = context.CharacterClothes.FirstOrDefault(u => u.UserId == user.Id && u.SlotType == 0 && u.SlotId == 3);
                    CharacterCloth undershirt = context.CharacterClothes.FirstOrDefault(u => u.UserId == user.Id && u.SlotType == 0 && u.SlotId == 8);

                    torso.ClothId = context.ClothCombinations.FirstOrDefault(c => c.Top == clothId[1] && c.Gender == character.Gender).Torso;
                    undershirt.ClothId = context.ClothCombinations.FirstOrDefault(c => c.Top == clothId[1] && c.Gender == character.Gender).Undershirt;
                }
                context.SaveChanges();
            }
            LoadCharacterDefaults(client);
        }

        [RemoteEvent("defaultCharacterCloth")]
        public static void LoadCharacterDefaults(Client player)
        {
            User user = player.GetUser();
            using (var context = new DatabaseContext())
            {
                List<CharacterCloth> charClothes = context.CharacterClothes.ToList().FindAll(c => c.UserId == user.Id && c.Duty == false);
                player.ClearAccessory(0);
                player.ClearAccessory(1);
                player.ClearAccessory(2);
                player.ClearAccessory(6);
                player.ClearAccessory(7);

                foreach (var cloth in charClothes)
                {
                    if (cloth.SlotType == 1)
                    {
                        player.SetAccessories(cloth.SlotId, cloth.ClothId, 0);
                    }
                    else
                    {
                        player.SetClothes(cloth.SlotId, cloth.ClothId, cloth.Texture);
                    }
                }
            }
        }
    }
}