using System;
using System.IO;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Wabbajack.Common;
using Wabbajack.Lib;

namespace Wabbajack.Test
{
    public abstract class AVortexCompilerTest
    {
        public TestContext TestContext { get; set; }
        protected TestUtils utils { get; set; }


        [TestInitialize]
        public void TestInitialize()
        {
            Consts.TestMode = true;

            utils = new TestUtils
            {
                Game = Game.DarkestDungeon
            };

            Utils.LogMessages.Subscribe(f => TestContext.WriteLine(f));
        }

        [TestCleanup]
        public void TestCleanup()
        {
            utils.Dispose();
        }

        protected VortexCompiler ConfigureAndRunCompiler()
        {
            var vortexCompiler = MakeCompiler();
            vortexCompiler.DownloadsFolder = utils.DownloadsFolder;
            vortexCompiler.StagingFolder = utils.InstallFolder;
            Directory.CreateDirectory(utils.InstallFolder);
            Assert.IsTrue(vortexCompiler.Begin().Result);
            return vortexCompiler;
        }

        protected VortexCompiler MakeCompiler()
        {
            return new VortexCompiler(
                game: utils.Game,
                gamePath: utils.GameFolder,
                vortexFolder: VortexCompiler.TypicalVortexFolder(),
                downloadsFolder: VortexCompiler.RetrieveDownloadLocation(utils.Game),
                stagingFolder: VortexCompiler.RetrieveStagingLocation(utils.Game));
        }

        protected ModList CompileAndInstall()
        {
            var vortexCompiler = ConfigureAndRunCompiler();
            Install(vortexCompiler);
            return vortexCompiler.ModList;
        }

        protected void Install(VortexCompiler vortexCompiler)
        {
            var modList = AInstaller.LoadFromFile(vortexCompiler.ModListOutputFile);
            var installer = new MO2Installer(vortexCompiler.ModListOutputFile, modList, utils.InstallFolder)
            {
                DownloadFolder = utils.DownloadsFolder,
                GameFolder = utils.GameFolder,
            };
            installer.Begin().Wait();
        }
    }
}
