from django.db import models
from django.utils import timezone

from Members.models import Member


class Attendance(models.Model):
    SOURCE_CHOICES = [
        ('internal', 'Internal App'),
        ('winapp', 'Windows App'),
        ('manual', 'Manual'),
        ('rfid', 'RFID'),
        ('other', 'Other'),
    ]

    member = models.ForeignKey(
        Member,
        on_delete=models.PROTECT,
        related_name='attendances',
    )
    entry_at = models.DateTimeField(default=timezone.now)
    exit_at = models.DateTimeField(null=True, blank=True)
    entry_event_id = models.UUIDField(null=True, blank=True, unique=True)
    exit_event_id = models.UUIDField(null=True, blank=True, unique=True)
    entry_source = models.CharField(
        max_length=20,
        choices=SOURCE_CHOICES,
        default='internal',
    )
    exit_source = models.CharField(
        max_length=20,
        choices=SOURCE_CHOICES,
        null=True,
        blank=True,
    )
    entry_device = models.CharField(max_length=100, blank=True, default='')
    exit_device = models.CharField(max_length=100, blank=True, default='')
    notes = models.CharField(max_length=500, blank=True, default='')

    class Meta:
        ordering = ('-entry_at',)
        constraints = [
            models.UniqueConstraint(
                fields=('member',),
                condition=models.Q(exit_at__isnull=True),
                name='one_open_attendance_per_member',
            ),
        ]
        indexes = [
            models.Index(fields=('member', '-entry_at')),
            models.Index(fields=('-entry_at',)),
        ]

    def __str__(self):
        return f'{self.member} - {self.entry_at}'

    @property
    def is_inside(self):
        return self.exit_at is None

    @property
    def duration_seconds(self):
        if not self.exit_at:
            return None
        return int((self.exit_at - self.entry_at).total_seconds())
