"""
Management command to backfill usage tracking for existing content.
Usage: python manage.py backfill_usage [account_id]
"""
from django.core.management.base import BaseCommand
from django.apps import apps
from django.db import transaction
from igny8_core.auth.models import Account


class Command(BaseCommand):
    help = 'Backfill usage tracking for existing content'

    def add_arguments(self, parser):
        parser.add_argument(
            'account_id',
            nargs='?',
            type=int,
            help='Account ID to backfill (optional, processes all accounts if not provided)'
        )

    def handle(self, *args, **options):
        account_id = options.get('account_id')
        
        if account_id:
            accounts = Account.objects.filter(id=account_id).select_related('plan')
            if not accounts.exists():
                self.stdout.write(self.style.ERROR(f'Account {account_id} not found'))
                return
        else:
            accounts = Account.objects.filter(plan__isnull=False).select_related('plan')
        
        ContentIdeas = apps.get_model('planner', 'ContentIdeas')
        Content = apps.get_model('writer', 'Content')
        Images = apps.get_model('writer', 'Images')
        
        total_accounts = accounts.count()
        self.stdout.write(f'Processing {total_accounts} account(s)...\n')
        
        for account in accounts:
            self.stdout.write('=' * 60)
            self.stdout.write(f'Account: {account.name} (ID: {account.id})')
            self.stdout.write(f'Plan: {account.plan.name if account.plan else "No Plan"}')
            self.stdout.write('=' * 60)
            
            # Count content ideas
            ideas_count = ContentIdeas.objects.filter(account=account).count()
            self.stdout.write(f'Content Ideas: {ideas_count}')
            
            # Count content words
            from django.db.models import Sum
            total_words = Content.objects.filter(account=account).aggregate(
                total=Sum('word_count')
            )['total'] or 0
            self.stdout.write(f'Content Words: {total_words}')
            
            # Count images
            total_images = Images.objects.filter(account=account).count()
            images_with_prompts = Images.objects.filter(
                account=account, prompt__isnull=False
            ).exclude(prompt='').count()
            self.stdout.write(f'Total Images: {total_images}')
            self.stdout.write(f'Images with Prompts: {images_with_prompts}')
            
            # Update account usage fields
            with transaction.atomic():
                account.usage_content_ideas = ideas_count
                account.usage_content_words = total_words
                account.usage_images_basic = total_images
                account.usage_images_premium = 0  # Premium not implemented yet
                account.usage_image_prompts = images_with_prompts
                account.save(update_fields=[
                    'usage_content_ideas', 'usage_content_words',
                    'usage_images_basic', 'usage_images_premium', 'usage_image_prompts',
                    'updated_at'
                ])
            
            self.stdout.write(self.style.SUCCESS('\n✅ Updated usage tracking:'))
            self.stdout.write(f'  usage_content_ideas: {account.usage_content_ideas}')
            self.stdout.write(f'  usage_content_words: {account.usage_content_words}')
            self.stdout.write(f'  usage_images_basic: {account.usage_images_basic}')
            self.stdout.write(f'  usage_images_premium: {account.usage_images_premium}')
            self.stdout.write(f'  usage_image_prompts: {account.usage_image_prompts}\n')
        
        self.stdout.write('=' * 60)
        self.stdout.write(self.style.SUCCESS('✅ Backfill complete!'))
        self.stdout.write('=' * 60)
