using System;
using System.Diagnostics.CodeAnalysis;
#if !DEBUG
using System.Linq;
using System.Runtime.InteropServices;
#endif

namespace HitmanPatcher
{
    internal static class Cli
    {
#if !DEBUG
        // in any mode outside debug (which is probably what it's being run in while in IDE),
        // we attach the console to the parent process

        [DllImport("kernel32.dll", SetLastError = true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        private static extern bool AttachConsole(int dwProcessId);

        private const int ATTACH_PARENT_PROCESS = -1;

        internal static void EnsureConsole(string[] args)
        {
            if (args.Any(arg => arg.Contains("-")))
            {
                AttachConsole(ATTACH_PARENT_PROCESS);
            }
        }
#endif

        internal class CliOptions
        {
            internal bool Headless { get; set; }

            internal string Domain { get; set; }

            internal bool UseHttp { get; set; }

            internal bool OptionalDynRes { get; set; }

            [SuppressMessage("ReSharper", "LocalizableElement")]
            internal static CliOptions FromArguments(string[] args)
            {
                var options = new CliOptions
                {
                    Domain = "127.0.0.1",
                    Headless = false,
                    OptionalDynRes = true,
                    UseHttp = true
                };

                var i = 0;

                var ensureNext = new Action<int, string>((index, argName) =>
                {
                    if (!(args.Length > index))
                    {
                        throw new ArgumentException($"Expected next value for argument {argName} but didn't find one!");
                    }
                });

                foreach (var arg in args)
                {
                    switch (arg)
                    {
                        case "--headless":
                            options.Headless = true;
                            break;
                        case "--optional-dynamic-resources":
                            options.OptionalDynRes = true;
                            break;
                        case "--domain":
                            ensureNext(i, arg);
                            options.Domain = args[i + 1];
                            break;
                        case "--use-http":
                            options.UseHttp = true;
                            break;
                        case "--help":
                            Console.WriteLine(CliLocale.HelpHeader);
                            Console.WriteLine("");
                            Console.WriteLine("Options:");
                            Console.WriteLine($"  --headless : {CliLocale.HeadlessDescription}");
                            Console.WriteLine($"  --optional-dynamic-resources : {CliLocale.OptionalDynResDescription}");
                            Console.WriteLine($"  --domain <url> : {CliLocale.DomainDescription}");
                            Console.WriteLine($"  --use-http : {CliLocale.UseHttpDescription}");
                            Environment.Exit(0);
                            break;
                    }
                    
                    i++;
                }

                return options;
            }
        }

        internal class ConsoleLogger : ILoggingProvider
        {
            public void log(string msg)
            {
                Console.WriteLine(msg);
            }
        }
    }
}