using MediaBrowser.Common.Extensions;
using System;
using System.IO;
namespace MediaBrowser.Common.IO
{
    /// 
    /// This is a wrapper for storing large numbers of files within a directory on a file system.
    /// Simply pass a filename into GetResourcePath and it will return a full path location of where the file should be stored.
    /// 
    public class FileSystemRepository
    {
        /// 
        /// Gets or sets the path.
        /// 
        /// The path.
        protected string Path { get; set; }
        /// 
        /// Initializes a new instance of the  class.
        /// 
        /// The path.
        /// 
        public FileSystemRepository(string path)
        {
            if (string.IsNullOrEmpty(path))
            {
                throw new ArgumentNullException();
            }
            Path = path;
        }
        /// 
        /// Gets the full path of where a resource should be stored within the repository
        /// 
        /// Name of the unique.
        /// The file extension.
        /// System.String.
        /// 
        /// 
        public string GetResourcePath(string uniqueName, string fileExtension)
        {
            if (string.IsNullOrEmpty(uniqueName))
            {
                throw new ArgumentNullException("uniqueName");
            }
            if (string.IsNullOrEmpty(fileExtension))
            {
                throw new ArgumentNullException("fileExtension");
            }
            
            var filename = uniqueName.GetMD5() + fileExtension;
            return GetResourcePath(filename);
        }
        /// 
        /// Gets the resource path.
        /// 
        /// The filename.
        /// System.String.
        /// 
        public string GetResourcePath(string filename)
        {
            if (string.IsNullOrEmpty(filename))
            {
                throw new ArgumentNullException("filename");
            }
            
            var prefix = filename.Substring(0, 1);
            var path = System.IO.Path.Combine(Path, prefix);
            
            return System.IO.Path.Combine(path, filename);
        }
        /// 
        /// Determines if a resource is present in the repository
        /// 
        /// Name of the unique.
        /// The file extension.
        /// true if the specified unique name contains resource; otherwise, false.
        public bool ContainsResource(string uniqueName, string fileExtension)
        {
            return ContainsFilePath(GetResourcePath(uniqueName, fileExtension));
        }
        /// 
        /// Determines if a file with a given name is present in the repository
        /// 
        /// The filename.
        /// true if the specified filename contains filename; otherwise, false.
        /// 
        public bool ContainsFilename(string filename)
        {
            if (string.IsNullOrEmpty(filename))
            {
                throw new ArgumentNullException();
            }
            return ContainsFilePath(GetResourcePath(filename));
        }
        /// 
        /// Determines if a file is present in the repository
        /// 
        /// The path.
        /// true if [contains file path] [the specified path]; otherwise, false.
        /// 
        public bool ContainsFilePath(string path)
        {
            if (string.IsNullOrEmpty(path))
            {
                throw new ArgumentNullException();
            }
            
            return File.Exists(path);
        }
    }
}