using SharedLibraryCore;
using SharedLibraryCore.Interfaces;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;

namespace IW4MAdmin.Application.Migration
{
    /// <summary>
    /// helps facilitate the migration of configs from one version and or location
    /// to another
    /// </summary>
    class ConfigurationMigration
    {
        /// <summary>
        /// ensures required directories are created
        /// </summary>
        public static void CheckDirectories()
        {
            if (!Directory.Exists(Path.Join(Utilities.OperatingDirectory, "Plugins")))
            {
                Directory.CreateDirectory(Path.Join(Utilities.OperatingDirectory, "Plugins"));
            }

            if (!Directory.Exists(Path.Join(Utilities.OperatingDirectory, "Database")))
            {
                Directory.CreateDirectory(Path.Join(Utilities.OperatingDirectory, "Database"));
            }

            if (!Directory.Exists(Path.Join(Utilities.OperatingDirectory, "Log")))
            {
                Directory.CreateDirectory(Path.Join(Utilities.OperatingDirectory, "Log"));
            }
        }

        /// <summary>
        /// moves existing configs from the root folder into a configs folder
        /// </summary>
        public static void MoveConfigFolder10518(ILogger log)
        {
            string currentDirectory = Utilities.OperatingDirectory;

            // we don't want to do this for migrations or tests where the 
            // property isn't initialized or it's wrong
            if (currentDirectory != null)
            {
                string configDirectory = Path.Join(currentDirectory, "Configuration");

                if (!Directory.Exists(configDirectory))
                {
                    log?.WriteDebug($"Creating directory for configs {configDirectory}");
                    Directory.CreateDirectory(configDirectory);
                }

                var configurationFiles = Directory.EnumerateFiles(currentDirectory, "*.json")
                    .Select(f => f.Split(Path.DirectorySeparatorChar).Last())
                    .Where(f => f.Count(c => c == '.') == 1);

                foreach (var configFile in configurationFiles)
                {
                    log?.WriteDebug($"Moving config file {configFile}");
                    string destinationPath = Path.Join("Configuration", configFile);
                    if (!File.Exists(destinationPath))
                    {
                        File.Move(configFile, destinationPath);
                    }
                }

                if (!File.Exists(Path.Join("Database", "Database.db")) &&
                    File.Exists("Database.db"))
                {
                    log?.WriteDebug("Moving database file");
                    File.Move("Database.db", Path.Join("Database", "Database.db"));
                }
            }
        }

        public static void ModifyLogPath020919(SharedLibraryCore.Configuration.ServerConfiguration config)
        {
            if (config.ManualLogPath.IsRemoteLog())
            {
                config.GameLogServerUrl = new Uri(config.ManualLogPath);
                config.ManualLogPath = null;
            }
        }
    }
}