import random
from datetime import timedelta
from django.core.management.base import BaseCommand
from django.utils import timezone
from django.contrib.auth import get_user_model
from django.core.files.base import ContentFile

from letters.models import Letter, LetterCategory

try:
    from references.models import Penduduk
except Exception:
    Penduduk = None


class Command(BaseCommand):
    help = 'Generate dummy letters (masuk/keluar) with attachments, categories, and residents'

    def add_arguments(self, parser):
        parser.add_argument('--count', type=int, default=30, help='Total letters to create')

    def handle(self, *args, **options):
        User = get_user_model()
        total = options['count']
        created = 0

        # Ensure a user exists
        user = User.objects.first()
        if not user:
            user = User.objects.create_user(username='admin', password='admin123', is_staff=True, is_superuser=True)

        # Ensure some categories exist
        default_categories = ['Umum', 'Undangan', 'Pemberitahuan', 'Keterangan']
        for name in default_categories:
            LetterCategory.objects.get_or_create(name=name)
        categories_db = list(LetterCategory.objects.filter(is_active=True))
        statuses = [s[0] for s in Letter.STATUS_CHOICES]
        types = [t[0] for t in Letter.LETTER_TYPE_CHOICES]

        # Prepare sample attachment content (PDF header minimal)
        sample_pdf = b'%PDF-1.4\n%\xe2\xe3\xcf\xd3\n1 0 obj\n<<>>\nendobj\ntrailer\n<<>>\n%%EOF'

        residents = []
        if Penduduk is not None:
            residents = list(Penduduk.objects.all()[:50])

        for i in range(total):
            letter_type = random.choice(types)
            category_obj = random.choice(categories_db) if categories_db else None
            status = random.choice(statuses)
            title = f"Surat {letter_type.title()} Dummy #{i+1}"
            description = f"Ini adalah deskripsi dummy untuk {title} kategori {category_obj.name if category_obj else 'Umum'}."

            # Pre-assign a unique letter number to avoid collisions with model auto-number
            unique_suffix = random.randint(100, 999)
            manual_number = f"{i+1:03d}/DUM/{timezone.now().strftime('%m/%Y')}-{unique_suffix}"

            letter = Letter(
                title=title,
                letter_type=letter_type,
                category_fk=category_obj,
                description=description,
                status=status,
                created_by=user,
                letter_number=manual_number,
            )

            # Assign resident if available sometimes
            if residents and random.random() < 0.7:
                letter.resident = random.choice(residents)
            else:
                letter.resident_name_manual = random.choice([
                    'Budi Santoso', 'Siti Aminah', 'Rahmad Hidayat', 'Dewi Lestari', 'Joko Prabowo'
                ])

            # Save
            letter.save()

            # Attach a tiny PDF file named based on letter number
            filename = f"{letter.letter_number.replace('/', '_')}.pdf"
            letter.document_file.save(filename, ContentFile(sample_pdf), save=True)

            # Randomize created_date a bit
            offset_days = random.randint(0, 60)
            letter.created_date = timezone.now() - timedelta(days=offset_days)
            letter.save(update_fields=['created_date'])

            created += 1

        self.stdout.write(self.style.SUCCESS(f"Created {created} dummy letters"))


