using System;
using System.Collections.Generic;
using System.Linq;
using UnityEditor;
using UnityEngine;


public class EquipmentPanelController : DraggablePanelController
{
    [SerializeField] protected GameObject _panelAdditionalSlotsContent;

    protected override UIBaseManager<IndexValuePair<int, EquippableItem>> FetchUiManager()
    {
        return GameObject.FindObjectOfType<EquipmentUIManager>();
    }

    private void Start()
    {
        AllowToUseItemInPanel = false;
        Type = PanelTypeEnum.Shop;
    }

    public override void BuildPanelSlots()
    {
        InitSlotsList();
    }

    public void InitSlotsList()
    {
        _panelContent.transform.Find("equipment_slot_helmet").GetComponent<EquipmentSlot>()._PanelController = this;
        _panelContent.transform.Find("equipment_slot_armor").GetComponent<EquipmentSlot>()._PanelController = this;
        _panelContent.transform.Find("equipment_slot_weapon").GetComponent<EquipmentSlot>()._PanelController = this;
        _panelContent.transform.Find("equipment_slot_boots").GetComponent<EquipmentSlot>()._PanelController = this;
        _panelAdditionalSlotsContent.transform.Find("equipment_slot_ring_i").GetComponent<EquipmentSlot>()._PanelController = this;
        _panelAdditionalSlotsContent.transform.Find("equipment_slot_necklace_i").GetComponent<EquipmentSlot>()._PanelController = this;
        _panelAdditionalSlotsContent.transform.Find("equipment_slot_necklace_ii").GetComponent<EquipmentSlot>()._PanelController = this;
        _panelAdditionalSlotsContent.transform.Find("equipment_slot_ring_ii").GetComponent<EquipmentSlot>()._PanelController = this;
        _panelAdditionalSlotsContent.transform.Find("equipment_slot_ring_iii").GetComponent<EquipmentSlot>()._PanelController = this;

        ChildBoxList.Add(SetupDragAndDropToSlot(_panelContent.transform.Find("equipment_slot_helmet").GetComponent<EquipmentSlot>()));
        ChildBoxList.Add(SetupDragAndDropToSlot(_panelContent.transform.Find("equipment_slot_armor").GetComponent<EquipmentSlot>()));
        ChildBoxList.Add(SetupDragAndDropToSlot(_panelContent.transform.Find("equipment_slot_weapon").GetComponent<EquipmentSlot>()));
        ChildBoxList.Add(SetupDragAndDropToSlot(_panelContent.transform.Find("equipment_slot_boots").GetComponent<EquipmentSlot>()));
        ChildBoxList.Add(SetupDragAndDropToSlot(_panelAdditionalSlotsContent.transform.Find("equipment_slot_ring_i").GetComponent<EquipmentSlot>()));
        ChildBoxList.Add(SetupDragAndDropToSlot(_panelAdditionalSlotsContent.transform.Find("equipment_slot_necklace_i").GetComponent<EquipmentSlot>()));
        ChildBoxList.Add(SetupDragAndDropToSlot(_panelAdditionalSlotsContent.transform.Find("equipment_slot_necklace_ii").GetComponent<EquipmentSlot>()));
        ChildBoxList.Add(SetupDragAndDropToSlot(_panelAdditionalSlotsContent.transform.Find("equipment_slot_ring_ii").GetComponent<EquipmentSlot>()));
        ChildBoxList.Add(SetupDragAndDropToSlot(_panelAdditionalSlotsContent.transform.Find("equipment_slot_ring_iii").GetComponent<EquipmentSlot>()));
    }


    public override GameObject BuildSlot(int key, GameObject _parent) { throw new NotImplementedException(); }


    // 2. Set up panel additn items to it

    //public void SetUp - in parent
    /// <summary>
    /// elements: List<
    ///     IndexValuePair<
    ///         int: dropped slot number, 
    ///         EquippableItem: dragged item
    ///     >
    /// >
    /// </summary>
    /// <param name="elements"></param>
    public override void BuildPanelContent(List<IndexValuePair<int, EquippableItem>> elements)
    {

        base.BuildPanelContent(elements);

        foreach (IndexValuePair<int, EquippableItem> element in elements)
        {
            //Debug.Log($"key: {element.Key} - {(EquipmentPanelSlotsTypeEnum)element.Key}");

            if (element.Value != null)
            {

                // slot type != element.key
                // element.Key IS DROPPED SLOT number 
                // ChildBoxList order IS CONSTANT
                // elements HAVE mixed order


                // there is error - ChildBoxList.Where(slot => ((EquipmentSlot)slot).type == (EquipmentPanelSlotsTypeEnum)element.Key).ToList().ForEach(slot => slot.SetItem((EquippableItem)element.Value));

                // FIX  
                ChildBoxList[element.Key].SetItem((EquippableItem)element.Value);
            }
        }
    }




    public override void ClearSlots()
    {
        foreach (ItemSlot ChestSlot in ChildBoxList)
        {
            ChestSlot.ResetSlot();
        }
    }

    public override void EndDrag(ItemSlot itemSlot)
    {
        if (!DraggedSlotController.Instance.IsDragged()) // if there was nothing dragged - ignore event
            return;

        DraggedSlotController.Instance.RemoveDraggedSlot();
  
        if (!itemSlot.Item)
            ((ItemSlot)ChildBoxList.Where(slot => slot.Number == itemSlot.Number).First()).ResetSlot();
        else
            ((ItemSlot)ChildBoxList.Where(slot => slot.Number == itemSlot.Number).First()).SetItem(itemSlot.Item);


        var ChildBoxListCopy = new List<IndexValuePair<int, EquippableItem>>(ChildBoxList.Where(slot => slot.Item != null).Select(slot => new IndexValuePair<int, EquippableItem>(slot.Number, slot.Item)).ToList());

        UiManager.RemoveAll();

        foreach (IndexValuePair<int, EquippableItem> slot in ChildBoxListCopy)
        {
            if (slot.Value != null)
            {
                // Debug.Log($"Slot nr: {slot.Key} with item: {slot.Value}");
                UiManager.Add(new IndexValuePair<int, EquippableItem>(slot.Key, slot.Value));
            }
            else
            {
                UiManager.Add(new IndexValuePair<int, EquippableItem>(slot.Key, null));  // ONLY DIFFERENCE BETWEEN UpdatePanelContent()
            }
        }
    }

}