using UnityEngine;

public class TunnelNode : MonoBehaviour, IInteractable
{
    public bool isTop;
    [SerializeField] private TunnelNode partnerNode; // 같은 프리팹 내 반대쪽 노드

    // [자동 연결] 닿아있는 다른 터널의 노드
    private TunnelNode neighborNode;

    // 물리적으로 닿으면 자동으로 연결 고리 생성 
    private void OnTriggerEnter(Collider other)
    {
        if (other.TryGetComponent<TunnelNode>(out var neighbor))
        {
            // 상단 노드는 하단 노드와만, 하단은 상단과만 연결 (잘못된 조립 방지)
            if (this.isTop != neighbor.isTop)
            {
                neighborNode = neighbor;
            }
        }
    }

    private void OnTriggerExit(Collider other)
    {
        if (other.TryGetComponent<TunnelNode>(out var neighbor))
        {
            if (neighborNode == neighbor) neighborNode = null;
        }
    }

    public void Interact(GameObject player)
    {
        // 내가 체인의 끝단(입구/출구)일 때만 작동
        if (neighborNode != null) return;

        // 반대쪽 끝 노드를 찾아서 이동 요청
        TunnelNode endNode = FindUltimateEndNode();
        if (player.TryGetComponent<TunnelTraveler>(out var traveler))
        {
            traveler.StartTravel(endNode.transform.position, !endNode.isTop);
        }
    }

    private TunnelNode FindUltimateEndNode()
    {
        TunnelNode current = this;

        // [연결 고리 추적] 파트너 -> 이웃 -> 파트너 -> 이웃... 
        while (true)
        {
            // 1. 현재 노드의 프리팹 반대쪽(파트너)으로 이동
            TunnelNode partner = current.partnerNode;

            // 2. 파트너와 연결된 다음 터널의 노드가 있는지 확인
            if (partner.neighborNode != null)
            {
                current = partner.neighborNode; // 다음 터널로 점프
            }
            else
            {
                return partner; // 더 이상 연결이 없으면 파트너가 최종 목적지
            }
        }
    }

    // 디버깅: 연결 상태를 씬 뷰에서 확인
    private void OnDrawGizmos()
    {
        Gizmos.color = isTop ? Color.cyan : Color.blue;
        Gizmos.DrawWireSphere(transform.position, 0.2f);

        if (neighborNode != null)
        {
            Gizmos.color = Color.red;
            Gizmos.DrawLine(transform.position, neighborNode.transform.position);
        }
    }
}