using System;
using Framework.Scripts.Runtime.Engine.Engine.Camera;
using Framework.Scripts.Runtime.Engine.Engine.Camera.CameraControl;
using MotionFramework;
using MotionFramework.Event;
using NaughtyAttributes;
using UnityEngine;

namespace Framework.Scripts.Runtime.Module.Module.Camera
{
    public class CameraManager : MonoBehaviour
    {
        private CameraRaycastComponent _raycastComponent;
        private CameraControlComponent _cameraControlComponent;


        [SerializeField] [Label("摄像头控制")] public bool showCamControl;
        [SerializeField] [Label("射线")] public bool showCamRay;

        [ShowIf("showCamControl")] [BoxGroup("参数")] [SerializeField] [Label("鼠标中间移动速度")]
        private float middleSpeed = 2;

        [ShowIf("showCamControl")] [MinMaxSlider(-90, 90)] [BoxGroup("参数")] [SerializeField] [Label("角度最大限制")]
        private Vector2 minMaxSlider;

        [ShowIf("showCamControl")] [BoxGroup("参数")] [SerializeField] [Label("滚轮灵敏度设置")]
        private int MouseWheelSensitivity = 1; //滚轮灵敏度设置

        [ShowIf("showCamControl")] [BoxGroup("参数")] [SerializeField] [Label("相机距离最小值")]
        private int MouseZoomMin = 10; //相机距离最小值

        [ShowIf("showCamControl")] [BoxGroup("参数")] [SerializeField] [Label("相机距离最大值")]
        private int MouseZoomMax = 9999; //相机距离最大值

        [ShowIf("showCamControl")] [BoxGroup("参数")] [SerializeField] [Label("旋转视角时相机x轴转速")]
        private float xSpeed = 250.0f; //旋转视角时相机x轴转速

        [ShowIf("showCamControl")] [BoxGroup("参数")] [SerializeField] [Label("旋转视角时相机y轴转速")]
        private float ySpeed = 120.0f; //旋转视角时相机y轴转速

        [ShowIf("showCamControl")] [BoxGroup("参数")] [SerializeField] [Label("相机和target之间的距离")]
        private float Distance = 20; //相机和target之间的距离,因为相机的Z轴总是指向target,也就是相机z轴方向上的距离

        [SerializeField] private Transform MainCam;
        [SerializeField] private Transform MainCamTarget;

        // 在编辑器中添加脚本时调用的方法
        private void OnValidate()
        {
            // 检查该方法是否在编辑器模式下被调用
            if (!Application.isPlaying)
            {
                if (UnityEngine.Camera.main != null) MainCam = UnityEngine.Camera.main.transform;
                if (MainCam.Find("MainTarget") == null)
                {
                   MainCamTarget= Instantiate(new GameObject(), MainCam).transform;
                   MainCamTarget.name = "MainTarget";
                }

                // 调用自定义方法  
                Debug.Log("asd ");
            }
        }


        void Awake()
        {
            // 为组件赋值,可以通过查找对象或者直接赋值的方式
            _raycastComponent = new CameraRaycastComponent();
            _cameraControlComponent = new CameraControlComponent();

            if (_raycastComponent == null || _cameraControlComponent == null)
            {
                Debug.LogError("缺少必要的组件");
            }
        }

        private void OnEnable()
        {
            _raycastComponent.OnRaycastHit += HandleRaycastHit;
        }

        private void Start()
        {
            _cameraControlComponent.Init(MainCam, MainCamTarget);
        }

        private void OnDisable()
        {
            _raycastComponent.OnRaycastHit -= HandleRaycastHit;
        }


        // 处理射线命中事件并打印物体名称
        void HandleRaycastHit(RaycastHit hit)
        {
            Debug.Log("射线检测到物体--->" + hit.collider.name);
        }

        void Update()
        {
            // 调用射线功能
            if (showCamRay)
            {
                if (Input.GetMouseButtonDown(0)) // 比如当按下鼠标左键时
                {
                    _raycastComponent?.Raycast();
                }
            }


            _cameraControlComponent.UpdateValue(minMaxSlider);
            // 调用镜头控制功能
            _cameraControlComponent?.ControlCamera();
        }
    }
}