from django.core.management.base import BaseCommand
from django.utils import timezone
from payments.models import VendorSubscription


class Command(BaseCommand):
    help = 'Expire vendor subscriptions that have passed their expiry date'

    def _hide_excess(self, queryset, keep_count, hide_status='paused'):
        """Keep the first `keep_count` items active (by created_at), hide the rest."""
        active_items = queryset.filter(status='active').order_by('created_at')
        ids_to_keep = list(active_items.values_list('id', flat=True)[:keep_count])
        hidden = active_items.exclude(id__in=ids_to_keep).update(status=hide_status)
        return hidden

    def handle(self, *args, **options):
        now = timezone.now()
        expired_subs = VendorSubscription.objects.filter(
            is_active=True,
            expires_at__lte=now,
        ).select_related('vendor')

        count = 0
        total_hidden = {'products': 0, 'services': 0, 'menus': 0, 'events': 0}

        for sub in expired_subs:
            sub.is_active = False
            sub.save()

            vendor = sub.vendor
            vendor.is_upgraded = False
            vendor.save()

            # Hide excess items beyond free plan limits (keep oldest ones visible)
            total_hidden['products'] += self._hide_excess(
                vendor.products, vendor.max_products, 'paused'
            )
            total_hidden['services'] += self._hide_excess(
                vendor.services, vendor.max_services, 'paused'
            )
            total_hidden['menus'] += self._hide_excess(
                vendor.menus, vendor.max_menus, 'inactive'
            )
            total_hidden['events'] += self._hide_excess(
                vendor.events, vendor.max_events, 'draft'
            )

            count += 1

        self.stdout.write(self.style.SUCCESS(
            f'Expired {count} subscription(s). '
            f'Hidden: {total_hidden["products"]} products, '
            f'{total_hidden["services"]} services, '
            f'{total_hidden["menus"]} menus, '
            f'{total_hidden["events"]} events.'
        ))
