using System.Linq;
using Core;
using UnityEngine;
using Script.Gameplay.Connect;
using Script.Gameplay.Input;
using System;

namespace Gameplay.Player
{
    public class PlayerConnectController : MonoBehaviour
    {
        public bool IsEnableConnecting = true; // 是否启用连接功能
        [SerializeField] private FirstPersonRaycaster raycaster; // 第一人称射线检测器

        private IConnectable currentTarget; // 当前注视的可连接对象
        private IConnectable previousGazedTarget; // 上一次注视的 IConnectable（用于触发进入/离开）
        private InputManager inputManager;

        private IConnectable outTarget;
        private IConnectable inputTarget;
        public event Action<IConnectable> OnSetOutputTarget;
        public event Action<IConnectable> OnSetInputTarget;

        void Start()
        {
            inputManager = InputManager.Instance;
            inputManager.Input.Player.SetOutput.performed += ctx => SetOutTarget(currentTarget);
            inputManager.Input.Player.SetInput.performed += ctx => SetInputTarget(currentTarget);
            inputManager.Input.Player.Connect.performed += ctx => CreateConnection();

            if (raycaster == null)
                raycaster = GetComponent<FirstPersonRaycaster>() ?? GetComponentInChildren<FirstPersonRaycaster>();
            if (raycaster == null)
                raycaster = FindObjectOfType<FirstPersonRaycaster>();
            if (raycaster == null)
                Debug.LogWarning("FirstPersonRaycaster not found! Please assign or add it to the player.");

            ControllerLocator.Instance.Register(this);
        }

        void Update()
        {
            DetectConnectable();
        }

        void DetectConnectable()
        {
            if (raycaster == null) return;

            GameObject lookAtObj = raycaster.CurrentLookAtObject;
            IConnectable hitConnectable = lookAtObj != null ? lookAtObj.GetComponent<IConnectable>() : null;

            // 注视对象变化时触发进入/离开（使用接口方法）
            if (hitConnectable != previousGazedTarget)
            {
                if (previousGazedTarget != null)
                {
                    previousGazedTarget.OnGazeExit();
                }

                if (hitConnectable != null)
                {
                    hitConnectable.OnGazeEnter();
                }

                previousGazedTarget = hitConnectable;
            }

            currentTarget = hitConnectable;
        }


        public IConnectable GetCurrentTarget()
        {
            return currentTarget;
        }

        public void SetOutTarget(IConnectable target)
        {
            if (target == null) return;
            if(!IsEnableConnecting) return;
            if (!target.IsConnectedOutput)
            {
                outTarget = target;
                OnSetOutputTarget?.Invoke(outTarget);
            }
        }

        public void SetInputTarget(IConnectable target)
        {
            if (target == null) return;
            if(!IsEnableConnecting) return;
            if (!target.IsConnectedInput)
            {
                inputTarget = currentTarget;
                OnSetInputTarget?.Invoke(inputTarget);
            }
        }

        private void CreateConnection()
        {
            if(!IsEnableConnecting) return;
            if (outTarget != null && inputTarget != null && outTarget != inputTarget)
            {
                ConnectionLine connectionLine = ConnectionLineManager.Instance.GenerateConnectionLine(outTarget, inputTarget);
                // 重置信号目标
                outTarget = null;
                inputTarget = null;
            }
            else
            {
                Debug.Log("Cannot create connection: invalid targets.");
            }
        }
        
        void OnDrawGizmos()
        {
            // 射线可视化交由 FirstPersonRaycaster 处理
        }
    }
}