import logging

from django.db import models
from asgiref.sync import sync_to_async
from channels.layers import get_channel_layer

from authentication.models import ExtendedUser


class SystemEvent(models.Model):
    TYPE_CHOICES = [('ticket_created', 'ticket_created'),
                    ('ticket_updated', 'ticket_updated'),
                    ('ticket_deleted', 'ticket_deleted'),
                    ('item_created', 'item_created'),
                    ('item_updated', 'item_updated'),
                    ('item_deleted', 'item_deleted'),
                    ('user_created', 'user_created'),
                    ('event_created', 'event_created'),
                    ('event_updated', 'event_updated'),
                    ('event_deleted', 'event_deleted'), ]
    id = models.AutoField(primary_key=True)
    timestamp = models.DateTimeField(auto_now_add=True)
    user = models.ForeignKey(ExtendedUser, models.SET_NULL, null=True)
    type = models.CharField(max_length=255, choices=TYPE_CHOICES)
    reference = models.IntegerField(blank=True, null=True)


async def trigger_event(user, type, reference=None):
    log = logging.getLogger('server.log')
    log.info(f"Triggering event {type} for user {user} with reference {reference}")
    try:
        event = await sync_to_async(SystemEvent.objects.create, thread_sensitive=True)(user=user, type=type,
                                                                                       reference=reference)
        channel_layer = get_channel_layer()
        await channel_layer.group_send(
            'general',
            {
                'type': 'generic.event',
                'name': 'send_message_to_frontend',
                'message': "event_trigered_from_views",
                'event_id': event.id,
            }
        )
        log.info(f"SystemEvent {event.id} triggered")
        return event
    except Exception as e:
        log.error(e)
        raise e