using System;
using System.Collections.Generic;
using System.Text;
using System.IO;

namespace Wayne.Lib.IO
{
    internal class SafeFileInfo
    {
        #region Const fields

        public const string TmpFileExtension = "wayneTemp";
        public const string OldFileExtension = "wayneOld";

        #endregion

        #region Fields

        string originalFileName;

        #endregion

        #region Construction

        private SafeFileInfo(string originalFileName)
        {
            this.originalFileName = originalFileName;
        }

        #endregion

        #region Properties

        public string TempFileName
        {
            get
            {
                return originalFileName + "." + TmpFileExtension;
            }
        }

        public bool TempFileExists
        {
            get
            {
                return File.Exists(TempFileName);
            }
        }

        public string OldFileName
        {
            get
            {
                return originalFileName + "." + OldFileExtension;
            }
        }

        public bool OldFileExist
        {
            get
            {
                return File.Exists(OldFileName);
            }
        }

        public string OriginalFileName
        {
            get { return originalFileName; }
        }

        public bool OriginalFileExists
        {
            get { return File.Exists(originalFileName); }
        }
        #endregion

        #region Static methods

        internal static SafeFileInfo FromOriginalFileName(string originalFileNameAndPath)
        {
            return new SafeFileInfo(originalFileNameAndPath);
        }

        internal static SafeFileInfo FromTempFileName(string tempFileName)
        {
            return new SafeFileInfo(Path.GetFileNameWithoutExtension(tempFileName));
        }

        internal static SafeFileInfo FromOldFileName(string originalFileName)
        {
            return new SafeFileInfo(Path.GetFileNameWithoutExtension(originalFileName));
        }

        public static SafeFileInfo[] GetFiles(IFileSupport fileSupport, string folderPath, string pattern)
        {
            List<SafeFileInfo> safeFileList = new List<SafeFileInfo>();

            foreach (string fullFileName in fileSupport.GetFiles(folderPath, pattern))
            {
                SafeFileInfo safeFile = FromOriginalFileName(fullFileName);
                safeFileList.Add(safeFile);
            }

            foreach (string fullFileName in fileSupport.GetFiles(folderPath, pattern + "." + TmpFileExtension))
            {
                SafeFileInfo safeFile = FromTempFileName(fullFileName);
                if (!SafeFileInfoListContains(safeFileList, safeFile))
                    safeFileList.Add(safeFile);
            }

            foreach (string fullFileName in fileSupport.GetFiles(folderPath, pattern + "." + OldFileExtension))
            {
                SafeFileInfo safeFile = FromOldFileName(fullFileName);
                if (!SafeFileInfoListContains(safeFileList, safeFile))
                    safeFileList.Add(safeFile);
            }
            return safeFileList.ToArray();
        }

        private static bool SafeFileInfoListContains(List<SafeFileInfo> safeFileList, SafeFileInfo safeFile)
        {
            foreach (SafeFileInfo file in safeFileList)
                if (file.originalFileName.Equals(safeFile.originalFileName))
                    return true;

            return false;
        }

        #endregion

    }
}