"""
Модель геолокационных данных.
"""
from django.contrib.gis.db import models as gis
from django.db import models


class Geo(models.Model):
    """
    Модель геолокационных данных.

    Хранит информацию о местоположении источника сигнала, включая координаты,
    данные от различных источников (геолокация, кубсат, оперативники) и расстояния между ними.
    """

    # Основные поля
    timestamp = models.DateTimeField(
        null=True,
        blank=True,
        verbose_name="Время",
        db_index=True,
        help_text="Время фиксации геолокации",
    )
    location = models.CharField(
        max_length=255,
        null=True,
        blank=True,
        verbose_name="Местоположение",
        help_text="Текстовое описание местоположения",
    )
    comment = models.CharField(
        max_length=255,
        blank=True,
        verbose_name="Комментарий",
        help_text="Дополнительные комментарии",
    )
    is_average = models.BooleanField(
        null=True,
        blank=True,
        verbose_name="Усреднённое",
        help_text="Является ли координата усредненной",
    )

    # Координаты
    coords = gis.PointField(
        srid=4326,
        null=True,
        blank=True,
        verbose_name="Координата геолокации",
        help_text="Основные координаты геолокации (WGS84)",
    )

    # Связи
    mirrors = models.ManyToManyField(
        'mainapp.Satellite',
        related_name="geo_mirrors",
        verbose_name="Зеркала",
        blank=True,
        help_text="Спутники-зеркала, использованные для приема",
    )
    objitem = models.OneToOneField(
        'mainapp.ObjItem',
        on_delete=models.CASCADE,
        verbose_name="Объект",
        related_name="geo_obj",
        null=True,
        help_text="Связанный объект",
    )

    def __str__(self):
        if self.coords:
            longitude = self.coords.coords[0]
            latitude = self.coords.coords[1]
            lon = f"{longitude}E" if longitude > 0 else f"{abs(longitude)}W"
            lat = f"{latitude}N" if latitude > 0 else f"{abs(latitude)}S"
            location_str = f", {self.location}" if self.location else ""
            return f"{lat} {lon}{location_str}"
        return f"Гео #{self.pk}"

    class Meta:
        verbose_name = "Гео"
        verbose_name_plural = "Гео"
        ordering = ["-timestamp"]
        indexes = [
            models.Index(fields=["-timestamp"]),
            models.Index(fields=["location"]),
        ]
        constraints = [
            models.UniqueConstraint(
                fields=["timestamp", "coords"], name="unique_geo_combination"
            )
        ]
