using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.IO;

namespace Addison_Wesley.Codebook.Utils
{
   public class FileUtils
   {
      /// <summary>
      /// Vyhledá všechny soubory, které odpovídají zadanému vzoru
      /// </summary>
      /// <param name="startDirectory">Cesta ke složce, která bude prohledávána</param>
      /// <param name="filePattern">Vzor pro hledání (např. *.txt)</param>
      /// <param name="recursive">udává, zda hledat i v podadresářích</param>
      /// <returns>Vrací ReadOnlyCollection typu FileInfo, jež obsahuje
      /// nalezené soubory</returns>
      public static ReadOnlyCollection<FileInfo> FindFiles(
         string startDirectory, string filePattern, bool recursive)
      {
         // Seznam
         List<FileInfo> fileList = new List<FileInfo>();

         // Volání rekurzivní soukromé metody
         findFiles(new DirectoryInfo(startDirectory), filePattern, recursive, fileList);

         // Vrátíme kolekci výsledků
         return new ReadOnlyCollection<FileInfo>(fileList);
      }

      /// <summary>
      /// Vyhledá všechny soubory, které odpovídají zadanému vzoru
      /// </summary>
      /// <param name="directory">Složka, v níž se bude hledat</param>
      /// <param name="filePattern">Vzor pro vyhledávání (např. *.txt)</param>
      /// <param name="recursive">udává, zda hledat v podadresářích</param>
      /// <param name="fileList">Odkaz na seznam typu List, jenž
      /// bude obsahuvat cesty k nalezeným souborům</param>
      private static void findFiles(DirectoryInfo directory,
         string filePattern, bool recursive, List<FileInfo> fileList)
      {
         if (filePattern != null && filePattern.Length > 0)
         {
            // Rozložení vzoru
            string[] filePatterns = filePattern.Split(';');

            // Projdeme všechny vzory a hledáme v předaném adresáři
            foreach (string partPattern in filePatterns)
            {
               foreach (FileInfo fileInfo in directory.GetFiles(partPattern))
               {
                  fileList.Add(fileInfo);
               }
            }
         }
         else
         {
            // Nepředán žádný vzor: projdeme všechny soubory
            foreach (FileInfo fileInfo in directory.GetFiles())
            {
               fileList.Add(fileInfo);
            }
         }

         if (recursive)
         {
            // Má-li se hledat rekurzivně:
            // Zavoláme tuto metodu pro všechny podadresáře
            foreach (DirectoryInfo subDirectory in directory.GetDirectories())
            {
               findFiles(subDirectory, filePattern, recursive, fileList);
            }
         }
      }
   }
}
