using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Script.Gameplay.Connect;
using Script.Gameplay.Interface;

namespace Script.Gameplay.Facility
{
    public class EmitterController : MonoBehaviour, IEditableComponent, IConnectable
    {
        [Header("发射器设置")]
        [SerializeField] private GameObject prefabToEmit;
        [SerializeField] private Transform emitPoint;
        [SerializeField] private Vector3 emitDirection = Vector3.forward;
        [SerializeField] private float emitForce = 10f;
        [SerializeField] private float emitInterval = 1f;
        [Header("生成对象销毁时间")]
        [SerializeField] private float destroyDelay = 5f; // 生成对象多少秒后销毁

        private Coroutine emitCoroutine;

        // 不可交互
        // 可编辑
        public bool IsEditableActive { get; set; } = true;
        public string ComponentName { get; set; } = "Emitter";
        public LockLevel LockLevel => LockLevel.Red;

        // 可连线
        public List<ConnectionLine> ConnectionLines { get; set; } = new List<ConnectionLine>();
        public void OnGazeEnter() { }
        public void OnGazeExit() { }
        public Vector3 GetPosition() => transform.position;
        public GameObject GetGameObject() => gameObject;
        public string GetConnectableName() => gameObject.name;

        // 接收信号
        public void SignalActive(bool active, GameObject sender)
        {
            if(!IsEditableActive) return;
            if (active)
            {
                if (emitCoroutine == null)
                    emitCoroutine = StartCoroutine(EmitRoutine());
            }
            else
            {
                if (emitCoroutine != null)
                {
                    StopCoroutine(emitCoroutine);
                    emitCoroutine = null;
                }
            }
        }

        private IEnumerator EmitRoutine()
        {
            while (true)
            {
                Emit();
                yield return new WaitForSeconds(emitInterval);
            }
        }

        private void Emit()
        {
            if (prefabToEmit == null || emitPoint == null) return;
            var obj = Instantiate(prefabToEmit, emitPoint.position, emitPoint.rotation);
            var rb = obj.GetComponent<Rigidbody>();
            if (rb != null)
            {
                rb.AddForce(emitPoint.TransformDirection(emitDirection.normalized) * emitForce, ForceMode.Impulse);
            }
            // 添加销毁逻辑
            Destroy(obj, destroyDelay);
        }
    }
}
