using System;
using System.IO;

namespace FileManager
{
    public static class FileUtility
    {
        public static string GetValidFilename(string dirFullPath, string filename, string extension, params string[] metadataSuffixes)
        {
            if (string.IsNullOrWhiteSpace(dirFullPath))
                throw new ArgumentException($"{nameof(dirFullPath)} may not be null or whitespace", nameof(dirFullPath));

            // file max length = 255. dir max len = 247

            // sanitize
            filename = GetAsciiTag(filename);
            // manage length
            if (filename.Length > 50)
                filename = filename.Substring(0, 50) + "[...]";

            // append id. it is 10 or 14 char in the common cases
            if (metadataSuffixes != null && metadataSuffixes.Length > 0)
                filename += " [" + string.Join("][", metadataSuffixes) + "]";

            // this method may also be used for directory names, so no guarantee of extension
            if (!string.IsNullOrWhiteSpace(extension))
                extension = '.' + extension.Trim('.');

            // ensure uniqueness
            var fullfilename = Path.Combine(dirFullPath, filename + extension);
            var i = 0;
            while (File.Exists(fullfilename))
                fullfilename = Path.Combine(dirFullPath, filename + $" ({++i})" + extension);

            return fullfilename;
        }

        public static string GetAsciiTag(string property)
        {
            if (property == null)
                return "";

            // omit characters which are invalid. EXCEPTION: change colon to underscore
            property = property.Replace(':', '_');

            // GetInvalidFileNameChars contains everything in GetInvalidPathChars plus ':', '*', '?', '\\', '/'
            foreach (var ch in Path.GetInvalidFileNameChars())
                property = property.Replace(ch.ToString(), "");
            return property;
        }
    }
}
