/**
 * Defines models for the Finnow API's authentication system.
 */
module auth.model;

/**
 * The user is the basic authenticated entity representing someone who has one
 * or more profiles.
 */
struct User {
    string username;
    string passwordHash;
}

/**
 * Validates a username string.
 * Params:
 *   username = The username to check.
 * Returns: True if the username is valid.
 */
bool validateUsername(string username) {
    import std.regex;
    import std.uni : toLower;
    if (username is null || username.length < 3) return false;
    const string[] RESERVED_USERNAMES = ["user", "admin"];
    static foreach (reservedUsername; RESERVED_USERNAMES) {
        if (toLower(username) == reservedUsername) return false;
    }
    auto r = ctRegex!(`^[a-zA-Z]+[a-zA-Z0-9_]+$`);
    return !matchFirst(username, r).empty;
}

/**
 * Validates that a password is of sufficient complexity.
 * Params:
 *   password = The password to check.
 * Returns: True if the password is sufficiently complex.
 */
bool validatePassword(string password) {
    return password !is null && password.length >= 8;
}
