using SharpChat.Users;

namespace SharpChat.Channels;

public class Channel(
    long id,
    string name,
    string password = "",
    bool isTemporary = false,
    int rank = 0,
    string ownerId = ""
) {
    /// <summary>
    /// Ephemeral unique identifier.
    /// ONLY use this to refer to the channel during runtime, not intended for long term storage!!!!!
    /// </summary>
    public long Id { get; } = id;

    public string Name { get; internal set; } = name;
    public string Password { get; internal set; } = password ?? string.Empty;
    public bool IsTemporary { get; internal set; } = isTemporary;
    public int Rank { get; internal set; } = rank;
    public string OwnerId { get; internal set; } = ownerId;

    public bool HasPassword
        => !string.IsNullOrWhiteSpace(Password);

    public bool IsPublic
        => !HasPassword && Rank < 1;

    public bool NameEquals(string name) {
        return string.Equals(name, Name, StringComparison.OrdinalIgnoreCase);
    }

    public bool IsOwner(string userId) {
        return !string.IsNullOrEmpty(OwnerId)
            && !string.IsNullOrEmpty(userId)
            && OwnerId.Equals(userId, StringComparison.Ordinal);
    }

    public static bool CheckName(string name) {
        return !string.IsNullOrWhiteSpace(name) && name.All(CheckNameChar);
    }

    public static bool CheckNameChar(char c) {
        return char.IsLetter(c) || char.IsNumber(c) || c == '-' || c == '_';
    }
}