using Microsoft.Extensions.Options;

namespace Forge.Web.Auth;

public class ConfiguredAuthService : IAuthService
{
    private readonly AuthOptions _options;

    public ConfiguredAuthService(IOptions<AuthOptions> options)
    {
        _options = options.Value;
    }

    public bool ValidateCredentials(string? username, string? password)
    {
        var configuredPassword = GetConfiguredPassword();
        if (string.IsNullOrWhiteSpace(_options.Username) || string.IsNullOrWhiteSpace(configuredPassword))
        {
            return false;
        }

        return string.Equals(username, _options.Username, StringComparison.Ordinal)
            && string.Equals(password, configuredPassword, StringComparison.Ordinal);
    }

    public string GetConfiguredUsername() => _options.Username;

    public Task UpdatePasswordAsync(string username, string newPassword)
    {
        if (string.IsNullOrWhiteSpace(_options.PasswordFile))
        {
            throw new InvalidOperationException("Password file is not configured. Cannot update password.");
        }

        File.WriteAllText(_options.PasswordFile, newPassword);
        return Task.CompletedTask;
    }

    private string GetConfiguredPassword()
    {
        if (!string.IsNullOrWhiteSpace(_options.Password))
        {
            return _options.Password;
        }

        if (string.IsNullOrWhiteSpace(_options.PasswordFile))
        {
            return string.Empty;
        }

        try
        {
            return File.Exists(_options.PasswordFile)
                ? File.ReadAllText(_options.PasswordFile).Trim()
                : string.Empty;
        }
        catch
        {
            return string.Empty;
        }
    }
}
An unhandled error has occurred. Reload 🗙