using UnityEngine;
using UnityEngine.AI;

public enum EnemyStates {
    MOVE,
    ATTACK,
    DEFEND
}

public class Enemy_AI : MonoBehaviour {
    NavMeshAgent m_polunetsinta;
    Animator m_reaper_animaatiot;
    GameObject m_target;
    Vector3 m_enemy_alkupaikka;
    int m_enemyn_alku_hp;
    float etäisyys_pelaajaan;
    int kc = 0;
    [SerializeField]
    EnemyStates m_enemy_state;

    [SerializeField]
    int m_enemy_Hp = 100;
    [SerializeField]
    int m_enemy_damage = 1;

    Pelaajan_hyökkäykset m_pelaajan_hyökkäykset;
    Pelaajan_hp m_pelaajan_hp;

    GameObject m_scythe;
    Animator m_scythe_animaatio;

    Random random_number;
    GameObject m_keskusta;
    float m_etäisyys_keskustaan;

    Music_handler soundhandler;
    // Start is called before the first frame update
    void Start() {
        m_keskusta = GameObject.Find("keskipiste");
        m_polunetsinta = GetComponent<NavMeshAgent>();
        m_reaper_animaatiot = GetComponent<Animator>();
        m_target = GameObject.Find("player");
        m_enemy_alkupaikka = transform.position;
        m_enemyn_alku_hp = m_enemy_Hp;
        m_enemy_state = EnemyStates.MOVE;

        m_pelaajan_hyökkäykset = m_target.GetComponent<Pelaajan_hyökkäykset>();
        m_pelaajan_hp = m_target.GetComponent<Pelaajan_hp>();

        m_reaper_animaatiot = GetComponent<Animator>();
        m_scythe = GameObject.FindGameObjectWithTag("enemy_scythe");
        m_scythe_animaatio = m_scythe.GetComponent<Animator>();

        soundhandler = m_target.GetComponent<Music_handler>();
    }

    // Update is called once per frame
    void Update() {
        etäisyys_pelaajaan = Vector3.Distance(transform.position, m_target.transform.position);
        m_etäisyys_keskustaan = Vector3.Distance(transform.position, m_keskusta.transform.position);

        // very bad style but we need to disable the animator in order for manual rotating to work
        m_scythe_animaatio.enabled = true;

        switch (m_enemy_state) {
            case EnemyStates.MOVE:
                m_polunetsinta.SetDestination(m_target.transform.position);//Destination player
                m_scythe_animaatio.SetBool("scythe_attack", false);
                m_reaper_animaatiot.SetBool("moving", true);
                m_reaper_animaatiot.SetBool("attacking", false);
                m_reaper_animaatiot.SetBool("defending", false);
                // Tarkista pitäisikö siirtyä seuraavaan tilaan
                if(etäisyys_pelaajaan <= 10) {
                    m_polunetsinta.SetDestination(transform.position);//Destination stop
                    m_enemy_state = EnemyStates.ATTACK;
                }
                break;
            case EnemyStates.ATTACK:
                m_scythe_animaatio.SetBool("scythe_attack", true);
                m_reaper_animaatiot.SetBool("moving", false);
                m_reaper_animaatiot.SetBool("attacking", true);
                m_reaper_animaatiot.SetBool("defending", false);
                soundhandler.scytheääni();
                // Tarkista pitäisikö siirtyä seuraavaan tilaan
                if(etäisyys_pelaajaan > 10) {
                    m_enemy_state = EnemyStates.MOVE;
                }
                int randoma = Random.Range(0, 9);
                if (randoma == 0) {
                    m_enemy_state = EnemyStates.DEFEND;
                }
                break;
            case EnemyStates.DEFEND:
                m_scythe_animaatio.enabled = false;
                m_scythe_animaatio.SetBool("scythe_attack", false);
                m_reaper_animaatiot.SetBool("moving", false);
                m_reaper_animaatiot.SetBool("attacking", false);
                m_reaper_animaatiot.SetBool("defending", true);
                m_scythe.transform.Rotate(0, -200, 0);
                // Tarkastele pitäisikö vaihtaa tilaa
                if(etäisyys_pelaajaan > 10) {
                    m_enemy_state = EnemyStates.MOVE;
                }
                break;
            
        }
        if (m_enemy_Hp <= 0) {
            transform.position = m_enemy_alkupaikka;
            m_enemy_Hp = m_enemyn_alku_hp;
            m_enemy_state = EnemyStates.MOVE;
            kc += 1;
        }

        if (kc >= 1) {
            Destroy(gameObject);
        }

        if (m_etäisyys_keskustaan > 150) {
            transform.position = m_enemy_alkupaikka;
            m_enemy_state = EnemyStates.MOVE;
        }
    }

    void OnCollisionEnter(Collision collision) {
        if (collision.collider.tag == "player_scythe") {
            vihollinen_ottaa_osumaa(m_pelaajan_hyökkäykset.do_damage());
        }
    }

    public int aiheuta_vahinkoa_pelaajalle() {
        soundhandler.osumaääni();
        return m_enemy_damage;
    }

    public void vihollinen_ottaa_osumaa(int damagemaara) {
        m_enemy_Hp -= damagemaara;
    }

    public int getEnemiesReaped() {
        return kc;
    }
}
