using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class EnemySpawnController : MonoBehaviour
{

    [SerializeField] List<Opponent> enemyList;
    [SerializeField] List<Image> enemySprites;

    Dictionary<Opponent, Image> enemies = new Dictionary<Opponent, Image>();

    float mana;

    Opponent activeSpawn;
    [SerializeField] GameObject dragObject;
    GameObject enemyImage;

    private void Awake()
    {
        mana = -1;

        for (int i = 0; i < enemyList.Count; i++)
        {
            enemies.Add(enemyList[i], enemySprites[i]);
        }
    }

    // Update is called once per frame
    void Update()
    {
        var actualMana = StatsManager.instance.GetMana();
        if (mana != actualMana)
        {
            mana = actualMana;
            ChangeActiveState();
        }
    }

    void ChangeActiveState()
    {
        foreach (KeyValuePair<Opponent, Image> enemy in enemies)
        {
            if (enemy.Key.enemyCost > mana)
            {
                enemy.Value.color = new Color(0.3f, 0.3f, 0.3f, 1f);
            }
            else
            {
                enemy.Value.color = new Color(1f, 1f, 1f, 1f);
            }
        }
    }

    void SetEnemyToSpawnObject(string enemyName)
    {
        foreach (Opponent enemy in enemyList)
        {
            if (enemy.Name == enemyName)
            {
                activeSpawn = enemy;
            }
        }
    }

    public void OnEnemyMouseDown(string enemyName)
    {
        SetEnemyToSpawnObject(enemyName);
        if (StatsManager.instance.ModifyMana(-1 * (int)activeSpawn.enemyCost))
        {
            dragObject.GetComponent<Image>().sprite = activeSpawn.EnemySprite;
            enemyImage = Instantiate(dragObject, GetPreviewWorldPosition(), Quaternion.identity, transform);
        }
    }

    public void OnEnemyDrag()
    {
        if (enemyImage != null)
        {
            enemyImage.transform.position = GetPreviewWorldPosition();
        }
    }

    public void OnEnemyDrop()
    {
        if (enemyImage != null)
        {
            Destroy(enemyImage);
            enemyImage = null;
            var targetPos = GetPreviewWorldPosition();
            var newEnemy = Instantiate(activeSpawn.enemyPrefab, targetPos, Quaternion.identity);
            // The spawned Enemy has the pivot at the bottom, not in the middle.
            // Move it down by half its height to match the preview position.
            targetPos.y -= newEnemy.GetComponent<SpriteRenderer>().bounds.extents.y;
            newEnemy.transform.position = targetPos;
        }
    }

    Vector3 GetPreviewWorldPosition()
    {
        Vector3 pos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
        pos.z = 0;
        return pos;
    }
}