using EonaCat.LogStack.Core;
using System;
using System.Runtime.CompilerServices;
using System.Threading;

namespace EonaCat.LogStack.EonaCatLogStackCore.Policies
{
    // This file is part of the EonaCat project(s) which is released under the Apache License.
    // See the LICENSE file or go to https://EonaCat.com/License for full license details.

    /// <summary>Log only 1-in-N events, optionally filtered by a predicate.</summary>
    public sealed class SamplingPolicy
    {
        private long _counter;

        /// <summary>Keep 1 out of every <see cref="Rate"/> events.</summary>
        public int Rate { get; set; }

        /// <summary>Optional predicate. Null = apply to all events.</summary>
        public Func<LogEvent, bool> Predicate { get; set; }

        public SamplingPolicy()
        {
            Rate = 10;
        }

        [MethodImpl(MethodImplOptions.AggressiveInlining)]
        public bool ShouldLog(LogEvent e)
        {
            if (Predicate != null && !Predicate(e))
            {
                // predicate not matched → always log
                return true; 
            }

            return Interlocked.Increment(ref _counter) % Rate == 0;
        }
    }
}