using System.IO;
using Emby.Common.Implementations;
using MediaBrowser.Controller;

namespace Emby.Server.Core
{
    /// <summary>
    /// Extends BaseApplicationPaths to add paths that are only applicable on the server
    /// </summary>
    public class ServerApplicationPaths : BaseApplicationPaths, IServerApplicationPaths
    {
        /// <summary>
        /// Initializes a new instance of the <see cref="BaseApplicationPaths" /> class.
        /// </summary>
        public ServerApplicationPaths(string programDataPath, string appFolderPath, string applicationResourcesPath)
            : base(programDataPath, appFolderPath)
        {
            ApplicationResourcesPath = applicationResourcesPath;
        }

        public string ApplicationResourcesPath { get; private set; }

        /// <summary>
        /// Gets the path to the base root media directory
        /// </summary>
        /// <value>The root folder path.</value>
        public string RootFolderPath
        {
            get
            {
                return Path.Combine(ProgramDataPath, "root");
            }
        }

        /// <summary>
        /// Gets the path to the default user view directory.  Used if no specific user view is defined.
        /// </summary>
        /// <value>The default user views path.</value>
        public string DefaultUserViewsPath
        {
            get
            {
                return Path.Combine(RootFolderPath, "default");
            }
        }

        /// <summary>
        /// Gets the path to localization data.
        /// </summary>
        /// <value>The localization path.</value>
        public string LocalizationPath
        {
            get
            {
                return Path.Combine(ProgramDataPath, "localization");
            }
        }

        /// <summary>
        /// The _ibn path
        /// </summary>
        private string _ibnPath;
        /// <summary>
        /// Gets the path to the Images By Name directory
        /// </summary>
        /// <value>The images by name path.</value>
        public string ItemsByNamePath
        {
            get
            {
                return _ibnPath ?? (_ibnPath = Path.Combine(ProgramDataPath, "ImagesByName"));
            }
            set
            {
                _ibnPath = value;
            }
        }

        /// <summary>
        /// Gets the path to the People directory
        /// </summary>
        /// <value>The people path.</value>
        public string PeoplePath
        {
            get
            {
                return Path.Combine(ItemsByNamePath, "People");
            }
        }

        public string ArtistsPath
        {
            get
            {
                return Path.Combine(ItemsByNamePath, "artists");
            }
        }

        /// <summary>
        /// Gets the path to the Genre directory
        /// </summary>
        /// <value>The genre path.</value>
        public string GenrePath
        {
            get
            {
                return Path.Combine(ItemsByNamePath, "Genre");
            }
        }

        /// <summary>
        /// Gets the path to the Genre directory
        /// </summary>
        /// <value>The genre path.</value>
        public string MusicGenrePath
        {
            get
            {
                return Path.Combine(ItemsByNamePath, "MusicGenre");
            }
        }

        /// <summary>
        /// Gets the path to the Studio directory
        /// </summary>
        /// <value>The studio path.</value>
        public string StudioPath
        {
            get
            {
                return Path.Combine(ItemsByNamePath, "Studio");
            }
        }

        /// <summary>
        /// Gets the path to the Year directory
        /// </summary>
        /// <value>The year path.</value>
        public string YearPath
        {
            get
            {
                return Path.Combine(ItemsByNamePath, "Year");
            }
        }

        /// <summary>
        /// Gets the path to the General IBN directory
        /// </summary>
        /// <value>The general path.</value>
        public string GeneralPath
        {
            get
            {
                return Path.Combine(ItemsByNamePath, "general");
            }
        }

        /// <summary>
        /// Gets the path to the Ratings IBN directory
        /// </summary>
        /// <value>The ratings path.</value>
        public string RatingsPath
        {
            get
            {
                return Path.Combine(ItemsByNamePath, "ratings");
            }
        }

        /// <summary>
        /// Gets the media info images path.
        /// </summary>
        /// <value>The media info images path.</value>
        public string MediaInfoImagesPath
        {
            get
            {
                return Path.Combine(ItemsByNamePath, "mediainfo");
            }
        }

        /// <summary>
        /// Gets the path to the user configuration directory
        /// </summary>
        /// <value>The user configuration directory path.</value>
        public string UserConfigurationDirectoryPath
        {
            get
            {
                return Path.Combine(ConfigurationDirectoryPath, "users");
            }
        }

        private string _transcodingTempPath;
        public string TranscodingTempPath
        {
            get
            {
                return _transcodingTempPath ?? (_transcodingTempPath = Path.Combine(ProgramDataPath, "transcoding-temp"));
            }
            set
            {
                _transcodingTempPath = value;
            }
        }

        /// <summary>
        /// Gets the game genre path.
        /// </summary>
        /// <value>The game genre path.</value>
        public string GameGenrePath
        {
            get
            {
                return Path.Combine(ItemsByNamePath, "GameGenre");
            }
        }

        private string _internalMetadataPath;
        public string InternalMetadataPath
        {
            get
            {
                return _internalMetadataPath ?? (_internalMetadataPath = Path.Combine(DataPath, "metadata"));
            }
            set
            {
                _internalMetadataPath = value;
            }
        }
    }
}