#nullable enable
using System;

namespace IGP.UnitySDK
{
    internal static class IGPHostSessionEnvironment
    {
        internal const string AppIdEnvironmentVariable = "INDIEGP_APP_ID";
        internal const string LegacyAppIdEnvironmentVariable = "IGP_APP_ID";

        internal static bool TryResolveAppId(
            int configuredAppId,
            int? launchAppId,
            out int appId,
            Func<string, string?>? environmentReader = null)
        {
            if (configuredAppId > 0)
            {
                appId = configuredAppId;
                return true;
            }

            if (launchAppId.HasValue && launchAppId.Value > 0)
            {
                appId = launchAppId.Value;
                return true;
            }

            if (TryParsePositiveInt(ReadEnvironmentVariable(AppIdEnvironmentVariable, environmentReader), out appId) ||
                TryParsePositiveInt(ReadEnvironmentVariable(LegacyAppIdEnvironmentVariable, environmentReader), out appId))
            {
                return true;
            }

            appId = 0;
            return false;
        }

        private static string? ReadEnvironmentVariable(
            string name,
            Func<string, string?>? environmentReader)
        {
            return environmentReader != null
                ? environmentReader(name)
                : Environment.GetEnvironmentVariable(name);
        }

        private static bool TryParsePositiveInt(string? value, out int result)
        {
            if (int.TryParse(value, out result) && result > 0)
            {
                return true;
            }

            result = 0;
            return false;
        }
    }
}
