using System;
using System.Threading.Tasks;

using UnityEngine;

using Debug = UnityEngine.Debug;


namespace AIRuntime.Runtime.Capabilities
{
    /// <summary>
    /// Logs capability execution time and result.
    /// </summary>
    public sealed class LoggingMiddleware :
        ICapabilityMiddleware
    {
        /// <summary>Routine execution logging is off by default to avoid duplicate Console traffic.</summary>
        public bool Verbose { get; set; }

        public async Task InvokeAsync(
            CapabilityContext context,
            CapabilityDelegate next)
        {
            if (Verbose) Debug.Log(
                $"[Capability] Executing '{context.Capability.Name}'");


            try
            {
                await next(
                    context);


                if (Verbose) Debug.Log(
                    $"[Capability] '{context.Capability.Name}' " +
                    $"completed in {(long)context.Duration.TotalMilliseconds} ms");
            }
            catch (OperationCanceledException)
            {
                if (Verbose) Debug.Log(
                    $"[Capability] '{context.Capability.Name}' " +
                    $"cancelled after {(long)context.Duration.TotalMilliseconds} ms");


                throw;
            }
        }
    }
}
