using Grand.Domain.Configuration;

namespace Grand.Business.Core.Interfaces.Common.Configuration
{
    /// <summary>
    /// Setting service interface
    /// </summary>
    public interface ISettingService
    {

        /// <summary>
        /// Adds a setting
        /// </summary>
        /// <param name="setting">Setting</param>
        /// <param name="clearCache">A value indicating whether to clear cache after setting update</param>
        Task InsertSetting(Setting setting, bool clearCache = true);

        /// <summary>
        /// Update setting
        /// </summary>
        /// <param name="setting"></param>
        /// <param name="clearCache"></param>
        /// <returns></returns>
        Task UpdateSetting(Setting setting, bool clearCache = true);

        /// <summary>
        /// Deletes a setting
        /// </summary>
        /// <param name="setting">Setting</param>
        Task DeleteSetting(Setting setting);

        /// <summary>
        /// Gets a setting by ident
        /// </summary>
        /// <param name="settingId">Setting ident</param>
        /// <returns>Setting</returns>
        Task<Setting> GetSettingById(string settingId);

        /// <summary>
        /// Get setting value by key
        /// </summary>
        /// <typeparam name="T">Type</typeparam>
        /// <param name="key">Key</param>
        /// <param name="storeId">Store identifier</param>
        /// <param name="defaultValue">Default value</param>
        /// <returns>Setting value</returns>
        T GetSettingByKey<T>(string key, T defaultValue = default, string storeId = "");

        /// <summary>
        /// Set setting value
        /// </summary>
        /// <typeparam name="T">Type</typeparam>
        /// <param name="key">Key</param>
        /// <param name="value">Value</param>
        /// <param name="storeId">Store identifier</param>
        /// <param name="clearCache">A value indicating whether to clear cache after setting update</param>
        Task SetSetting<T>(string key, T value, string storeId = "", bool clearCache = true);

        /// <summary>
        /// Gets all settings
        /// </summary>
        /// <returns>Settings</returns>
        IList<Setting> GetAllSettings();

        /// <summary>
        /// Load settings
        /// </summary>
        /// <typeparam name="T">Type</typeparam>
        /// <param name="storeId">Store identifier for which settings should be loaded</param>
        T LoadSetting<T>(string storeId = "") where T : ISettings, new();

        /// <summary>
        /// Load settings
        /// </summary>
        /// <param name="type"></param>
        /// <param name="storeId"></param>
        /// <returns></returns>
        ISettings LoadSetting(Type type, string storeId = "");

        /// <summary>
        /// Save settings object
        /// </summary>
        /// <typeparam name="T">Type</typeparam>
        /// <param name="storeId">Store identifier</param>
        /// <param name="settings">Setting instance</param>
        Task SaveSetting<T>(T settings, string storeId = "") where T : ISettings, new();

        /// <summary>
        /// Delete all settings
        /// </summary>
        /// <typeparam name="T">Type</typeparam>
        Task DeleteSetting<T>() where T : ISettings, new();

        /// <summary>
        /// Clear cache
        /// </summary>
        Task ClearCache();
    }
}
