using AuthorBuddy.Web.Data;

namespace AuthorBuddy.Web.Services;

public interface ISettingsService
{
    Task<string?> GetOllamaUrlAsync();
    Task<string?> GetLlamaCppUrlAsync();
    Task<string?> GetBackendAsync();
    Task<string?> GetRagModelAsync();
    Task<string?> GetStyleModelAsync();
    Task<string?> GetSpellingModelAsync();
    Task<string?> GetThemeAsync();
    Task SaveOllamaUrlAsync(string url);
    Task SaveLlamaCppUrlAsync(string url);
    Task SaveBackendAsync(string backend);
    Task SaveRagModelAsync(string model);
    Task SaveStyleModelAsync(string model);
    Task SaveSpellingModelAsync(string model);
    Task SaveThemeAsync(string theme);

    Task<string?> GetLektorSystemPromptAsync();
    Task<string?> GetFactCheckTemplateAsync();
    Task<string?> GetSpellingPromptAsync();
    Task<string?> GetAdvocatusDiaboliPromptAsync();
    Task<string?> GetHookFinderPromptAsync();
    Task<string?> GetEli5PromptAsync();
    Task<string?> GetCoAuthorBrainstormingPromptAsync();

    Task SaveLektorSystemPromptAsync(string prompt);
    Task SaveFactCheckTemplateAsync(string prompt);
    Task SaveSpellingPromptAsync(string prompt);
    Task SaveAdvocatusDiaboliPromptAsync(string prompt);
    Task SaveHookFinderPromptAsync(string prompt);
    Task SaveEli5PromptAsync(string prompt);
    Task SaveCoAuthorBrainstormingPromptAsync(string prompt);
    Task<double> GetLektorTempAsync();
    Task<double> GetFactCheckTempAsync();
    Task<double> GetSpellingTempAsync();
    Task<double> GetAdvocatusDiaboliTempAsync();
    Task<double> GetHookFinderTempAsync();
    Task<double> GetEli5TempAsync();
    Task<double> GetCoAuthorTempAsync();
    Task SaveLektorTempAsync(double temp);
    Task SaveFactCheckTempAsync(double temp);
    Task SaveSpellingTempAsync(double temp);
    Task SaveAdvocatusDiaboliTempAsync(double temp);
    Task SaveHookFinderTempAsync(double temp);
    Task SaveEli5TempAsync(double temp);
    Task SaveCoAuthorTempAsync(double temp);

    Task<string?> GetTechLastenheftPromptAsync();
    Task<string?> GetTechPflichtenheftPromptAsync();
    Task<string?> GetTechUseCasePromptAsync();
    Task<string?> GetTechStakeholderPromptAsync();
    Task<string?> GetTechGlossarPromptAsync();
    Task<string?> GetTechQualitaetPromptAsync();
    Task<string?> GetTechRisikoPromptAsync();
    Task SaveTechLastenheftPromptAsync(string prompt);
    Task SaveTechPflichtenheftPromptAsync(string prompt);
    Task SaveTechUseCasePromptAsync(string prompt);
    Task SaveTechStakeholderPromptAsync(string prompt);
    Task SaveTechGlossarPromptAsync(string prompt);
    Task SaveTechQualitaetPromptAsync(string prompt);
    Task SaveTechRisikoPromptAsync(string prompt);
    Task<double> GetTechLastenheftTempAsync();
    Task<double> GetTechPflichtenheftTempAsync();
    Task<double> GetTechUseCaseTempAsync();
    Task<double> GetTechStakeholderTempAsync();
    Task<double> GetTechGlossarTempAsync();
    Task<double> GetTechQualitaetTempAsync();
    Task<double> GetTechRisikoTempAsync();
    Task SaveTechLastenheftTempAsync(double temp);
    Task SaveTechPflichtenheftTempAsync(double temp);
    Task SaveTechUseCaseTempAsync(double temp);
    Task SaveTechStakeholderTempAsync(double temp);
    Task SaveTechGlossarTempAsync(double temp);
    Task SaveTechQualitaetTempAsync(double temp);
    Task SaveTechRisikoTempAsync(double temp);
    Task<string?> GetLanguageAsync();
    Task SaveLanguageAsync(string language);

    Task<List<UserEntity>> GetUsersAsync();
    Task<UserEntity> GetCurrentUserAsync();
    void SetCurrentUser(int userId);
    Task<UserEntity> CreateUserAsync(string name);

    int? CurrentProjectId { get; set; }
    string? CurrentFilePath { get; set; }
    string? PendingAssistantInput { get; set; }
    string? PendingAssistantOutput { get; set; }
    Task<int?> GetLastProjectIdAsync();
    Task SaveLastProjectIdAsync(int projectId);
    Task LoadProjectSettingsAsync();

    Task InitializeAsync();
}
