from django.db import models
from django.core.mail import send_mail
from django.conf import settings
from django.utils import timezone

from cloudinary.models import CloudinaryField


# shipping/models.py
from datetime import datetime
from django.db import models
from django.core.mail import send_mail
from django.conf import settings
from cloudinary.models import CloudinaryField

class ShippingDetail(models.Model):
    class Mode(models.TextChoices):
        ROAD = "road", "Road"
        AIR  = "air",  "Air"

    class Status(models.TextChoices):
        HOLD      = "hold",      "On Hold"
        DELAYED   = "delayed",   "Delayed"
        MOVING    = "moving",    "In Transit"
        DELIVERED = "delivered", "Delivered"

    client_name      = models.CharField(max_length=50)
    email_address    = models.EmailField(max_length=150, unique=True)
    shipping_address = models.CharField(max_length=200)
    phone_number     = models.CharField(max_length=20)
    product_name     = models.CharField(max_length=20, help_text="Enter the product's name here")
    product_photo    = CloudinaryField("products")
    shipping_fee     = models.IntegerField(default=0, editable=False, help_text="Enter the charge for the shipping")
    tracking_number  = models.CharField(max_length=32, unique=True, help_text="Public tracking code")
    shipping_progress = models.PositiveSmallIntegerField(default=10, help_text="0..100")
    delivered        = models.BooleanField(default=False)

    # NEW
    origin           = models.CharField(max_length=120, default="Origin")
    destination      = models.CharField(max_length=120, default="Destination")
    mode             = models.CharField(max_length=8, choices=Mode.choices, default=Mode.ROAD)
    status           = models.CharField(max_length=10, choices=Status.choices, default=Status.MOVING)
    note             = models.CharField(max_length=200, blank=True)
    updated_at       = models.DateTimeField(auto_now=True)
    arrival_date     = models.DateField(default=datetime.now)

    # Utility props used by the template
    @property
    def progress_clamped(self) -> int:
        p = max(0, min(100, int(self.shipping_progress)))
        return 100 if self.delivered else p

    @property
    def route_color(self) -> str:
        return {
            self.Status.HOLD:      "#E53935",  # red
            self.Status.DELAYED:   "#F6C026",  # yellow
            self.Status.MOVING:    "#23B26D",  # green
            self.Status.DELIVERED: "#23B26D",  # green
        }[self.status]

    @property
    def status_text(self) -> str:
        return dict(self.Status.choices)[self.status]

    def save(self, *args, **kwargs):
        is_new = self.pk is None
        # Keep delivered/progress consistent
        if self.shipping_progress >= 100 or self.delivered:
            self.shipping_progress = 100
            self.delivered = True
            self.status = self.Status.DELIVERED

        super().save(*args, **kwargs)

        if is_new:
            try:
                send_mail(
                    "Shipping Process Initiated",
                    (
                        f"Hello {self.client_name}, the processing of shipping '{self.product_name}' "
                        f"to '{self.shipping_address}' has started. Your tracking code is '{self.tracking_number}'. Arrival date: {self.arrival_date}"
                        f"Track at https://vanlineslogisko.ltd/track-shipping/ ."
                    ),
                    settings.EMAIL_HOST_USER,
                    [self.email_address],
                )
            except Exception as e:
                print(f"Error sending email: {e}")

    def __str__(self):
        return f"{self.client_name} - {self.tracking_number}"
        


class TrackingEvent(models.Model):
    shipment = models.ForeignKey(
        "ShippingDetail",
        on_delete=models.CASCADE,
        related_name="tracking_events",
    )
    title = models.CharField(max_length=200)
    description = models.TextField(blank=True)
    location = models.CharField(max_length=200, blank=True)
    event_time = models.DateTimeField(
        default=timezone.now,
        help_text="The actual date and time of this shipping event.",
    )
    created_at = models.DateTimeField(auto_now_add=True)

    class Meta:
        ordering = ["-event_time", "-id"]
        verbose_name = "Tracking Event"
        verbose_name_plural = "Tracking Events"

    def __str__(self):
        return f"{self.shipment.tracking_number} — {self.title}"


