from django.core.management.base import BaseCommand
from django.utils import timezone
from datetime import timedelta
from crb.models import CreditEnquiry, CreditReport, KYCEnquiry, KYCReport


class Command(BaseCommand):
    help = 'Manage CRB cache - cleanup old entries and display statistics'

    def add_arguments(self, parser):
        parser.add_argument(
            '--cleanup',
            action='store_true',
            help='Delete cache entries older than specified days'
        )
        parser.add_argument(
            '--days',
            type=int,
            default=90,
            help='Number of days to keep cache (default: 90)'
        )
        parser.add_argument(
            '--stats',
            action='store_true',
            help='Display cache statistics'
        )

    def handle(self, *args, **options):
        if options['stats']:
            self.display_stats()
        
        if options['cleanup']:
            self.cleanup_cache(options['days'])

    def display_stats(self):
        """Display cache statistics"""
        credit_enquiries = CreditEnquiry.objects.count()
        credit_reports = CreditReport.objects.count()
        kyc_enquiries = KYCEnquiry.objects.count()
        kyc_reports = KYCReport.objects.count()
        
        total = credit_enquiries + credit_reports + kyc_enquiries + kyc_reports
        
        self.stdout.write(self.style.SUCCESS('\n=== CRB Cache Statistics ===\n'))
        self.stdout.write(f'Credit Enquiries: {credit_enquiries}')
        self.stdout.write(f'Credit Reports: {credit_reports}')
        self.stdout.write(f'KYC Enquiries: {kyc_enquiries}')
        self.stdout.write(f'KYC Reports: {kyc_reports}')
        self.stdout.write(self.style.SUCCESS(f'\nTotal Cached Records: {total}'))
        
        # Get oldest record age
        oldest_credit_e = CreditEnquiry.objects.order_by('created_at').first()
        oldest_credit_r = CreditReport.objects.order_by('created_at').first()
        oldest_kyc_e = KYCEnquiry.objects.order_by('created_at').first()
        oldest_kyc_r = KYCReport.objects.order_by('created_at').first()
        
        oldest_records = [
            oldest_credit_e.created_at if oldest_credit_e else None,
            oldest_credit_r.created_at if oldest_credit_r else None,
            oldest_kyc_e.created_at if oldest_kyc_e else None,
            oldest_kyc_r.created_at if oldest_kyc_r else None,
        ]
        oldest_records = [d for d in oldest_records if d]
        
        if oldest_records:
            oldest = min(oldest_records)
            age = timezone.now() - oldest
            self.stdout.write(f'\nOldest cache entry: {oldest} ({age.days} days ago)\n')

    def cleanup_cache(self, days):
        """Delete cache entries older than specified days"""
        cutoff_date = timezone.now() - timedelta(days=days)
        
        credit_e_deleted, _ = CreditEnquiry.objects.filter(created_at__lt=cutoff_date).delete()
        credit_r_deleted, _ = CreditReport.objects.filter(created_at__lt=cutoff_date).delete()
        kyc_e_deleted, _ = KYCEnquiry.objects.filter(created_at__lt=cutoff_date).delete()
        kyc_r_deleted, _ = KYCReport.objects.filter(created_at__lt=cutoff_date).delete()
        
        total_deleted = credit_e_deleted + credit_r_deleted + kyc_e_deleted + kyc_r_deleted
        
        self.stdout.write(self.style.SUCCESS(f'\n=== Cache Cleanup Results ===\n'))
        self.stdout.write(f'Credit Enquiries deleted: {credit_e_deleted}')
        self.stdout.write(f'Credit Reports deleted: {credit_r_deleted}')
        self.stdout.write(f'KYC Enquiries deleted: {kyc_e_deleted}')
        self.stdout.write(f'KYC Reports deleted: {kyc_r_deleted}')
        self.stdout.write(self.style.SUCCESS(f'\nTotal records deleted: {total_deleted}'))
        self.stdout.write(f'Cutoff date: {cutoff_date}\n')
