using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using Jellyfin.Data.Enums;
using Jellyfin.Data.Interfaces;
namespace Jellyfin.Data.Entities
{
    /// 
    /// An entity representing a group.
    /// 
    public class Group : IHasPermissions, IHasConcurrencyToken
    {
        /// 
        /// Initializes a new instance of the  class.
        /// 
        /// The name of the group.
        public Group(string name)
        {
            ArgumentException.ThrowIfNullOrEmpty(name);
            Name = name;
            Id = Guid.NewGuid();
            Permissions = new HashSet();
            Preferences = new HashSet();
        }
        /// 
        /// Gets the id of this group.
        /// 
        /// 
        /// Identity, Indexed, Required.
        /// 
        public Guid Id { get; private set; }
        /// 
        /// Gets or sets the group's name.
        /// 
        /// 
        /// Required, Max length = 255.
        /// 
        [MaxLength(255)]
        [StringLength(255)]
        public string Name { get; set; }
        /// 
        [ConcurrencyCheck]
        public uint RowVersion { get; private set; }
        /// 
        /// Gets a collection containing the group's permissions.
        /// 
        public virtual ICollection Permissions { get; private set; }
        /// 
        /// Gets a collection containing the group's preferences.
        /// 
        public virtual ICollection Preferences { get; private set; }
        /// 
        public bool HasPermission(PermissionKind kind)
        {
            return Permissions.First(p => p.Kind == kind).Value;
        }
        /// 
        public void SetPermission(PermissionKind kind, bool value)
        {
            Permissions.First(p => p.Kind == kind).Value = value;
        }
        /// 
        public void OnSavingChanges()
        {
            RowVersion++;
        }
    }
}