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


class PageVisit(models.Model):
    path = models.CharField(max_length=500)
    ip_address = models.GenericIPAddressField(blank=True, null=True)
    user_agent = models.CharField(max_length=500, blank=True)
    referrer = models.URLField(max_length=500, blank=True)
    session_key = models.CharField(max_length=64, blank=True)
    country = models.CharField(max_length=80, blank=True)
    is_bot = models.BooleanField(default=False)
    device_type = models.CharField(max_length=20, blank=True)
    browser = models.CharField(max_length=60, blank=True)
    os = models.CharField(max_length=60, blank=True)
    visited_at = models.DateTimeField(auto_now_add=True)

    class Meta:
        ordering = ['-visited_at']
        indexes = [
            models.Index(fields=['-visited_at']),
            models.Index(fields=['session_key']),
        ]

    def __str__(self):
        return f"{self.path} @ {self.visited_at:%Y-%m-%d %H:%M}"


class VisitorStat(models.Model):
    date = models.DateField(unique=True)
    total_visits = models.PositiveIntegerField(default=0)
    unique_visitors = models.PositiveIntegerField(default=0)
    leads_captured = models.PositiveIntegerField(default=0)

    class Meta:
        ordering = ['-date']

    def __str__(self):
        return f"{self.date} - {self.total_visits} visits"

    @classmethod
    def get_summary(cls):
        now = timezone.now()
        today_start = now.replace(hour=0, minute=0, second=0, microsecond=0)
        last_5min = now - timedelta(minutes=5)
        last_24h = now - timedelta(hours=24)

        online_now = PageVisit.objects.filter(
            visited_at__gte=last_5min
        ).values('session_key').distinct().count()

        today_visits = PageVisit.objects.filter(visited_at__gte=today_start).count()
        last_24h_visits = PageVisit.objects.filter(visited_at__gte=last_24h).count()
        total_visits = PageVisit.objects.count()

        return {
            'online_now': online_now,
            'today_visits': today_visits,
            'last_24h_visits': last_24h_visits,
            'total_visits': total_visits,
        }


class VisitorProfile(models.Model):
    """One record per browser session — built up across page visits."""
    session_key = models.CharField(max_length=64, unique=True, db_index=True)
    ip_address = models.GenericIPAddressField(blank=True, null=True)
    user_agent = models.CharField(max_length=500, blank=True)
    device_type = models.CharField(max_length=20, blank=True)
    browser = models.CharField(max_length=60, blank=True)
    os = models.CharField(max_length=60, blank=True)
    referrer = models.URLField(max_length=500, blank=True)

    pages_count = models.PositiveIntegerField(default=0)
    pages_list = models.JSONField(default=list, help_text='Last 30 paths visited')

    # Revealed identity (from any form, chatbot, popup, etc.)
    email = models.EmailField(blank=True)
    name = models.CharField(max_length=120, blank=True)
    phone = models.CharField(max_length=30, blank=True)

    # Conversion
    lead = models.ForeignKey(
        'leads.Lead', on_delete=models.SET_NULL,
        null=True, blank=True, related_name='visitor_profiles'
    )
    converted = models.BooleanField(default=False)

    first_seen = models.DateTimeField(auto_now_add=True)
    last_seen = models.DateTimeField(auto_now=True)

    class Meta:
        ordering = ['-last_seen']

    def __str__(self):
        label = self.email or self.name or str(self.ip_address) or self.session_key[:8]
        return f"{label} — {self.pages_count} pages"

    @property
    def identity(self):
        return self.email or self.name or self.phone or None
