namespace OTSSignsOrchestrator.Core.Services;

/// <summary>
/// Abstraction for storing and retrieving secrets via Bitwarden Secrets Manager.
/// </summary>
public interface IBitwardenSecretService
{
    /// <summary>
    /// Returns true if Bitwarden is configured (access token + org ID are set).
    /// </summary>
    Task<bool> IsConfiguredAsync();

    /// <summary>
    /// Creates a new secret in the configured Bitwarden project.
    /// </summary>
    /// <returns>The ID of the created secret.</returns>
    Task<string> CreateSecretAsync(string key, string value, string note = "");

    /// <summary>
    /// Creates a new secret in the instance Bitwarden project (falls back to default project if not configured).
    /// Use this for instance-level secrets such as DB passwords and Newt credentials.
    /// </summary>
    /// <returns>The ID of the created secret.</returns>
    Task<string> CreateInstanceSecretAsync(string key, string value, string note = "");

    /// <summary>
    /// Retrieves a secret by its Bitwarden ID.
    /// </summary>
    Task<BitwardenSecret> GetSecretAsync(string secretId);

    /// <summary>
    /// Updates the value of an existing secret in place.
    /// </summary>
    Task UpdateSecretAsync(string secretId, string key, string value, string note = "");

    /// <summary>
    /// Updates the value of an existing instance-level secret in place (uses instance project if configured).
    /// </summary>
    Task UpdateInstanceSecretAsync(string secretId, string key, string value, string note = "");

    /// <summary>
    /// Lists all secrets in the configured project.
    /// </summary>
    Task<List<BitwardenSecretSummary>> ListSecretsAsync();
}

public class BitwardenSecret
{
    public string Id { get; set; } = string.Empty;
    public string Key { get; set; } = string.Empty;
    public string Value { get; set; } = string.Empty;
    public string Note { get; set; } = string.Empty;
    public DateTime CreationDate { get; set; }
}

public class BitwardenSecretSummary
{
    public string Id { get; set; } = string.Empty;
    public string Key { get; set; } = string.Empty;
    public DateTime CreationDate { get; set; }
}
