using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using UnityEngine;

[Serializable]
public class ChestBuildModel
{
    [SerializeField] public string ChestName;

    [SerializeField] public GameObject ChestPrefab;

    [SerializeField] public Vector3 Position;

    [SerializeField] public List<IndexValuePair<Item>> Content = new List<IndexValuePair<Item>>();

    public ChestBuildModel(ChestPrefabAsset chestPrefabAsset)
    {
        ChestName = chestPrefabAsset.Chest.Name;
        ChestPrefab = chestPrefabAsset.Chest.ChestModel;
        Position = chestPrefabAsset.Position;


        Content.Clear();
        foreach (IndexValuePair<EquippableItem> item in chestPrefabAsset.Chest.Content)
        {
            Content.Add(
                new IndexValuePair<Item>(item.Key, item.Value)
            );
        }
    }

    public ChestPrefabAsset MapBuildModelToPrefabAssetModel()
    {
        ChestPrefabAsset chestPrefabAsset = new ChestPrefabAsset(
            ChestName,
            ChestPrefab.gameObject.name,
            Position
        );

        chestPrefabAsset.Chest = new Chest(ChestPrefab.GetComponent<ChestWrapper>().Chest);

        chestPrefabAsset.Chest.ChestModel = ChestPrefab;

        chestPrefabAsset.Chest.Name = ChestName;

        chestPrefabAsset.Chest.Content = new List<IndexValuePair<EquippableItem>>();

        foreach (var ChestElement in Content)
        {
            var castedObject = ChestElement.Value as EquippableItem;

            if (castedObject == null)
                chestPrefabAsset.Chest.Content.Add(
                    new IndexValuePair<EquippableItem>(ChestElement.Key, new EquippableItem(ChestElement.Value))
                );
            else
                chestPrefabAsset.Chest.Content.Add(
                    new IndexValuePair<EquippableItem>(ChestElement.Key, castedObject)
                );
        }

        return chestPrefabAsset;
    }

    public static List<ChestBuildModel> ConvertPrefabAssetListToBuildModelList(List<ChestPrefabAsset> chestPrefabAssetList)
    {
        List<ChestBuildModel> convertedList = new List<ChestBuildModel>();

        foreach(var element in chestPrefabAssetList)
        {
            convertedList.Add(ChestBuildModel.ConvertPrefabAssetModelToBuildModel(element));
        }

        return convertedList;
    }
    public static ChestBuildModel ConvertPrefabAssetModelToBuildModel(ChestPrefabAsset chestPrefabAsset)
    {
        return new ChestBuildModel(chestPrefabAsset);
    }

}