namespace DotBased.ASP.Auth;

public class BasedAuthConfiguration
{
    /// <summary>
    /// Allow users to registrate.
    /// </summary>
    public bool AllowRegistration { get; set; }
    //TODO: Callback when a user registers, so the application can handle sending emails or generate a code to complete the registration.
    //TODO: Callback for validation email, phone number
    /// <summary>
    /// Allow no passwords on users, not recommended!
    /// </summary>
    public bool AllowEmptyPassword { get; set; } = false;
    /// <summary>
    /// This path is used for redirecting to the login page.
    /// </summary>
    public string LoginPath { get; set; } = string.Empty;
    /// <summary>
    /// The path that will be used if the logout is requested.
    /// </summary>
    public string LogoutPath { get; set; } = string.Empty;
    /// <summary>
    /// The page that the client will be redirected to after logging out. 
    /// </summary>
    public string LoggedOutPath { get; set; } = string.Empty;
    /// <summary>
    /// The max age before a AuthenticationState will expire (default: 7 days).
    /// </summary>
    public TimeSpan AuthenticationStateMaxAgeBeforeExpire { get; set; } = TimeSpan.FromDays(7);
    /// <summary>
    /// How long a session state will be cached (default: 15 min)
    /// </summary>
    public TimeSpan CachedAuthSessionLifespan { get; set; } = TimeSpan.FromMinutes(15);
    /// <summary>
    /// Can be used to seed a default user and/or group for first time use.
    /// </summary>
    public Action<IAuthDataRepository>? SeedData { get; set; }

    public Type? AuthDataRepositoryType { get; private set; }

    public void SetDataRepositoryType<TDataProviderType>() where TDataProviderType : IAuthDataRepository =>
        AuthDataRepositoryType = typeof(TDataProviderType);

    public Type? SessionStateProviderType { get; private set; }

    public void SetSessionStateProviderType<TSessionStateProviderType>()
        where TSessionStateProviderType : ISessionStateProvider =>
        SessionStateProviderType = typeof(TSessionStateProviderType);
}

public class BasedPasswordOptions
{
    
}

public class BasedUserOptions
{
    
}

public class BasedLockoutOptions
{
    
}