using Unity.Mathematics;
using UnityEngine;
using UnityEngine.Splines;

//스플라인 선을 따라 깔리는 환경음(파도 등)
//소스 하나가 플레이어와 "스플라인 위에서 가장 가까운 지점"을 추적해
//어떤 모양의 해안선이든 방향성 + 거리감쇠를 처리한다. (닫힌 섬 형태 포함)
[RequireComponent(typeof(AudioSource))]
public class LineAmbienceAudio : MonoBehaviour
{
    [Header("스플라인")]
    [SerializeField] private SplineContainer _spline; //환경음이 깔릴 선 (해안선 등)

    [Header("추적 대상")]
    [SerializeField] private Transform _listener; //플레이어 (보통 메인 카메라). 비우면 자동으로 Camera.main 사용

    private void LateUpdate()
    {
        Transform listener = _listener != null ? _listener : (Camera.main != null ? Camera.main.transform : null);
        if (listener == null || _spline == null) return;

        //리스너 위치를 스플라인 로컬 공간으로 변환 (컨테이너의 Transform 반영)
        float3 localListener = _spline.transform.InverseTransformPoint(listener.position);

        //스플라인 곡선 위에서 가장 가까운 지점을 구함 (Knot 사이 곡선까지 정확)
        SplineUtility.GetNearestPoint(_spline.Spline, localListener, out float3 localNearest, out _);

        //다시 월드 공간으로 변환해서 소스를 그 지점으로 이동
        transform.position = _spline.transform.TransformPoint(localNearest);
    }

    //에디터에서 현재 소스가 추적중인 지점을 표시 (스플라인 자체는 SplineContainer가 그려줌)
    private void OnDrawGizmosSelected()
    {
        Gizmos.color = Color.yellow;
        Gizmos.DrawSphere(transform.position, 0.5f);
    }
}
