﻿using UnityEngine;
using System.Collections;
using Arbor;

/// <summary>
/// Enemy damage handling
/// </summary>
public class Damage : StateBehaviour
{
	/// <summary>
	/// Flag to check tags
	/// </summary>
	[SerializeField]
	bool _IsCheckTag = false;

	/// <summary>
	/// The name of the tag to check
	/// </summary>
	[SerializeField]
	private string _Tag = "Untagged";

	/// <summary>
	/// HP parameter reference
	/// </summary>
	[SerializeField]
	private IntParameterReference _HPParameter = new IntParameterReference();

	/// <summary>
	/// Animator displaying damage
	/// </summary>
	[SerializeField]
	private Animator _Animator = null;

	/// <summary>
	/// Earned points
	/// </summary>
	[SerializeField]
	private int _Point = 100;

	/// <summary>
	/// Transition when dying
	/// </summary>
	[SerializeField]
	private StateLink _DeadState = new StateLink();

	void Awake()
	{
		// If Animator is null, GetComponent will be used.
		if (_Animator == null)
		{
			_Animator = GetComponent<Animator>();
		}
	}

	void OnTriggerEnter2D(Collider2D c)
	{
		// Check the tag of the other party
		if (_IsCheckTag && !c.gameObject.CompareTag(_Tag))
		{
			return;
		}

		// Check HP parameter reference
		Parameter hpParameter = _HPParameter.parameter;
		if (hpParameter == null)
		{
			return;
		}

		// Get the target ParameterContainer.
		ParameterContainer targetParameter = c.GetComponent<ParameterContainer>();
		if (targetParameter == null)
		{
			return;
		}

		// Get the target Power parameter.
		Parameter powerParameter = targetParameter.GetParam("Power");
		if (powerParameter == null || powerParameter.type != Parameter.Type.Int)
		{
			return;
		}

		// Subtract Power from HP.
		int hp = hpParameter.intValue;

		hp -= powerParameter.intValue;

		hpParameter.intValue = hp;

		if (hp <= 0)
		{
			// Get score component and add points
			FindObjectOfType<Score>().AddPoint(_Point);

			// Transition to death state.
			Transition(_DeadState);
		}
		else
		{
			// Damage animation playback.
			if (_Animator != null)
			{
				_Animator.SetTrigger("Damage");
            }
        }
	}
}
