using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;

namespace Remotely.Shared.Utilities
{
    public static class ConsoleHelper
    {
        public static string GetSelection(string promptMessage, params string[] options)
        {
            Console.ForegroundColor = ConsoleColor.Cyan;
            Console.WriteLine($"{promptMessage.Trim()}");
            Console.ForegroundColor = ConsoleColor.Gray;

            Console.WriteLine();

            for (var i = 0; i < options.Length; i++)
            {
                Console.WriteLine($"    [{i}] - {options[i]}");
            }

            Console.WriteLine();

            Console.ForegroundColor = ConsoleColor.Cyan;
            Console.Write("Enter Response: ");
            Console.ForegroundColor = ConsoleColor.Gray;

            return Console.ReadLine().Trim();
        }

        public static string ReadLine(string prompt, ConsoleColor promptColor = ConsoleColor.Cyan, string subprompt = "")
        {
            Console.ForegroundColor = promptColor;
            Console.WriteLine($"{prompt.Trim()}");
            Console.ForegroundColor = ConsoleColor.Gray;

            if (!string.IsNullOrWhiteSpace(subprompt))
            {
                Console.WriteLine(subprompt);
            }

            Console.WriteLine();

            Console.ForegroundColor = promptColor;
            Console.Write("Enter Response: ");
            Console.ForegroundColor = ConsoleColor.Gray;
            var response = Console.ReadLine();
            Console.WriteLine();

            return response;
        }

        public static bool TryParseBoolLike(string value, out bool result)
        {
            result = false;

            if (string.IsNullOrWhiteSpace(value))
            {
                return false;
            }

            if (bool.TryParse(value.Trim(), out result))
            {
                return true;
            }

            if (value.Contains("yes", StringComparison.OrdinalIgnoreCase))
            {
                result = true;
                return true;
            }

            if (value.Contains("no", StringComparison.OrdinalIgnoreCase))
            {
                result = false;
                return true;
            }

            return false;
        }
        public static void WriteError(string message, int extraEmptyLines = 0, [CallerMemberName] string callerName = "")
        {
            WriteLine(message, extraEmptyLines, ConsoleColor.Red, callerName);
        }

        public static void WriteLine(string message, int extraEmptyLines = 0, ConsoleColor foreground = ConsoleColor.Gray, string callerName = "")
        {
            if (!string.IsNullOrWhiteSpace(callerName))
            {
                message = $"[{callerName}] {message}";
            }
            Console.ForegroundColor = foreground;
            for (var i = 0; i < message.Length;)
            {
                var lineCount = 0;
                var trimLine = i > 0;

                var line = new string(message.Skip(i).TakeWhile(x => {
                    i++;
                    return lineCount++ < 60 || !char.IsWhiteSpace(x);
                }).ToArray());

                if (trimLine)
                {
                    line = line.Trim();
                }

                Console.WriteLine(line);
            }
            Console.ForegroundColor = ConsoleColor.Gray;
            Console.WriteLine();
            for (var i = 0; i < extraEmptyLines; i++)
            {
                Console.WriteLine();
            }
        }
    }
}
