using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace TweetTest.Configuration{
    [TestClass]
    public class TestUserConfig : TestIO{ /* TODO
        private static void WriteTestConfig(string file, bool withBackup){
            UserConfig cfg = UserConfig.Load(file);
            cfg.ZoomLevel = 123;
            cfg.Save();

            if (withBackup){
                cfg.Save();
            }
        }

        [Pure] // used to display a warning when not using the return value
        private static bool CheckTestConfig(string file){
            return UserConfig.Load(file).ZoomLevel == 123;
        }

        [TestMethod]
        public void TestMissing(){
            Assert.IsNotNull(UserConfig.Load("missing"));
            Assert.IsFalse(File.Exists("missing"));
        }

        [TestMethod]
        public void TestBasic(){
            Assert.IsFalse(CheckTestConfig("basic"));
            WriteTestConfig("basic", false);
            Assert.IsTrue(CheckTestConfig("basic"));
        }

        [TestMethod]
        public void TestBackupName(){
            Assert.AreEqual("name.bak", UserConfig.GetBackupFile("name"));
            Assert.AreEqual("name.cfg.bak", UserConfig.GetBackupFile("name.cfg"));
            Assert.AreEqual("name.bak.bak", UserConfig.GetBackupFile("name.bak"));
        }

        [TestMethod]
        public void TestBackupCreate(){
            WriteTestConfig("nobackup", false);
            Assert.IsTrue(File.Exists("nobackup"));
            Assert.IsFalse(File.Exists(UserConfig.GetBackupFile("nobackup")));

            WriteTestConfig("withbackup", true);
            Assert.IsTrue(File.Exists("withbackup"));
            Assert.IsTrue(File.Exists(UserConfig.GetBackupFile("withbackup")));
        }

        [TestMethod]
        public void TestBackupRestore(){
            WriteTestConfig("gone", true);
            Assert.IsTrue(File.Exists("gone"));
            Assert.IsTrue(File.Exists(UserConfig.GetBackupFile("gone")));
            File.Delete("gone");
            Assert.IsTrue(CheckTestConfig("gone"));
            
            WriteTestConfig("corrupted", true);
            Assert.IsTrue(File.Exists("corrupted"));
            Assert.IsTrue(File.Exists(UserConfig.GetBackupFile("corrupted")));
            File.WriteAllText("corrupted", "oh no corrupt");
            Assert.IsTrue(CheckTestConfig("corrupted"));
        }

        [TestMethod]
        public void TestReload(){
            UserConfig cfg = UserConfig.Load("reloaded");
            cfg.ZoomLevel = 123;
            cfg.Save();

            cfg.ZoomLevel = 200;
            cfg.Reload();
            Assert.AreEqual(123, cfg.ZoomLevel);
        }

        [TestMethod]
        public void TestReset(){
            UserConfig cfg = UserConfig.Load("reset");
            cfg.ZoomLevel = 123;
            cfg.Save();
            
            File.Delete("reset");
            cfg.Reload();
            Assert.AreEqual(100, cfg.ZoomLevel);
            Assert.IsTrue(File.Exists("reset"));
        }

        [TestMethod]
        public void TestEventsNoTrigger(){
            void Fail(object sender, EventArgs args) => Assert.Fail();
            
            UserConfig cfg = UserConfig.Load("events");
            cfg.MuteNotifications = true;
            cfg.TrayBehavior = TrayIcon.Behavior.Combined;
            cfg.ZoomLevel = 99;

            cfg.MuteToggled += Fail;
            cfg.TrayBehaviorChanged += Fail;
            cfg.ZoomLevelChanged += Fail;

            cfg.MuteNotifications = true;
            cfg.TrayBehavior = TrayIcon.Behavior.Combined;
            cfg.ZoomLevel = 99;
        }

        [TestMethod]
        public void TestEventsTrigger(){
            int triggers = 0;
            void Trigger(object sender, EventArgs args) => ++triggers;
            
            UserConfig cfg = UserConfig.Load("events");
            cfg.MuteNotifications = false;
            cfg.TrayBehavior = TrayIcon.Behavior.Disabled;
            cfg.ZoomLevel = 100;

            cfg.MuteToggled += Trigger;
            cfg.TrayBehaviorChanged += Trigger;
            cfg.ZoomLevelChanged += Trigger;

            cfg.MuteNotifications = true;
            cfg.TrayBehavior = TrayIcon.Behavior.Combined;
            cfg.ZoomLevel = 99;

            cfg.MuteNotifications = false;
            cfg.TrayBehavior = TrayIcon.Behavior.Disabled;
            cfg.ZoomLevel = 100;

            Assert.AreEqual(6, triggers);
        }*/
    }
}