#!/usr/bin/env python
"""
Django management command untuk membuat data dummy documents
Membuat dokumen dan semua data terkait
"""

from django.core.management.base import BaseCommand
from django.db import transaction
from django.contrib.auth import get_user_model
from django.utils import timezone
from datetime import timedelta
from documents.models import (
    DocumentCategory, Document, DocumentComment, DocumentDownloadLog
)
import random
from faker import Faker
import os

User = get_user_model()
fake = Faker('id_ID')

class Command(BaseCommand):
    help = 'Create dummy data for documents app including documents and all related data'

    def add_arguments(self, parser):
        parser.add_argument(
            '--document-count',
            type=int,
            default=100,
            help='Number of documents to create (default: 100)'
        )
        parser.add_argument(
            '--clear-existing',
            action='store_true',
            help='Clear existing data before creating new data'
        )

    def handle(self, *args, **options):
        document_count = options['document_count']
        clear_existing = options['clear_existing']
        
        self.stdout.write(
            self.style.SUCCESS(f'Creating dummy data for {document_count} documents...')
        )
        
        if clear_existing:
            self.clear_existing_data()
        
        with transaction.atomic():
            # 1. Create DocumentCategory
            categories = self.create_document_categories()
            
            # 2. Create Document
            documents = self.create_documents(document_count, categories)
            
            # 3. Create DocumentComment
            self.create_document_comments(documents)
            
            # 4. Create DocumentDownloadLog
            self.create_document_download_logs(documents)

        self.stdout.write(
            self.style.SUCCESS('Successfully created all dummy data!')
        )

    def clear_existing_data(self):
        """Clear existing data"""
        self.stdout.write('Clearing existing data...')
        
        # Delete in reverse order to avoid foreign key constraints
        DocumentDownloadLog.objects.all().delete()
        DocumentComment.objects.all().delete()
        Document.objects.all().delete()
        DocumentCategory.objects.all().delete()

    def create_document_categories(self):
        """Create DocumentCategory data"""
        self.stdout.write('Creating DocumentCategory...')
        
        categories_data = [
            {
                'name': 'APBDES 2025',
                'category_type': 'apbdes',
                'description': 'Anggaran Pendapatan dan Belanja Desa tahun 2025',
                'icon': 'fa-chart-pie',
                'display_order': 1
            },
            {
                'name': 'Laporan Realisasi Anggaran',
                'category_type': 'realisasi_anggaran',
                'description': 'Laporan realisasi anggaran desa per triwulan',
                'icon': 'fa-chart-bar',
                'display_order': 2
            },
            {
                'name': 'Info Dana Desa',
                'category_type': 'dana_desa',
                'description': 'Informasi Dana Desa dan Alokasi Dana Desa',
                'icon': 'fa-money-bill-wave',
                'display_order': 3
            },
            {
                'name': 'Peraturan Desa',
                'category_type': 'perdes',
                'description': 'Peraturan Desa yang berlaku',
                'icon': 'fa-gavel',
                'display_order': 4
            },
            {
                'name': 'Peraturan Kepala Desa',
                'category_type': 'perkades',
                'description': 'Peraturan Kepala Desa',
                'icon': 'fa-file-contract',
                'display_order': 5
            },
            {
                'name': 'Surat Keputusan',
                'category_type': 'sk_kades',
                'description': 'Surat Keputusan Kepala Desa',
                'icon': 'fa-file-signature',
                'display_order': 6
            },
            {
                'name': 'Profil Desa',
                'category_type': 'profil_desa',
                'description': 'Profil Desa dan Kelurahan (Prodeskel)',
                'icon': 'fa-building',
                'display_order': 7
            },
            {
                'name': 'Data Kependudukan',
                'category_type': 'data_kependudukan',
                'description': 'Data Kependudukan Agregat',
                'icon': 'fa-users',
                'display_order': 8
            },
            {
                'name': 'Peta Desa',
                'category_type': 'peta_desa',
                'description': 'Peta Wilayah Desa',
                'icon': 'fa-map',
                'display_order': 9
            },
            {
                'name': 'LPPD',
                'category_type': 'lppd',
                'description': 'Laporan Penyelenggaraan Pemerintahan Desa',
                'icon': 'fa-clipboard-list',
                'display_order': 10
            },
            {
                'name': 'Musyawarah Desa',
                'category_type': 'musdes',
                'description': 'Notulensi Musyawarah Desa',
                'icon': 'fa-handshake',
                'display_order': 11
            },
            {
                'name': 'Laporan Lainnya',
                'category_type': 'laporan_lainnya',
                'description': 'Laporan dan dokumen lainnya',
                'icon': 'fa-file-alt',
                'display_order': 12
            }
        ]
        
        categories = []
        for category_data in categories_data:
            category, created = DocumentCategory.objects.get_or_create(
                name=category_data['name'],
                defaults={
                    'category_type': category_data['category_type'],
                    'description': category_data['description'],
                    'icon': category_data['icon'],
                    'display_order': category_data['display_order'],
                    'is_active': True
                }
            )
            categories.append(category)
        
        return categories

    def create_documents(self, count, categories):
        """Create Document data"""
        self.stdout.write(f'Creating {count} Document...')
        
        users = list(User.objects.all())
        if not users:
            self.stdout.write(self.style.WARNING('No users found. Creating documents without uploaders.'))
            users = [None]
        
        status_choices = [choice[0] for choice in Document.STATUS_CHOICES]
        
        # Document titles based on categories
        document_titles = {
            'apbdes': [
                'APBDES Desa Pulosarok Tahun 2025',
                'Rencana Anggaran Pendapatan Desa 2025',
                'Anggaran Belanja Desa Tahun 2025',
                'Perubahan APBDES 2025',
                'Penjabaran APBDES 2025'
            ],
            'realisasi_anggaran': [
                'Laporan Realisasi Anggaran Triwulan I 2025',
                'Laporan Realisasi Anggaran Triwulan II 2025',
                'Laporan Realisasi Anggaran Triwulan III 2025',
                'Laporan Realisasi Anggaran Triwulan IV 2025',
                'Laporan Realisasi Anggaran Semester I 2025'
            ],
            'dana_desa': [
                'Info Dana Desa 2025',
                'Alokasi Dana Desa (ADD) 2025',
                'Penggunaan Dana Desa 2025',
                'Laporan Penyerapan Dana Desa',
                'Evaluasi Dana Desa 2025'
            ],
            'perdes': [
                'Peraturan Desa tentang Tata Tertib Desa',
                'Peraturan Desa tentang Retribusi',
                'Peraturan Desa tentang Pajak Bumi dan Bangunan',
                'Peraturan Desa tentang Lembaga Kemasyarakatan',
                'Peraturan Desa tentang Pelayanan Publik'
            ],
            'perkades': [
                'Peraturan Kepala Desa tentang Jam Kerja',
                'Peraturan Kepala Desa tentang Tata Tertib Kantor',
                'Peraturan Kepala Desa tentang Pelayanan Administrasi',
                'Peraturan Kepala Desa tentang Pengelolaan Aset',
                'Peraturan Kepala Desa tentang Keamanan Desa'
            ],
            'sk_kades': [
                'SK Kepala Desa tentang Pengangkatan Perangkat Desa',
                'SK Kepala Desa tentang Pembentukan Tim',
                'SK Kepala Desa tentang Penunjukan Petugas',
                'SK Kepala Desa tentang Pemberhentian Sementara',
                'SK Kepala Desa tentang Penugasan Khusus'
            ],
            'profil_desa': [
                'Profil Desa Pulosarok 2025',
                'Data Profil Desa Terkini',
                'Profil Desa dan Kelurahan (Prodeskel)',
                'Profil Desa Lengkap 2025',
                'Update Profil Desa 2025'
            ],
            'data_kependudukan': [
                'Data Kependudukan Agregat 2025',
                'Statistik Kependudukan Desa',
                'Data Demografi Desa Pulosarok',
                'Laporan Kependudukan Triwulan',
                'Data Penduduk Berdasarkan Usia'
            ],
            'peta_desa': [
                'Peta Wilayah Desa Pulosarok',
                'Peta Administrasi Desa',
                'Peta Potensi Desa',
                'Peta Infrastruktur Desa',
                'Peta Batas Wilayah Desa'
            ],
            'lppd': [
                'LPPD Desa Pulosarok 2024',
                'Laporan Penyelenggaraan Pemerintahan Desa',
                'LPPD Triwulan I 2025',
                'LPPD Triwulan II 2025',
                'LPPD Semester I 2025'
            ],
            'musdes': [
                'Notulensi Musyawarah Desa Januari 2025',
                'Notulensi Musyawarah Desa Februari 2025',
                'Notulensi Musyawarah Desa Maret 2025',
                'Notulensi Musyawarah Desa April 2025',
                'Notulensi Musyawarah Desa Mei 2025'
            ],
            'laporan_lainnya': [
                'Laporan Keuangan Desa',
                'Laporan Kegiatan Desa',
                'Laporan Evaluasi Program',
                'Laporan Monitoring dan Evaluasi',
                'Laporan Akhir Tahun'
            ]
        }
        
        # Document descriptions
        descriptions = [
            'Dokumen resmi desa yang berisi informasi penting untuk transparansi pemerintahan.',
            'Dokumen yang memuat data dan informasi terkini tentang desa.',
            'Laporan yang disusun berdasarkan data dan fakta yang akurat.',
            'Dokumen yang telah diverifikasi dan disahkan oleh pejabat yang berwenang.',
            'Informasi publik yang dapat diakses oleh seluruh masyarakat.',
            'Dokumen yang memenuhi standar transparansi dan akuntabilitas.',
            'Laporan yang disusun secara berkala sesuai dengan ketentuan yang berlaku.',
            'Dokumen yang memuat informasi penting untuk pengambilan keputusan.',
            'Laporan yang telah melalui proses verifikasi dan validasi.',
            'Dokumen yang memenuhi standar kualitas dan kelengkapan informasi.'
        ]
        
        # Document summaries
        summaries = [
            'Dokumen ini berisi informasi penting tentang desa yang dapat diakses oleh masyarakat.',
            'Laporan ini disusun berdasarkan data dan fakta yang akurat dan terpercaya.',
            'Informasi dalam dokumen ini telah diverifikasi dan disahkan oleh pejabat berwenang.',
            'Dokumen ini memenuhi standar transparansi dan akuntabilitas pemerintahan.',
            'Laporan ini disusun secara berkala untuk memenuhi kewajiban transparansi.',
            'Informasi dalam dokumen ini dapat digunakan sebagai referensi dan acuan.',
            'Dokumen ini memuat data dan informasi terkini yang relevan dan akurat.',
            'Laporan ini telah melalui proses verifikasi dan validasi yang ketat.',
            'Informasi dalam dokumen ini memenuhi standar kualitas dan kelengkapan.',
            'Dokumen ini dapat diakses oleh masyarakat untuk meningkatkan transparansi.'
        ]
        
        # Tags
        tags_list = [
            'anggaran, 2025, keuangan',
            'laporan, triwulan, realisasi',
            'dana desa, ADD, 2025',
            'peraturan, hukum, desa',
            'profil, data, kependudukan',
            'peta, wilayah, administrasi',
            'musyawarah, notulensi, 2025',
            'transparansi, akuntabilitas',
            'pemerintahan, desa, publik',
            'laporan, evaluasi, monitoring'
        ]
        
        documents = []
        for i in range(count):
            category = random.choice(categories)
            category_type = category.category_type
            
            # Get title based on category
            if category_type in document_titles:
                title = random.choice(document_titles[category_type])
            else:
                title = f'Dokumen {category.name} {i+1}'
            
            # Generate document number
            if category_type == 'apbdes':
                doc_number = f'{random.randint(1, 10):02d}/APBDES/{random.randint(2024, 2025)}'
            elif category_type == 'perdes':
                doc_number = f'{random.randint(1, 20):02d}/PERDES/{random.randint(1, 12):02d}/{random.randint(2024, 2025)}'
            elif category_type == 'sk_kades':
                doc_number = f'{random.randint(1, 50):03d}/SK-KADES/{random.randint(2024, 2025)}'
            else:
                doc_number = f'{random.randint(1, 100):03d}/{category.name.upper()}/{random.randint(2024, 2025)}'
            
            # Create document without file first
            document = Document.objects.create(
                title=title,
                category=category,
                document_number=doc_number,
                document_year=random.randint(2024, 2025),
                description=random.choice(descriptions),
                summary=random.choice(summaries),
                file_size=random.randint(1024, 10485760),  # 1KB to 10MB
                status=random.choice(status_choices),
                is_public=random.choice([True, False]),
                is_featured=random.choice([True, False]) if random.random() > 0.8 else False,
                uploaded_by=random.choice(users),
                download_count=random.randint(0, 100),
                view_count=random.randint(0, 500),
                tags=random.choice(tags_list),
                published_at=timezone.now() - timedelta(days=random.randint(1, 365)) if random.random() > 0.3 else None,
                created_at=timezone.now() - timedelta(days=random.randint(1, 365))
            )
            
            # Update slug to make it unique
            from django.utils.text import slugify
            unique_slug = f"{slugify(title)}-{i+1}-{random.randint(1000, 9999)}"
            document.slug = unique_slug
            document.save(update_fields=['slug'])
            documents.append(document)
            
            if (i + 1) % 20 == 0:
                self.stdout.write(f'Created {i + 1} documents...')
        
        return documents

    def create_document_comments(self, documents):
        """Create DocumentComment data"""
        self.stdout.write('Creating DocumentComment...')
        
        comment_texts = [
            'Dokumen ini sangat informatif dan membantu masyarakat memahami kondisi desa.',
            'Terima kasih atas transparansi yang diberikan melalui dokumen ini.',
            'Informasi dalam dokumen ini sangat jelas dan mudah dipahami.',
            'Dokumen ini memberikan gambaran yang baik tentang kondisi desa.',
            'Sangat membantu untuk memahami program dan kegiatan desa.',
            'Dokumen ini memenuhi standar transparansi yang diharapkan.',
            'Informasi yang disajikan sangat akurat dan terpercaya.',
            'Dokumen ini memberikan gambaran yang komprehensif tentang desa.',
            'Sangat bermanfaat untuk memahami kebijakan dan program desa.',
            'Dokumen ini menunjukkan komitmen desa terhadap transparansi.',
            'Informasi yang disajikan sangat detail dan mudah diakses.',
            'Dokumen ini memberikan gambaran yang objektif tentang kondisi desa.',
            'Sangat membantu untuk memahami perencanaan dan pelaksanaan program.',
            'Dokumen ini menunjukkan profesionalisme dalam pengelolaan desa.',
            'Informasi yang disajikan sangat relevan dan up-to-date.'
        ]
        
        for document in documents:
            # Create 0-3 comments per document
            num_comments = random.randint(0, 3)
            for _ in range(num_comments):
                DocumentComment.objects.create(
                    document=document,
                    name=fake.name(),
                    email=fake.email(),
                    comment=random.choice(comment_texts),
                    is_approved=random.choice([True, False]),
                    created_at=document.created_at + timedelta(days=random.randint(1, 30))
                )

    def create_document_download_logs(self, documents):
        """Create DocumentDownloadLog data"""
        self.stdout.write('Creating DocumentDownloadLog...')
        
        user_agents = [
            'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
            'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:89.0) Gecko/20100101 Firefox/89.0',
            'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.1.1 Safari/605.1.15',
            'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Edge/91.0.864.59',
            'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
        ]
        
        for document in documents:
            # Create 0-10 download logs per document
            num_logs = random.randint(0, 10)
            for _ in range(num_logs):
                DocumentDownloadLog.objects.create(
                    document=document,
                    ip_address=fake.ipv4(),
                    user_agent=random.choice(user_agents),
                    downloaded_at=document.created_at + timedelta(days=random.randint(1, 30))
                )