from django.db.models import Q

from aleksis.apps.matrix.models import MatrixProfile, MatrixRoom
from aleksis.core.models import Group

from .tasks import sync_room


def post_save_matrix_signal(sender, instance, created, **kwargs):
    """Sync Matrix room after changing a group/Matrix room/Matrix profile."""
    rooms = []
    if isinstance(instance, Group):
        rooms = MatrixRoom.objects.filter(group=instance)
    elif isinstance(instance, MatrixRoom) and instance.change_tracker.has_changed("group_id"):
        rooms = [instance]
    elif isinstance(instance, MatrixProfile) and instance.change_tracker.changed():
        rooms = MatrixRoom.objects.filter(
            Q(group__members=instance.person) | Q(group__owners=instance.person)
        ).distinct()

    for room in rooms:
        sync_room.delay(room.pk)


def m2m_changed_matrix_signal(sender, instance, action, reverse, model, pk_set, **kwargs):
    """Sync Matrix room after changing group member- and ownerships."""
    if action not in ("post_add", "post_remove", "post_clear"):
        return

    if isinstance(instance, Group):
        groups = [instance]
    else:
        groups = Group.objects.filter(Q(members=instance) | Q(owners=instance)).distinct()

    for room in MatrixRoom.objects.filter(group__in=groups):
        sync_room.delay(room.pk)