using System.IO;

namespace Shared
{

    public class FilePathGeneratorInfo
    {

        public string To { get; protected set; }
        public string From { get; protected set; }
        public bool IsErrorFile { get; protected set; }
        public string SubFolderPath { get; protected set; }
        public string FirstDirectory { get; protected set; }
        public string ReportFullPath { get; protected set; }
        public string ResolvedFileLocation { get; protected set; }

        public FilePathGeneratorInfo(object originalFilePathGenerator, string reportFullPath, bool isErrorFile, System.Collections.Generic.Dictionary<string, string> fileParameter)
        {
            ReportFullPath = reportFullPath;
            IsErrorFile = isErrorFile;
            if (originalFilePathGenerator is null || originalFilePathGenerator is not FilePathGenerator original)
            {
                FirstDirectory = string.Empty;
                ResolvedFileLocation = string.Empty;
                To = string.Empty;
                From = string.Empty;
            }
            else
            {
                string directorySeparatorChar = Path.DirectorySeparatorChar.ToString();
                FilePathGenerator filePathGenerator = new(original.FileConnectorConfiguration, reportFullPath, isErrorFile);
                SubFolderPath = filePathGenerator.GetSubFolderPath();
                if (string.IsNullOrEmpty(SubFolderPath))
                    FirstDirectory = SubFolderPath;
                else
                    FirstDirectory = SubFolderPath.Split(Path.DirectorySeparatorChar)[0];
                ResolvedFileLocation = filePathGenerator.GetTargetFolder();
                if (string.IsNullOrEmpty(ResolvedFileLocation) && string.IsNullOrEmpty(SubFolderPath))
                    To = string.Empty;
                else if (string.IsNullOrEmpty(SubFolderPath))
                    To = ResolvedFileLocation;
                else
                    To = string.Concat(ResolvedFileLocation.Replace(SubFolderPath, string.Empty), Path.DirectorySeparatorChar, FirstDirectory);
#if (true)
                if (string.IsNullOrEmpty(original.FileConnectorConfiguration.DefaultPlaceHolderValue))
                    original.FileConnectorConfiguration.DefaultPlaceHolderValue = "NA";
                if (!(fileParameter is null) && fileParameter.Count == 1 && To.Contains(original.FileConnectorConfiguration.DefaultPlaceHolderValue))
                {
                    foreach (System.Collections.Generic.KeyValuePair<string, string> keyValuePair in fileParameter)
                        To = To.Replace(string.Concat(original.FileConnectorConfiguration.DefaultPlaceHolderValue), keyValuePair.Value);
                }
#endif
                if (original.FileConnectorConfiguration.SourceFileLocation.EndsWith(directorySeparatorChar))
                    From = string.Concat(original.FileConnectorConfiguration.SourceFileLocation, FirstDirectory);
                else
                    From = string.Concat(original.FileConnectorConfiguration.SourceFileLocation, Path.DirectorySeparatorChar, FirstDirectory);
                if (From.EndsWith(directorySeparatorChar) && !To.EndsWith(directorySeparatorChar))
                    To = string.Concat(To, Path.DirectorySeparatorChar);
                else if (To.EndsWith(directorySeparatorChar) && !From.EndsWith(directorySeparatorChar))
                    To = To.Remove(To.Length - 1, 1);
            }
        }

    }

}