using Core;
using UnityEngine;
using Script.Gameplay.Interface;
using Script.Gameplay.Input;
using System;
using Script.Gameplay.Global;

namespace Script.Gameplay.Player
{
    public class PlayerEditController : MonoBehaviour
    {
        [SerializeField] private FirstPersonRaycaster raycaster; // 新增：第一人称射线检测器
        public bool IsEnableEditing = true; // 是否启用编辑功能
        private bool isEditing = false; // 当前是否处于编辑状态
        public event Action<IEditable> OnBeginEditTarget;
        public event Action<IEditable> OnEndEditTarget;

        private IEditable currentTarget; // 射线命中的当前可编辑对象（用于按键交互）
        private IEditable previousGazedTarget; // 上一次注视的对象（用于注视进入/离开事件）

        private InputManager inputManager;

        private TimePauseManager timePauseManager;
        void Start()
        {
            inputManager = InputManager.Instance;
            inputManager.Input.Player.Edit.performed += context => EditTarget();
            timePauseManager = TimePauseManager.Instance;
            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()
        {
            DetectInteractable();
        }

        void DetectInteractable()
        {
            if (raycaster == null) return;
            GameObject lookAtObj = raycaster.CurrentLookAtObject;
            IEditable hitEditable = lookAtObj != null ? lookAtObj.GetComponent<IEditable>() : null;

            // 如果命中对象与之前注视的不一样，触发进入/离开事件
            if (hitEditable != previousGazedTarget)
            {
                if (previousGazedTarget != null)
                {
                    previousGazedTarget.OnGazeExit(this);
                }

                if (hitEditable != null)
                {
                    hitEditable.OnGazeEnter(this);
                }

                previousGazedTarget = hitEditable;
            }

            currentTarget = hitEditable;
        }

        public IEditable GetCurrentTarget()
        {
            return currentTarget;
        }

        private void EditTarget()
        {
            if (isEditing)
            {
                isEditing = false;
                OnEndEditTarget?.Invoke(currentTarget);
                inputManager.SetCursorState(false, CursorLockMode.Locked);
                inputManager.SetInputForLook(true);
                inputManager.SetInputForMove(true);
                if (timePauseManager != null)
                {
                    timePauseManager.SetPaused(false);
                }
            }
            else
            {
                if (currentTarget == null) return;
                if (!IsEnableEditing) return;
                isEditing = true;
                OnBeginEditTarget?.Invoke(currentTarget);
                inputManager.SetCursorState(true, CursorLockMode.Confined);
                inputManager.SetInputForLook(false);
                inputManager.SetInputForMove(false);
                if (timePauseManager != null)
                {
                    timePauseManager.SetPaused(true);
                }
            }
        }

        void OnDrawGizmos()
        {
            // 交由 FirstPersonRaycaster 绘制射线
        }
    }
}