using System.Threading.Tasks;
using NPP.SmartSchedue.Api.Contracts.Services.Notification.Input;
using NPP.SmartSchedue.Api.Contracts.Services.Notification.Output;

namespace NPP.SmartSchedue.Api.Contracts.Services.Notification;

/// <summary>
/// 通知模板服务接口
/// 决策点7：模板通知，支持通知内容模板，可替换变量
/// </summary>
public interface INotificationTemplateService
{
    #region 模板渲染
    
    /// <summary>
    /// 渲染通知模板
    /// 支持变量替换，如：{变量名}
    /// </summary>
    /// <param name="input">渲染模板输入参数</param>
    /// <returns>渲染结果</returns>
    Task<RenderTemplateOutput> RenderTemplateAsync(RenderTemplateInput input);

    #endregion

    #region 模板验证
    
    /// <summary>
    /// 验证模板语法是否正确
    /// </summary>
    /// <param name="input">验证模板输入参数</param>
    /// <returns>验证结果</returns>
    Task<ValidateTemplateOutput> ValidateTemplateAsync(ValidateTemplateInput input);

    #endregion

    #region 变量解析
    
    /// <summary>
    /// 提取模板中的变量列表
    /// </summary>
    /// <param name="input">提取变量输入参数</param>
    /// <returns>变量列表</returns>
    Task<ExtractVariablesOutput> ExtractVariablesAsync(ExtractVariablesInput input);

    #endregion

    #region 内置变量
    
    /// <summary>
    /// 获取系统内置变量
    /// </summary>
    /// <returns>系统变量字典</returns>
    Task<GetSystemVariablesOutput> GetSystemVariablesAsync();

    /// <summary>
    /// 获取业务相关变量
    /// </summary>
    /// <param name="input">获取业务变量输入参数</param>
    /// <returns>业务变量字典</returns>
    Task<GetBusinessVariablesOutput> GetBusinessVariablesAsync(GetBusinessVariablesInput input);

    #endregion

    #region 模板预定义
    
    /// <summary>
    /// 获取预定义模板列表
    /// </summary>
    /// <param name="input">获取模板列表输入参数</param>
    /// <returns>预定义模板列表</returns>
    Task<GetPredefinedTemplatesOutput> GetPredefinedTemplatesAsync(GetPredefinedTemplatesInput input);

    /// <summary>
    /// 获取指定预定义模板
    /// </summary>
    /// <param name="input">获取指定模板输入参数</param>
    /// <returns>预定义模板</returns>
    Task<GetPredefinedTemplateOutput> GetPredefinedTemplateAsync(GetPredefinedTemplateInput input);

    #endregion
}

