using System.IO;
using MediaBrowser.Common.Kernel;
namespace MediaBrowser.Controller
{
    /// 
    /// Extends BaseApplicationPaths to add paths that are only applicable on the server
    /// 
    public class ServerApplicationPaths : BaseApplicationPaths
    {
        private string _rootFolderPath;
        /// 
        /// Gets the path to the root media directory
        /// 
        public string RootFolderPath
        {
            get
            {
                if (_rootFolderPath == null)
                {
                    _rootFolderPath = Path.Combine(ProgramDataPath, "root");
                    if (!Directory.Exists(_rootFolderPath))
                    {
                        Directory.CreateDirectory(_rootFolderPath);
                    }
                }
                return _rootFolderPath;
            }
        }
        private string _ibnPath;
        /// 
        /// Gets the path to the Images By Name directory
        /// 
        public string ImagesByNamePath
        {
            get
            {
                if (_ibnPath == null)
                {
                    _ibnPath = Path.Combine(ProgramDataPath, "ImagesByName");
                    if (!Directory.Exists(_ibnPath))
                    {
                        Directory.CreateDirectory(_ibnPath);
                    }
                }
                return _ibnPath;
            }
        }
        private string _PeoplePath;
        /// 
        /// Gets the path to the People directory
        /// 
        public string PeoplePath
        {
            get
            {
                if (_PeoplePath == null)
                {
                    _PeoplePath = Path.Combine(ImagesByNamePath, "People");
                    if (!Directory.Exists(_PeoplePath))
                    {
                        Directory.CreateDirectory(_PeoplePath);
                    }
                }
                return _PeoplePath;
            }
        }
        private string _GenrePath;
        /// 
        /// Gets the path to the Genre directory
        /// 
        public string GenrePath
        {
            get
            {
                if (_GenrePath == null)
                {
                    _GenrePath = Path.Combine(ImagesByNamePath, "Genre");
                    if (!Directory.Exists(_GenrePath))
                    {
                        Directory.CreateDirectory(_GenrePath);
                    }
                }
                return _GenrePath;
            }
        }
        private string _StudioPath;
        /// 
        /// Gets the path to the Studio directory
        /// 
        public string StudioPath
        {
            get
            {
                if (_StudioPath == null)
                {
                    _StudioPath = Path.Combine(ImagesByNamePath, "Studio");
                    if (!Directory.Exists(_StudioPath))
                    {
                        Directory.CreateDirectory(_StudioPath);
                    }
                }
                return _StudioPath;
            }
        }
        private string _yearPath;
        /// 
        /// Gets the path to the Year directory
        /// 
        public string YearPath
        {
            get
            {
                if (_yearPath == null)
                {
                    _yearPath = Path.Combine(ImagesByNamePath, "Year");
                    if (!Directory.Exists(_yearPath))
                    {
                        Directory.CreateDirectory(_yearPath);
                    }
                }
                return _yearPath;
            }
        }
        private string _userConfigurationDirectoryPath;
        /// 
        /// Gets the path to the user configuration directory
        /// 
        public string UserConfigurationDirectoryPath
        {
            get
            {
                if (_userConfigurationDirectoryPath == null)
                {
                    _userConfigurationDirectoryPath = Path.Combine(ConfigurationDirectoryPath, "user");
                    if (!Directory.Exists(_userConfigurationDirectoryPath))
                    {
                        Directory.CreateDirectory(_userConfigurationDirectoryPath);
                    }
                }
                return _userConfigurationDirectoryPath;
            }
        }
        private string _CacheDirectory = null;
        /// 
        /// Gets the folder path to the cache directory
        /// 
        public string CacheDirectory
        {
            get
            {
                if (_CacheDirectory == null)
                {
                    _CacheDirectory = Path.Combine(Kernel.Instance.ApplicationPaths.ProgramDataPath, "cache");
                    if (!Directory.Exists(_CacheDirectory))
                    {
                        Directory.CreateDirectory(_CacheDirectory);
                    }
                }
                return _CacheDirectory;
            }
        }
        private string _FFProbeAudioCacheDirectory = null;
        /// 
        /// Gets the folder path to the ffprobe audio cache directory
        /// 
        public string FFProbeAudioCacheDirectory
        {
            get
            {
                if (_FFProbeAudioCacheDirectory == null)
                {
                    _FFProbeAudioCacheDirectory = Path.Combine(Kernel.Instance.ApplicationPaths.CacheDirectory, "ffprobe-audio");
                    if (!Directory.Exists(_FFProbeAudioCacheDirectory))
                    {
                        Directory.CreateDirectory(_FFProbeAudioCacheDirectory);
                    }
                }
                return _FFProbeAudioCacheDirectory;
            }
        }
        private string _FFProbeVideoCacheDirectory = null;
        /// 
        /// Gets the folder path to the ffprobe video cache directory
        /// 
        public string FFProbeVideoCacheDirectory
        {
            get
            {
                if (_FFProbeVideoCacheDirectory == null)
                {
                    _FFProbeVideoCacheDirectory = Path.Combine(Kernel.Instance.ApplicationPaths.CacheDirectory, "ffprobe-video");
                    if (!Directory.Exists(_FFProbeVideoCacheDirectory))
                    {
                        Directory.CreateDirectory(_FFProbeVideoCacheDirectory);
                    }
                }
                return _FFProbeVideoCacheDirectory;
            }
        }
        
        private string _FFMpegDirectory = null;
        /// 
        /// Gets the folder path to ffmpeg
        /// 
        public string FFMpegDirectory
        {
            get
            {
                if (_FFMpegDirectory == null)
                {
                    _FFMpegDirectory = Path.Combine(Kernel.Instance.ApplicationPaths.ProgramDataPath, "FFMpeg");
                    if (!Directory.Exists(_FFMpegDirectory))
                    {
                        Directory.CreateDirectory(_FFMpegDirectory);
                    }
                }
                return _FFMpegDirectory;
            }
        }
        private string _FFMpegPath = null;
        /// 
        /// Gets the path to ffmpeg.exe
        /// 
        public string FFMpegPath
        {
            get
            {
                if (_FFMpegPath == null)
                {
                    _FFMpegPath = Path.Combine(FFMpegDirectory, "ffmpeg.exe");
                }
                return _FFMpegPath;
            }
        }
        private string _FFProbePath = null;
        /// 
        /// Gets the path to ffprobe.exe
        /// 
        public string FFProbePath
        {
            get
            {
                if (_FFProbePath == null)
                {
                    _FFProbePath = Path.Combine(FFMpegDirectory, "ffprobe.exe");
                }
                return _FFProbePath;
            }
        }
    }
}