using AIStudio.Tools.PluginSystem.Assistants;

namespace AIStudio.Settings.DataModel.PreviousModels;

public sealed class DataV5
{
    /// <summary>
    /// The version of the settings file. Allows us to upgrade the settings
    /// when a new version is available.
    /// </summary>
    public Version Version { get; init; } = Version.V5;

    /// <summary>
    /// List of configured providers.
    /// </summary>
    public List<AIStudio.Settings.Provider> Providers { get; init; } = [];
    
    /// <summary>
    /// Settings concerning the LLM providers.
    /// </summary>
    public DataLLMProvidersV5 LLMProviders { get; init; } = new();

    /// <summary>
    /// A collection of embedding providers configured.
    /// </summary>
    public List<EmbeddingProvider> EmbeddingProviders { get; init; } = [];
    
    /// <summary>
    /// A collection of speech providers configured.
    /// </summary>
    public List<TranscriptionProvider> TranscriptionProviders { get; init; } = [];

    /// <summary>
    /// A collection of data sources configured.
    /// </summary>
    public List<IDataSource> DataSources { get; set; } = [];
    
    /// <summary>
    /// List of configured profiles.
    /// </summary>
    public List<Profile> Profiles { get; init; } = [];
    
    /// <summary>
    /// List of configured chat templates.
    /// </summary>
    public List<ChatTemplate> ChatTemplates { get; init; } = [];

    /// <summary>
    /// List of enabled plugins.
    /// </summary>
    public List<Guid> EnabledPlugins { get; set; } = [];

    /// <summary>
    /// Metadata for managed settings that use a plugin-provided editable default.
    /// </summary>
    public Dictionary<string, ManagedEditableDefaultState> ManagedEditableDefaults { get; set; } = [];

    /// <summary>
    /// Cached audit results for assistant plugins.
    /// </summary>
    public List<PluginAssistantAudit> AssistantPluginAudits { get; set; } = [];

    /// <summary>
    /// The next provider number to use.
    /// </summary>
    public uint NextProviderNum { get; set; } = 1;

    /// <summary>
    /// The next embedding provider number to use.
    /// </summary>
    public uint NextEmbeddingNum { get; set; } = 1;
    
    /// <summary>
    /// The next transcription provider number to use.
    /// </summary>
    public uint NextTranscriptionNum { get; set; } = 1;

    /// <summary>
    /// The next data source number to use.
    /// </summary>
    public uint NextDataSourceNum { get; set; } = 1;

    /// <summary>
    /// The next profile number to use.
    /// </summary>
    public uint NextProfileNum { get; set; } = 1;
    
    /// <summary>
    /// The next chat template number to use.
    /// </summary>
    public uint NextChatTemplateNum { get; set; } = 1;
    
    /// <summary>
    /// The next document analysis policy number to use.
    /// </summary>
    public uint NextDocumentAnalysisPolicyNum { get; set; } = 1;

    public DataApp App { get; init; } = new(x => x.App);

    public DataChat Chat { get; init; } = new();

    public DataWorkspace Workspace { get; init; } = new();

    public DataIconFinder IconFinder { get; init; } = new();

    public DataTranslation Translation { get; init; } = new();

    public DataCoding Coding { get; init; } = new();
    
    public DataERI ERI { get; init; } = new();
    
    public DataDocumentAnalysis DocumentAnalysis { get; init; } = new();

    public DataMandatoryInformation MandatoryInformation { get; init; } = new();

    public DataTextSummarizer TextSummarizer { get; init; } = new();

    public DataTextContentCleaner TextContentCleaner { get; init; } = new();
    
    public DataAgentDataSourceSelection AgentDataSourceSelection { get; init; } = new();
    
    public DataAgentRetrievalContextValidation AgentRetrievalContextValidation { get; init; } = new();

    public DataAssistantPluginAudit AssistantPluginAudit { get; init; } = new(x => x.AssistantPluginAudit);
    
    public DataAgenda Agenda { get; init; } = new();
    
    public DataGrammarSpelling GrammarSpelling { get; init; } = new();
    
    public DataRewriteImprove RewriteImprove { get; init; } = new();
    
    public DataPromptOptimizer PromptOptimizer { get; init; } = new();

    public DataEMail EMail { get; init; } = new();
    
    public DataSlideBuilder SlideBuilder { get; init; } = new();
    
    public DataLegalCheck LegalCheck { get; init; } = new();
    
    public DataSynonyms Synonyms { get; init; } = new();

    public DataMyTasks MyTasks { get; init; } = new();
    
    public DataJobPostings JobPostings { get; init; } = new();
    
    public DataBiasOfTheDay BiasOfTheDay { get; init; } = new();
    
    public DataI18N I18N { get; init; } = new();
}