using UnityEngine;
using System.Collections;

public class EnemyAI : MonoBehaviour {

    public DecisionTree root;
    private Transform target;
    private Rigidbody2D Enemy;
    private Animator myAnimator;
    float enemyHealth;
    float playerHealth;
    private bool LookRight = false;
    public bool set;
    private float speed = 1;


    void Start() {

        enemyHealth = EnemyHealth.health;
        playerHealth = PlayerHealth.health;


        root = new DecisionTree();
        //  Debug.Log("start");
        target = GameObject.FindGameObjectWithTag("Player").transform; //look at the player
        myAnimator = GetComponent<Animator>(); //required for animation *******
        Enemy = GetComponent<Rigidbody2D>();
        BuildDecisionTree();

    }

    void Update() {


        root.search();

    }


    public bool d_inAttackRange() {
        if (Vector3.Distance(transform.position, target.position) < 1.5f) {
            myAnimator.SetBool("speed", false);
            return true;
        }
        else {
            myAnimator.SetBool("block", false);
            myAnimator.SetBool("attack", false);
            // Debug.Log("In Zone- not");
            return false;
        }
    }

    public bool d_isPlayerAttacking() {
        if (Input.GetKeyDown(KeyCode.Space) && Vector3.Distance(transform.position, target.position) < 6f) {
            return false;
        }
        return true;
    }

    public bool d_isPlayerHpLow() {
        if ((PlayerHealth.health/2) < playerHealth) {
            return true;
        }
        return false;
    }

    
    public bool d_isHpLow() {
        if ((EnemyHealth.health/2) < enemyHealth) {
            return true;
        }
        return false;
    }
    

    //makes a random decision with a 75% true return and a 25% false return
    public bool randomDecision75()
    {
        int x = Random.Range(1, 4);
        if (x == 1)
        {
            return false;
        }
        else return true;
    }
    
   
    // Actions
    public void a_attack() {
        Debug.Log("attacking");
		myAnimator.SetFloat("speed", 0f);
        myAnimator.SetBool("attack", true);
        Enemy.velocity = Vector2.zero;
    }

    public void a_block() {
        Debug.Log("run");
        float option = Random.Range(0, 2);
        if (option == 1) {
            myAnimator.SetBool("attack", false);
            myAnimator.SetBool("block", true);
            Enemy.velocity = Vector2.zero;
        }

        if (option == 2) {
            Enemy.AddForce(new Vector2(-50, 500));
        }

    }
    
    //template for a 'poison' special attack. Will slowly and gradually drain players health over time.
    public void poison()
    {
        Debug.Log("Performing Poison Attack");

    }

    public void a_moveToPlayer() {
        Debug.Log("moving");
        //rotate to look at the player
        //transform.LookAt(target.position);
		myAnimator.SetFloat("speed", 1); // This should probbaly reflect the actual speed
        transform.position = Vector2.MoveTowards(transform.position, target.position, speed * Time.deltaTime);

        if (target.transform.position.x <= transform.position.x) //players spot in world space as opposed to enemy "self" spot 
        {
            transform.rotation = new Quaternion(0, 180, 0, 0); // flips enemy around to face the player on x axis only
        }
        else if (target.transform.position.x >= transform.position.x) //players spot in world space as opposed to enemy "self" spot
        {
            transform.rotation = new Quaternion(0, 0, 0, 0); // flips enemy around to face the player on x axis only }
        }
    }

    public void a_moveFromPlayer() {
        Debug.Log("moving");
        //rotate to look at the player
        //transform.LookAt(target.position);
		myAnimator.SetFloat("speed", 1); // This should probbaly reflect the actual speed
        transform.position = Vector2.MoveTowards(-transform.position, target.position, speed * Time.deltaTime);

        if (target.transform.position.x <= transform.position.x) //players spot in world space as opposed to enemy "self" spot 
        {
            transform.rotation = new Quaternion(0, 180, 0, 0); // flips enemy around to face the player on x axis only
        }
        else if (target.transform.position.x >= transform.position.x) //players spot in world space as opposed to enemy "self" spot
        {
            transform.rotation = new Quaternion(0, 0, 0, 0); // flips enemy around to face the player on x axis only }
        }
    }




    public void BuildDecisionTree() {

        //Actions
        DecisionTree Block = new DecisionTree();
        Block.setAction(a_block);

        DecisionTree MoveToPlayer = new DecisionTree();
        MoveToPlayer.setAction(a_moveToPlayer);

        DecisionTree Attack = new DecisionTree();
        Attack.setAction(a_attack);

        DecisionTree MoveAway = new DecisionTree();
        MoveAway.setAction(a_moveFromPlayer);


        // Decisions
        DecisionTree EnemyHP = new DecisionTree();
        EnemyHP.setDecision(d_isHpLow);
        EnemyHP.setLeft(MoveAway);
        EnemyHP.setRight(Attack);

        DecisionTree PlayerHP = new DecisionTree();
        PlayerHP.setDecision(d_isPlayerHpLow);
        PlayerHP.setLeft(Attack);
        PlayerHP.setRight(EnemyHP);



        DecisionTree GettingAttacked = new DecisionTree();
        GettingAttacked.setDecision(d_isPlayerAttacking);
        GettingAttacked.setLeft(Attack);
        GettingAttacked.setRight(Block);

        root.setDecision(d_inAttackRange);
        root.setLeft(GettingAttacked);
        root.setRight(MoveToPlayer);

        
        
        
    }


}