"""
Management command to send the weekly "picks for you" newsletter digest.
Run with: python manage.py send_weekly_digest

Intended to run on a weekly schedule (see the `scheduler` service in
docker-compose.yml, which loops this command every 7 days) rather than
being invoked manually in normal operation.
"""

from django.conf import settings
from django.core.management.base import BaseCommand
from django.utils import timezone

from business.models import NewsletterSubscriber
from business.utils import get_suggested_businesses
from authentication.utils import send_weekly_digest_email


class Command(BaseCommand):
    help = 'Send the weekly newsletter digest to all active subscribers'

    def handle(self, *args, **options):
        subscribers = NewsletterSubscriber.objects.filter(is_active=True).select_related('user')
        total = subscribers.count()
        self.stdout.write(f'Sending weekly digest to {total} active subscriber(s)...')

        sent, failed = 0, 0
        for subscriber in subscribers:
            businesses_qs, basis = get_suggested_businesses(user=subscriber.user, limit=5)
            businesses = [
                {
                    'title': b.title,
                    'category': (b.get_categories().first().name if b.get_categories().exists() else 'Business'),
                    'rating': float(b.average_rating or 0),
                    'rating_rounded': round(float(b.average_rating or 0)),
                    'url': f"{settings.FRONTEND_URL}/business/{b.slug}",
                }
                for b in businesses_qs
            ]

            first_name = subscriber.user.first_name if subscriber.user and subscriber.user.first_name else 'there'
            unsubscribe_url = f"{settings.BACKEND_URL}/api/business/newsletter/unsubscribe/{subscriber.unsubscribe_token}/"

            ok = send_weekly_digest_email(
                email=subscriber.email,
                first_name=first_name,
                businesses=businesses,
                unsubscribe_url=unsubscribe_url,
                personalized=(basis == 'interest'),
            )

            if ok:
                sent += 1
                subscriber.last_digest_sent_at = timezone.now()
                subscriber.save(update_fields=['last_digest_sent_at'])
            else:
                failed += 1

        self.stdout.write(self.style.SUCCESS(f'Done! Sent {sent}, failed {failed}, out of {total}.'))
