using Disco.Services.Users;
using Microsoft.AspNet.SignalR;
using System;
using System.Security.Principal;

namespace Disco.Services.Web.Signalling
{
    [AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, Inherited = true, AllowMultiple = true)]
    public class DiscoHubAuthorizeAllAttribute : AuthorizeAttribute
    {
        string[] authorizedClaims;

        public DiscoHubAuthorizeAllAttribute(params string[] AuthorisedClaims)
        {
            if (AuthorisedClaims == null || AuthorisedClaims.Length == 0)
                throw new ArgumentNullException("AuthorisedClaims");

            authorizedClaims = AuthorisedClaims;
        }

        protected override bool UserAuthorized(IPrincipal user)
        {
            if (user == null || !user.Identity.IsAuthenticated)
                return false;

            var username = user.Identity.Name;
            var userToken = UserService.GetAuthorization(username);

            if (userToken == null)
                return false; // No User

            return userToken.HasAll(authorizedClaims);
        }
    }
}
