using System.IO;
using System.Text;
using System.Runtime.InteropServices;

namespace Addison_Wesley.Codebook.Utils
{
   public class FileUtils
   {
       /* Deklarace funkce PathRelativePathTo z API */
      [DllImport("shlwapi.dll", CharSet = CharSet.Auto)]
      static extern bool PathRelativePathTo(System.Text.StringBuilder pszPath,
         string pszFrom, uint dwAttrFrom, string pszTo, uint dwAttrTo);

      /// <summary>
      /// Získá relativní cestu na záklace ces ty absolutní
      /// </summary>
      /// <param name="absolutePath">Absolutní cesta</param>
      /// <param name="absolutePathIsDirectory">Udává, zda se v případě absolutní cesty jední o adresář (v opačném případě jde o soubor)</param>
      /// <param name="referencePath">Cesta, k níž se bude relativní cesta vztahovat</param>
      /// <param name="referencePathIsDirectory">Udává, zda se v případě vztažnécesty jedná o adresář (v opačném případě jde o soubor)</param>
      /// <returns>Vrací relativní cestu</returns>
      /// <exception cref="IOException">Vznikne, jestliže absolutní cesta nemá společná základ se vztažnou cestou</exception>
      public static string GetRelativePath(string absolutePath,
         bool absolutePathIsDirectory, string referencePath,
         bool referencePathIsDirectory)
      {
         // Normalizace zadaných cest pro případ, že
         // zadání obsahuje .. nebo .
         absolutePath = Path.GetFullPath(absolutePath);
         referencePath = Path.GetFullPath(referencePath);

         const uint FILE_ATTRIBUTE_DIRECTORY = 0x10;
         const int MAX_PATH = 260;

         // Volání PathRelativePathTo 
         StringBuilder relativePath = new StringBuilder(MAX_PATH);
         if (PathRelativePathTo(relativePath, referencePath,
            (referencePathIsDirectory ? FILE_ATTRIBUTE_DIRECTORY : 0),
            absolutePath,
            (absolutePathIsDirectory ? FILE_ATTRIBUTE_DIRECTORY : 0)))
         {
            return relativePath.ToString();
         }
         else
         {
            throw new IOException("Absolutní cesta (" +
               absolutePath + ") a vztažní cesta (" +
               referencePath + ") nemají společný základ");
         }
      }
   }
}
