from django.db import models


class Address(models.Model):
    """
    Модель адреса доставки.
    Адрес может использоваться в разных заказах и для разных получателей.
    """
    street = models.CharField(
        max_length=255,
        blank=True,
        null=True,
        verbose_name="Улица"
    )

    building_number = models.CharField(
        max_length=20,
        blank=True,
        null=True,
        verbose_name="Номер здания"
    )

    apartment_number = models.CharField(
        max_length=20,
        blank=True,
        null=True,
        verbose_name="Номер квартиры/офиса"
    )

    entrance = models.CharField(
        max_length=20,
        blank=True,
        null=True,
        verbose_name="Подъезд",
        help_text="Номер подъезда/входа"
    )

    floor = models.CharField(
        max_length=20,
        blank=True,
        null=True,
        verbose_name="Этаж"
    )

    intercom_code = models.CharField(
        max_length=100,
        blank=True,
        null=True,
        verbose_name="Код домофона",
        help_text="Код домофона для входа в здание"
    )

    # Дополнительная информация для доставки
    delivery_instructions = models.TextField(
        blank=True,
        null=True,
        verbose_name="Инструкции для доставки",
        help_text="Дополнительные инструкции для курьера"
    )

    confirm_address_with_recipient = models.BooleanField(
        default=False,
        verbose_name="Уточнить адрес у получателя",
        help_text="Курьер должен уточнить адрес у получателя перед доставкой"
    )

    # Временные метки
    created_at = models.DateTimeField(auto_now_add=True, verbose_name="Дата создания")
    updated_at = models.DateTimeField(auto_now=True, verbose_name="Дата обновления")

    class Meta:
        verbose_name = "Адрес доставки"
        verbose_name_plural = "Адреса доставки"
        indexes = [
            models.Index(fields=['created_at']),
        ]
        ordering = ['-created_at']

    def __str__(self):
        # Собираем компоненты адреса
        address_parts = []
        if self.street:
            address_parts.append(self.street)
        if self.building_number:
            address_parts.append(self.building_number)
        if self.apartment_number:
            address_parts.append(f"кв/офис {self.apartment_number}")

        return ", ".join(address_parts) if address_parts else "Адрес не указан"

    @property
    def full_address(self):
        """Полный адрес для доставки"""
        # Собираем основные компоненты адреса
        address_parts = []
        if self.street:
            address_parts.append(self.street)
        if self.building_number:
            address_parts.append(self.building_number)

        # Если нет основных данных, возвращаем сообщение
        if not address_parts:
            return "Адрес не указан"

        address = ", ".join(address_parts)

        # Добавляем квартиру/офис
        if self.apartment_number:
            address += f", кв/офис {self.apartment_number}"

        # Собираем дополнительные детали
        details = []
        if self.entrance:
            details.append(f"подъезд {self.entrance}")
        if self.floor:
            details.append(f"этаж {self.floor}")
        if details:
            address += f" ({', '.join(details)})"

        return address
