using System.Collections;
using UnityEngine;
using UnityEngine.Animations.Rigging;

public class PistolRaccoon : Enemy
{
    [Header("Personal Scripts")]
    [SerializeField] EnemyGun enemyGun;
    [SerializeField] Rig shootingRig;
    [SerializeField] GameObject playerFlankChosen;

    [SerializeField] float shootingRigWeight;
    [SerializeField] float aimSpeed;
    [SerializeField] bool isShooting;
    [SerializeField] bool isSitting;
    [SerializeField] float shootEntryDistanceMin;
    [SerializeField] float shootEntryDistanceMax;
    [SerializeField] float shootEntryDistance;
    [SerializeField] float shootExitDistance;

    [SerializeField] LayerMask wallMask;

    // Start is called once before the first execution of Update after the MonoBehaviour is created
    protected override void Start()
    {
        base.Start();

        rb.isKinematic = true;

        enemyGun = GetComponent<EnemyGun>();

        shootingRig.weight = 0f;

        shootEntryDistance = Random.Range(shootEntryDistanceMin, shootEntryDistanceMax);

        RandomizeSettings();

        if (isSitting)
        {
            animator.SetBool("isSitting", true);
        }
        else
        {
            animator.SetBool("isSitting", false);
        }
    }

    // Update is called once per frame
    protected override void Update()
    {
        base.Update();

        shootingRig.weight = Mathf.Lerp(shootingRig.weight, shootingRigWeight, Time.deltaTime * aimSpeed);

        switch (enemyState)
        {
            case EnemyStates.Idle:
                break;
            case EnemyStates.Moving:
                Move();
                break;
            case EnemyStates.Shooting:
                if (HasLineOfSight())
                {
                    Shoot();
                }
                else
                {
                    SwitchState(EnemyStates.Moving);
                }
                break;
            case EnemyStates.Dodging:
                Dodge();
                break;
            case EnemyStates.Running:
                isShooting = false;
                RunAway();
                break;
        }
    }

    void Move()
    {
        if (!agent.enabled) agent.enabled = true;
        isShooting = false;
        StopAllCoroutines();
        agent.isStopped = false;
        Rotate();
        float distance = Vector3.Distance(playerController.transform.position, transform.position);
        animator.SetBool("isMoving", true);

        if (distance > shootEntryDistance)
        {
            agent.SetDestination(playerFlankChosen.transform.position);
        }
        else
        {
            if (HasLineOfSight())
            {
                SwitchState(EnemyStates.Shooting);
            }
            else
            {
                RandomizeSettings(); // Pick another flank
                agent.SetDestination(playerFlankChosen.transform.position);
            }
        }
    }

    public override void AlertEnemy()
    {
        base.AlertEnemy();

        animator.SetBool("isSitting", false);

        float distance = Vector3.Distance(playerController.transform.position, transform.position);

        if (distance <= shootEntryDistance)
        {
            SwitchState(EnemyStates.Shooting);
        }
        else
        {
            SwitchState(EnemyStates.Moving);
        }
    }

    void Shoot()
    {
        isRunningAway = false;
        agent.isStopped = true;
        float distance = Vector3.Distance(playerController.transform.position, transform.position);
        animator.SetBool("isMoving", false);
        Rotate();

        if (distance > shootExitDistance)
        {
            shootingRigWeight = 0f;
            SwitchState(EnemyStates.Moving);
            return;
        }
        else if (distance < 10f)
        {
            shootingRigWeight = 0f;
            SwitchState(EnemyStates.Running);
            return;
        }

        if (shootingRigWeight < 1f) shootingRigWeight = 1f;

        if (!isShooting)
        {
            StartCoroutine(ShootTimer());
        }
    }

    bool HasLineOfSight()
    {
        RandomizeSettings();

        Vector3 origin = transform.position + Vector3.up * 1.5f;
        Vector3 direction = transform.forward;

        if (Physics.Raycast(origin, direction, out RaycastHit hit, 100f, wallMask))
        {
            return false;
        }

        return true;
    }

    IEnumerator ShootTimer()
    {
        isShooting = true;

        RandomizeSettings();

        yield return new WaitForSeconds(enemyGun.fireRate);

        enemyGun.Shoot();

        isShooting = false;
    }

    void RandomizeSettings()
    {
        int randomFlank = Random.Range(0, playerFlanks.Count);
        playerFlankChosen = playerFlanks[randomFlank];

        shootEntryDistance = Random.Range(shootEntryDistanceMin, shootEntryDistanceMax);
    }

}