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


class Device(models.Model):
    device_id = models.CharField(max_length=64, unique=True)
    name = models.CharField(max_length=128, blank=True)
    api_key = models.CharField(max_length=64, blank=True)
    is_active = models.BooleanField(default=True)
    created_at = models.DateTimeField(auto_now_add=True)
    last_seen = models.DateTimeField(null=True, blank=True)

    class Meta:
        ordering = ["-last_seen", "device_id"]

    def __str__(self):
        return self.name or self.device_id

    @property
    def latest_location(self):
        return self.locations.order_by("-recorded_at").first()


class LocationPoint(models.Model):
    device = models.ForeignKey(
        Device,
        on_delete=models.CASCADE,
        related_name="locations",
    )
    latitude = models.DecimalField(max_digits=10, decimal_places=7, null=True, blank=True)
    longitude = models.DecimalField(max_digits=10, decimal_places=7, null=True, blank=True)
    altitude = models.FloatField(null=True, blank=True)
    speed = models.FloatField(null=True, blank=True, help_text="Speed in km/h")
    satellites = models.PositiveSmallIntegerField(null=True, blank=True)
    fix_valid = models.BooleanField(default=False)
    chars_processed = models.PositiveIntegerField(null=True, blank=True)
    gps_date = models.DateField(null=True, blank=True)
    gps_time = models.TimeField(null=True, blank=True)
    recorded_at = models.DateTimeField(default=timezone.now, db_index=True)

    class Meta:
        ordering = ["-recorded_at"]
        indexes = [
            models.Index(fields=["device", "-recorded_at"]),
        ]

    def __str__(self):
        if self.latitude is not None and self.longitude is not None:
            return f"{self.device.device_id} @ {self.latitude}, {self.longitude}"
        return f"{self.device.device_id} (no fix)"
