namespace SharpChat;

public class Channel(
    string name,
    string password = "",
    bool isTemporary = false,
    int rank = 0,
    string ownerId = ""
) {
    public string Name { get; } = name ?? throw new ArgumentNullException(nameof(name));
    public string Password { get; set; } = password ?? string.Empty;
    public bool IsTemporary { get; set; } = isTemporary;
    public int Rank { get; set; } = rank;
    public string OwnerId { get; set; } = ownerId;

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

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

    public bool IsOwner(User user) {
        return string.IsNullOrEmpty(OwnerId)
            && user != null
            && OwnerId == user.UserId;
    }

    public override int GetHashCode() {
        return Name.GetHashCode();
    }

    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 == '_';
    }
}