using System;
using System.IO;

namespace Addison_Wesley.Codebook.Filesystem
{
   public class FileUtils
   {
      /// <summary>
      /// Výčet pro různé druhy porovnávání
      /// </summary>
      public enum FileCompareMethod
      {
         Date,
         Content,
         DateAndContent
      }

      /// <summary>
      /// Porovnání dvou souborů
      /// </summary>
      /// <param name="filePath1">Cesta k prvnímu souboru</param>
      /// <param name="filePath2">Cesta k druhému souboru</param>
      /// <param name="compareMethod">Metoda porovnání</param>
      /// <returns>Vrátí true, jsou-li si soubory podle zadané
      /// metody porovnání rovny</returns>
      public static bool CompareFiles(string filePath1, string filePath2,
         FileCompareMethod compareMethod)
      {
         // Jsou-li jména souborů (včetně cesty) totožná, vrátí true 
         if (filePath1 == filePath2)
         {
            return true;
         }

         // Pomocí objektů typu FileInfoporovnáme datum poslední změny, jestliže to
         // je požadováno. datum vytoření se ale neber v úvahu,
         // neoť to se při kopírování nastavuje na aktuální
         if (compareMethod == FileCompareMethod.DateAndContent ||
            compareMethod == FileCompareMethod.Date)
         {
            FileInfo fi1 = new FileInfo(filePath1);
            FileInfo fi2 = new FileInfo(filePath2);
            if (fi1.LastWriteTime != fi2.LastWriteTime)
               return false;
         }

         // porovnání obsahu, je-li to požadováno
         if (compareMethod == FileCompareMethod.DateAndContent ||
            compareMethod == FileCompareMethod.Content)
         {
            // Vytvoříme objekty typu FileStream prpo porovnávání
            FileStream fs1 = new FileStream(filePath1, FileMode.Open);
            FileStream fs2 = new FileStream(filePath2, FileMode.Open);

            // Porovnáme velikost souborů
            if (fs1.Length != fs2.Length)
               return false;

            // porovnáme soubory bajt po bajtu
            int fileByte1, fileByte2;
            do
            {
               fileByte1 = fs1.ReadByte();
               fileByte2 = fs2.ReadByte();
            } while (fileByte1 == fileByte2 && fileByte1 != -1);

            // Uzavřeme proudy
            fs1.Close();
            fs2.Close();

            // Vrátíme výsledek: Soubory jsou si rovny, jsou-li si rovny
            // na tomto místě poslední načtené bajty
            return (fileByte1 == fileByte2);
         }

         return true;
      }
   }
}
