using System;
using System.Collections.Generic;
using System.IO;
using FluentAssertions;
using Moq;
using NUnit.Framework;
using NzbDrone.Api.Directories;
using NzbDrone.Common;
using NzbDrone.Common.Disk;
using NzbDrone.Test.Common;

namespace NzbDrone.Api.Test
{
    [TestFixture]
    public class DirectoryLookupServiceFixture : TestBase<DirectoryLookupService>
    {
        private const string RECYCLING_BIN = "$Recycle.Bin";
        private const string SYSTEM_VOLUME_INFORMATION = "System Volume Information";
        private List<String> _folders;

        [SetUp]
        public void Setup()
        {
            _folders = new List<String>
            {
                RECYCLING_BIN,
                "Chocolatey",
                "Documents and Settings",
                "Dropbox",
                "Intel",
                "PerfLogs",
                "Program Files",
                "Program Files (x86)",
                "ProgramData",
                SYSTEM_VOLUME_INFORMATION,
                "Test",
                "Users",
                "Windows"
            };

        }

        private void SetupFolders(string root)
        {
            _folders.ForEach(e =>
            {
                e = Path.Combine(root, e);
            });
        }

        [Test]
        public void should_not_contain_recycling_bin_for_root_of_drive()
        {
            string root = @"C:\".AsOsAgnostic();
            SetupFolders(root);

            Mocker.GetMock<IDiskProvider>()
                .Setup(s => s.GetDirectories(It.IsAny<String>()))
                .Returns(_folders.ToArray());

            Subject.LookupSubDirectories(root).Should().NotContain(Path.Combine(root, RECYCLING_BIN));
        }

        [Test]
        public void should_not_contain_system_volume_information()
        {
            string root = @"C:\".AsOsAgnostic();
            SetupFolders(root);

            Mocker.GetMock<IDiskProvider>()
                .Setup(s => s.GetDirectories(It.IsAny<String>()))
                .Returns(_folders.ToArray());

            Subject.LookupSubDirectories(root).Should().NotContain(Path.Combine(root, SYSTEM_VOLUME_INFORMATION));
        }

        [Test]
        public void should_not_contain_recycling_bin_or_system_volume_information_for_root_of_drive()
        {
            string root = @"C:\";
            SetupFolders(root);

            Mocker.GetMock<IDiskProvider>()
                .Setup(s => s.GetDirectories(It.IsAny<String>()))
                .Returns(_folders.ToArray());

            var result = Subject.LookupSubDirectories(root);

            result.Should().HaveCount(_folders.Count - 2);
            result.Should().NotContain(RECYCLING_BIN);
            result.Should().NotContain(SYSTEM_VOLUME_INFORMATION);
        }
    }
}
