from typing import Union

from django.contrib.auth import get_user_model

from rules import predicate

from .models import Event, EventRegistration, Voucher

User = get_user_model()


@predicate
def is_own_voucher(user: User, obj: Voucher) -> bool:
    """Predicate which checks if the voucher belongs to the user."""
    return obj.person == user.person


@predicate
def is_own_registration(user: User, obj: EventRegistration) -> bool:
    """Predicate which checks if the registration belongs to the user."""
    return obj.person == user.person


@predicate
def is_organiser(user: User, obj: Union[Event, EventRegistration]) -> bool:
    """Predicate which checks if the user is an organiser."""
    if isinstance(obj, EventRegistration):
        event = obj.event
    elif isinstance(obj, Event):
        event = obj
    else:
        raise TypeError("This predicate can only check Event and EventRegistration.")

    return user.person in event.linked_group.owners.all()


@predicate
def is_event_published(user: User, obj: EventRegistration) -> bool:
    """Predicate which checks if the event is published."""
    return obj.published


@predicate
def is_participant(user: User, obj: Event) -> bool:
    """Predicate which checks if the user is member of the event."""
    return user.person in obj.linked_group.members.all()