using System;


namespace AIRuntime.Runtime.Providers
{
    /// <summary>
    /// Generic model-generation settings for one provider request.
    ///
    /// This class contains no agent-specific concepts and can be
    /// used by any AIRuntime execution path.
    /// </summary>
    public sealed class ProviderRequestOptions
    {
        public ProviderRequestOptions(
            double temperature,
            int maxTokens)
        {
            if (double.IsNaN(temperature) ||
                double.IsInfinity(temperature) ||
                temperature < 0)
            {
                throw new ArgumentOutOfRangeException(
                    nameof(temperature),
                    "Temperature must be a finite, non-negative value.");
            }


            if (maxTokens < 0)
            {
                throw new ArgumentOutOfRangeException(
                    nameof(maxTokens),
                    "Maximum tokens cannot be negative. Use zero to let the provider choose its native limit.");
            }


            Temperature =
                temperature;


            MaxTokens =
                maxTokens;
        }


        public double Temperature
        {
            get;
        }


        /// <summary>
        /// Provider output-token ceiling. Zero leaves the ceiling unspecified.
        /// </summary>
        public int MaxTokens
        {
            get;
        }


        public static ProviderRequestOptions Default
        {
            get
            {
                return new ProviderRequestOptions(
                    0.2,
                    0);
            }
        }
    }
}
