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

public class omFOV : MonoBehaviour
{
    private static omFOV inst = null;
    public static omFOV Inst { get { return inst; } }

    public float viewRadius;
    [Range(0, 360)]
    public float viewAngle;

    // 인식할 LayerMask
    public LayerMask targetMask;
    // 제외할 LayerMask
    public LayerMask obstacleMask;

    // 바라본 타겟이 담기는 리스트
    public List<Transform> visibleTargets = new List<Transform>();

    // 타겟이 들어왔는지 확인용 bool 값
    public bool LookOn = false;

    public void Start()
    {
        //플레이 시 FindTargetsDelay 코루틴을 실행한다. 0.5초 간격으로 
        // StartCoroutine("FindTargetsDelay", 0.5f);
        //StartCoroutine(FindTargetsDelay(0.5f));
    }
    IEnumerator FindTargetsDelay(float delay)
    {
        while (true)
        {
            yield return new WaitForSeconds(delay);
            // 안보는 동안 false 값
            LookOn = false;
            FindTargets();
        }
    }

    public void FindTargets()
    {
        Collider[] targetInViewRadius = Physics.OverlapSphere(transform.position, viewRadius, targetMask);

        //ViewRadius 안에 있는 타겟의 개수 = 배열의 개수보다 i가 작을 때 for 실행 
        for (int i = 0; i < targetInViewRadius.Length; i++)
        {
            // 타겟 [i] 의 위치
            Transform target = targetInViewRadius[i].transform;

            //vector3타입의 타겟의 방향 변수 선언 = 타겟의 방향벡터, 타겟의 position - 이 게임오브젝트의 position) normalized 
            //= 벡터 크기 정규화 = 단위벡터화
            Vector3 dirToTarget = (target.position - transform.position).normalized;

            // 전방 벡터와 타겟방향벡터의 크기가 시야각의 1/2이면 = 시야각 안에 타겟 존재 
            if (Vector3.Angle(transform.forward, dirToTarget) < viewAngle / 2)
            {
                // 타겟과의 거리 계산
                float dstToTarget = Vector3.Distance(transform.position, target.position);
                //레이캐스트를 쐈는데 obstacleMask가 아닐 때 참이고 아래를 실행함 
                if (!Physics.Raycast(transform.position, dirToTarget, dstToTarget, obstacleMask))
                {
                    visibleTargets.Add(target);
                    // 보면 true 값
                    LookOn = true;
                    // Debug.Log($"'{target.gameObject.name}' 들어옴");
                    // Debug.DrawRay(transform.position, dirToTarget * 10f, Color.red, 5f);
                }
            }
            else
            {
                // 타겟이 안보면 리스트안에서 제거
                visibleTargets.Remove(target);

                // 이 부분에 교육생을 쳐다보라고 ui 추가
            }
        }

    }
}