using Cysharp.Threading.Tasks;

namespace UVC.Event
{
    /// <summary>
    /// 비동기 이벤트 처리를 위한 제네릭 델리게이트
    /// UniTask를 반환하는 이벤트 핸들러를 정의하여 비동기 작업을 이벤트 기반으로 처리할 수 있게 함
    /// </summary>
    /// <typeparam name="TEventArgs">이벤트 데이터를 포함하는 제네릭 타입 매개변수</typeparam>
    /// <param name="sender">이벤트를 발생시킨 객체</param>
    /// <param name="e">이벤트와 관련된 데이터</param>
    /// <returns>비동기 작업을 나타내는 UniTask</returns>
    /// <example>
    /// <code>
    /// // 이벤트 선언 예시
    /// public class NetworkManager
    /// {
    ///     // UniTaskEventHandler 타입의 이벤트 선언
    ///     public event UniTaskEventHandler<DataReceivedEventArgs> OnDataReceived;
    ///     
    ///     // 이벤트 발생 메소드
    ///     public async UniTask RaiseDataReceivedEvent(DataReceivedEventArgs args)
    ///     {
    ///         if (OnDataReceived != null)
    ///         {
    ///             // 모든 등록된 핸들러를 순차적으로 실행
    ///             foreach (var handler in OnDataReceived.GetInvocationList())
    ///             {
    ///                 await ((UniTaskEventHandler<DataReceivedEventArgs>)handler).Invoke(this, args);
    ///             }
    ///         }
    ///     }
    /// }
    /// 
    /// // 이벤트 구독 예시
    /// public class DataProcessor
    /// {
    ///     public void Initialize(NetworkManager networkManager)
    ///     {
    ///         networkManager.OnDataReceived += HandleDataReceived;
    ///     }
    ///     
    ///     private async UniTask HandleDataReceived(object sender, DataReceivedEventArgs e)
    ///     {
    ///         // 비동기 이벤트 처리 로직
    ///         await ProcessDataAsync(e.Data);
    ///     }
    ///     
    ///     private async UniTask ProcessDataAsync(byte[] data)
    ///     {
    ///         await UniTask.Delay(100); // 예시 비동기 작업
    ///         // 데이터 처리 로직
    ///     }
    /// }
    /// </code>
    /// </example>
    public delegate UniTask UniTaskEventHandler<TEventArgs>(object sender, TEventArgs e);
}
