using View_by_Distance.Shared.Models;

namespace View_by_Distance.Drag_Drop;

static class Program
{
    /// <summary>
    ///  The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
        ApplicationConfiguration.Initialize();
        Application.Run(new DragDropSearch());
    }

    private static Item[] GetFilterItems(Models.Configuration configuration, Container container)
    {
        List<Item> results = new();
        foreach (Item item in container.Items)
        {
            if (item.ImageFileHolder is not null
                && item.IsValidImageFormatExtension
                && !configuration.IgnoreExtensions.Contains(item.ImageFileHolder.ExtensionLowered))
                results.Add(item);
        }
        return results.ToArray();
    }

    private static bool IsIgnoreRelativePath(Models.Configuration configuration, string directory)
    {
        bool result = false;
        string? checkDirectory = Path.GetFullPath(directory);
        for (int i = 0; i < int.MaxValue; i++)
        {
            if (configuration.IgnoreRelativePaths.Contains(Path.GetFileName(checkDirectory)))
            {
                result = true;
                break;
            }
            checkDirectory = Path.GetDirectoryName(checkDirectory);
            if (string.IsNullOrEmpty(checkDirectory) || checkDirectory == configuration.PropertyConfiguration.RootDirectory)
                break;
        }
        return result;
    }

    public static List<Item> GetItemCollection(Models.Configuration configuration, Container[] containers)
    {
        List<Item> results = new();
        Item[] filteredItems;
        foreach (Container container in containers)
        {
            if (!container.Items.Any())
                continue;
            if (configuration.IgnoreRelativePaths.Any(l => container.SourceDirectory.Contains(l)) && IsIgnoreRelativePath(configuration, container.SourceDirectory))
                continue;
            filteredItems = GetFilterItems(configuration, container);
            if (!filteredItems.Any())
                continue;
            foreach (Item item in filteredItems)
                results.Add(item);
        }
        return results;
    }

}