from django.core.exceptions import ValidationError
from django.dispatch import receiver

from apps.organization.lifecycle_events import assignment_validating, assignments_deactivating
from .models import UserRoleAssignment


@receiver(assignment_validating, dispatch_uid="access.validate_organization_assignment")
def validate_assignment(sender, *, instance, **kwargs):
    if not instance.is_active and instance.pk and UserRoleAssignment.objects.filter(
        organization_assignment_id=instance.pk, is_active=True,
    ).exists():
        raise ValidationError({"is_active": "Active role assignments exist. Use the assignment deactivation service/action."})


@receiver(assignments_deactivating, dispatch_uid="access.end_organization_roles")
def end_assignment_roles(sender, *, assignment_ids, timestamp, **kwargs):
    UserRoleAssignment.objects.filter(organization_assignment_id__in=assignment_ids, is_active=True).update(
        is_active=False, updated_at=timestamp,
    )
