from django.core.management.base import BaseCommand
from core.models import CustomUser
from layanan.models import LayananFeedback, LayananFAQ, LayananContact, LayananService, LayananDocumentRequest
# from documents.models import DocumentType  # Removed - using simplified models
# from references.models import Penduduk  # COMMENTED OUT - references app disabled
# Using letters app models instead
try:
    from letters.models import Penduduk
except ImportError:
    Penduduk = None
import random
from faker import Faker
import logging

logger = logging.getLogger(__name__)

class Command(BaseCommand):
    help = 'Creates dummy data for layanan app'

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

    def generate_feedback_data(self, fake):
        """Generate realistic feedback data"""
        subjects = [
            'Pelayanan yang sangat memuaskan',
            'Permintaan informasi dokumen',
            'Keluhan tentang prosedur',
            'Saran perbaikan layanan',
            'Pertanyaan tentang persyaratan',
            'Komplain tentang antrian',
            'Pujian untuk staff',
            'Permintaan bantuan teknis',
            'Keluhan tentang website',
            'Saran pengembangan fitur'
        ]
        
        messages = [
            'Terima kasih atas pelayanan yang diberikan. Sangat membantu dan profesional.',
            'Mohon informasi lebih lanjut tentang persyaratan dokumen yang diperlukan.',
            'Prosedur yang ada masih terlalu rumit dan memakan waktu lama.',
            'Saya sarankan untuk menambah jam operasional layanan.',
            'Bagaimana cara mengajukan dokumen secara online?',
            'Antrian terlalu panjang, mohon ditambah loket pelayanan.',
            'Staff sangat ramah dan membantu, terima kasih banyak.',
            'Website sering error, mohon diperbaiki.',
            'Fitur chat bot sangat membantu, terima kasih.',
            'Mohon ditambahkan fitur notifikasi via WhatsApp.'
        ]
        
        return {
            'subject': random.choice(subjects),
            'message': random.choice(messages)
        }

    def generate_faq_data(self, fake):
        """Generate realistic FAQ data"""
        faqs = [
            {
                'question': 'Bagaimana cara mengajukan dokumen secara online?',
                'answer': 'Anda dapat mengajukan dokumen melalui website resmi desa. Login terlebih dahulu, kemudian pilih jenis dokumen yang ingin diajukan, lengkapi formulir, dan upload dokumen pendukung yang diperlukan.',
                'category': 'documents'
            },
            {
                'question': 'Berapa lama waktu proses dokumen?',
                'answer': 'Waktu proses dokumen bervariasi tergantung jenis dokumen. Umumnya 3-7 hari kerja untuk dokumen standar, dan 1-2 minggu untuk dokumen yang memerlukan verifikasi khusus.',
                'category': 'documents'
            },
            {
                'question': 'Apa saja persyaratan untuk membuat KTP?',
                'answer': 'Persyaratan membuat KTP: 1) Fotokopi KK, 2) Surat keterangan domisili, 3) Pas foto 3x4, 4) Biaya administrasi sesuai ketentuan. Untuk warga baru, tambahkan surat pindah dari desa asal.',
                'category': 'documents'
            },
            {
                'question': 'Bagaimana cara cek status pengajuan dokumen?',
                'answer': 'Anda dapat mengecek status pengajuan melalui menu "Cek Status" di website, masukkan nomor pengajuan atau NIK. Status akan update secara real-time.',
                'category': 'services'
            },
            {
                'question': 'Apakah ada layanan konsultasi online?',
                'answer': 'Ya, tersedia layanan konsultasi online melalui chat bot di website dan WhatsApp. Tim kami akan merespons dalam 1-2 jam pada jam kerja.',
                'category': 'services'
            },
            {
                'question': 'Bagaimana cara mengajukan keluhan atau saran?',
                'answer': 'Anda dapat mengajukan keluhan atau saran melalui form feedback di website, email resmi desa, atau langsung ke kantor desa. Kami akan merespons dalam 2x24 jam.',
                'category': 'general'
            },
            {
                'question': 'Jam operasional kantor desa?',
                'answer': 'Kantor desa buka Senin-Jumat pukul 08.00-16.00 WIB, dan Sabtu pukul 08.00-12.00 WIB. Layanan online tersedia 24 jam.',
                'category': 'general'
            },
            {
                'question': 'Bagaimana cara reset password akun?',
                'answer': 'Klik "Lupa Password" di halaman login, masukkan email terdaftar. Link reset password akan dikirim ke email Anda. Jika tidak ada email, hubungi admin.',
                'category': 'technical'
            },
            {
                'question': 'Apakah ada biaya untuk layanan online?',
                'answer': 'Layanan online gratis. Biaya hanya untuk dokumen resmi sesuai tarif yang berlaku. Pembayaran dapat dilakukan via transfer bank atau tunai di kantor.',
                'category': 'services'
            },
            {
                'question': 'Bagaimana cara update data pribadi?',
                'answer': 'Login ke akun Anda, pilih menu "Profil", klik "Edit Data", ubah informasi yang diperlukan, dan simpan. Untuk perubahan data kependudukan, ajukan permohonan perubahan data.',
                'category': 'technical'
            }
        ]
        
        return random.choice(faqs)

    def generate_contact_data(self, fake):
        """Generate realistic contact data"""
        positions = [
            'Kepala Desa', 'Sekretaris Desa', 'Bendahara Desa', 'Kaur Pemerintahan',
            'Kaur Pembangunan', 'Kaur Kesejahteraan', 'Kaur Umum', 'Staff Administrasi',
            'Staff Teknis', 'Staff Layanan', 'Operator Website', 'Staff Keuangan'
        ]
        
        departments = [
            'Pemerintahan', 'Pembangunan', 'Kesejahteraan', 'Umum', 'Administrasi',
            'Teknis', 'Layanan', 'Keuangan', 'Kependudukan', 'Pertanahan'
        ]
        
        return {
            'position': random.choice(positions),
            'department': random.choice(departments)
        }

    def generate_service_data(self, fake):
        """Generate realistic service data"""
        services = [
            {
                'name': 'Layanan Pembuatan KTP',
                'description': 'Layanan pembuatan Kartu Tanda Penduduk (KTP) untuk warga desa. Proses cepat dan mudah dengan persyaratan yang jelas.',
                'category': 'documents',
                'icon': 'fas fa-id-card'
            },
            {
                'name': 'Layanan Pembuatan KK',
                'description': 'Layanan pembuatan Kartu Keluarga (KK) untuk keluarga baru atau perubahan data keluarga.',
                'category': 'documents',
                'icon': 'fas fa-users'
            },
            {
                'name': 'Layanan Surat Keterangan',
                'description': 'Layanan pembuatan berbagai surat keterangan seperti surat keterangan domisili, surat keterangan tidak mampu, dll.',
                'category': 'documents',
                'icon': 'fas fa-file-alt'
            },
            {
                'name': 'Layanan Posyandu',
                'description': 'Layanan kesehatan ibu dan anak melalui posyandu dengan jadwal rutin dan tenaga kesehatan terlatih.',
                'category': 'health',
                'icon': 'fas fa-heart'
            },
            {
                'name': 'Layanan Konsultasi Bisnis',
                'description': 'Layanan konsultasi dan bimbingan untuk pengembangan usaha mikro, kecil, dan menengah (UMKM).',
                'category': 'business',
                'icon': 'fas fa-briefcase'
            },
            {
                'name': 'Layanan Pariwisata',
                'description': 'Layanan informasi dan promosi pariwisata desa, termasuk pemanduan wisata dan event wisata.',
                'category': 'tourism',
                'icon': 'fas fa-map-marked-alt'
            },
            {
                'name': 'Layanan Konsultasi Online',
                'description': 'Layanan konsultasi online melalui chat bot dan WhatsApp untuk pertanyaan seputar administrasi desa.',
                'category': 'services',
                'icon': 'fas fa-comments'
            },
            {
                'name': 'Layanan Pengaduan',
                'description': 'Layanan pengaduan dan keluhan masyarakat dengan sistem tracking dan follow-up yang transparan.',
                'category': 'services',
                'icon': 'fas fa-exclamation-triangle'
            }
        ]
        
        return random.choice(services)

    def generate_document_request_data(self, fake, penduduk_list, document_types):
        """Generate realistic document request data"""
        purposes = [
            'Keperluan administrasi',
            'Pengajuan bantuan',
            'Keperluan kerja',
            'Keperluan sekolah',
            'Keperluan perbankan',
            'Keperluan pernikahan',
            'Keperluan perjalanan',
            'Keperluan bisnis',
            'Keperluan hukum',
            'Keperluan lainnya'
        ]
        
        descriptions = [
            'Dokumen diperlukan untuk keperluan administrasi resmi',
            'Dokumen untuk melengkapi persyaratan pengajuan',
            'Dokumen diperlukan untuk keperluan pekerjaan',
            'Dokumen untuk keperluan pendidikan',
            'Dokumen untuk keperluan perbankan',
            'Dokumen untuk keperluan pernikahan',
            'Dokumen untuk keperluan perjalanan',
            'Dokumen untuk keperluan bisnis',
            'Dokumen untuk keperluan hukum',
            'Dokumen untuk keperluan lainnya'
        ]
        
        return {
            'purpose': random.choice(purposes),
            'description': random.choice(descriptions)
        }

    def handle(self, *args, **options):
        count = options['count']
        clear_data = options['clear']
        
        if clear_data:
            self.stdout.write(self.style.WARNING('Clearing existing layanan data...'))
            LayananFeedback.objects.all().delete()
            LayananFAQ.objects.all().delete()
            LayananContact.objects.all().delete()
            LayananService.objects.all().delete()
            LayananDocumentRequest.objects.all().delete()
            self.stdout.write(self.style.SUCCESS('Existing layanan data cleared.'))
        
        fake = Faker('id_ID')
        
        # Get existing data for relationships
        penduduk_list = list(Penduduk.objects.all())
        document_types = list(DocumentType.objects.all())
        users = list(CustomUser.objects.filter(is_staff=True))
        
        if not penduduk_list:
            self.stdout.write(self.style.ERROR('No population data found. Please create some population data first.'))
            return
        
        if not document_types:
            self.stdout.write(self.style.ERROR('No document types found. Please create some document types first.'))
            return
        
        # Create dummy data
        created_feedback = 0
        created_faq = 0
        created_contact = 0
        created_service = 0
        created_document_request = 0
        
        # Create Feedback (25% of total)
        feedback_count = int(count * 0.25)
        for i in range(feedback_count):
            try:
                feedback_data = self.generate_feedback_data(fake)
                LayananFeedback.objects.create(
                    name=fake.name(),
                    email=fake.email(),
                    phone=fake.phone_number(),
                    category=random.choice(['complaint', 'suggestion', 'question', 'praise']),
                    status=random.choice(['pending', 'read', 'replied', 'closed']),
                    subject=feedback_data['subject'],
                    message=feedback_data['message'],
                    reply=fake.text() if random.choice([True, False]) else '',
                    replied_at=fake.date_time_between(start_date='-30d', end_date='now') if random.choice([True, False]) else None
                )
                created_feedback += 1
            except Exception as e:
                self.stdout.write(self.style.ERROR(f'Error creating feedback {i+1}: {str(e)}'))
                continue
        
        # Create FAQ (15% of total)
        faq_count = int(count * 0.15)
        for i in range(faq_count):
            try:
                faq_data = self.generate_faq_data(fake)
                LayananFAQ.objects.create(
                    question=faq_data['question'],
                    answer=faq_data['answer'],
                    category=faq_data['category'],
                    is_active=random.choice([True, True, True, False]),  # 75% active
                    order=random.randint(0, 100)
                )
                created_faq += 1
            except Exception as e:
                self.stdout.write(self.style.ERROR(f'Error creating FAQ {i+1}: {str(e)}'))
                continue
        
        # Create Contact (10% of total)
        contact_count = int(count * 0.10)
        for i in range(contact_count):
            try:
                contact_data = self.generate_contact_data(fake)
                LayananContact.objects.create(
                    name=fake.name(),
                    position=contact_data['position'],
                    phone=fake.phone_number(),
                    email=fake.email(),
                    department=contact_data['department'],
                    is_active=random.choice([True, True, True, False]),  # 75% active
                    notes=fake.text() if random.choice([True, False]) else ''
                )
                created_contact += 1
            except Exception as e:
                self.stdout.write(self.style.ERROR(f'Error creating contact {i+1}: {str(e)}'))
                continue
        
        # Create Service (10% of total)
        service_count = int(count * 0.10)
        for i in range(service_count):
            try:
                service_data = self.generate_service_data(fake)
                LayananService.objects.create(
                    name=service_data['name'],
                    description=service_data['description'],
                    category=service_data['category'],
                    icon=service_data['icon'],
                    url=fake.url() if random.choice([True, False]) else '',
                    is_active=random.choice([True, True, True, False]),  # 75% active
                    order=random.randint(0, 100)
                )
                created_service += 1
            except Exception as e:
                self.stdout.write(self.style.ERROR(f'Error creating service {i+1}: {str(e)}'))
                continue
        
        # Create Document Request (40% of total)
        document_request_count = int(count * 0.40)
        for i in range(document_request_count):
            try:
                request_data = self.generate_document_request_data(fake, penduduk_list, document_types)
                penduduk = random.choice(penduduk_list)
                document_type = random.choice(document_types)
                
                LayananDocumentRequest.objects.create(
                    full_name=penduduk.name,
                    nik=penduduk.nik,
                    phone=penduduk.phone_number or fake.phone_number(),
                    email=fake.email(),
                    address=penduduk.address or fake.address(),
                    document_type=document_type,
                    purpose=request_data['purpose'],
                    description=request_data['description'],
                    status=random.choice(['pending', 'approved', 'rejected', 'cancelled']),
                    rejection_reason=fake.text() if random.choice([True, False]) else '',
                    processed_by=random.choice(users) if users and random.choice([True, False]) else None,
                    processed_at=fake.date_time_between(start_date='-30d', end_date='now') if random.choice([True, False]) else None
                )
                created_document_request += 1
            except Exception as e:
                self.stdout.write(self.style.ERROR(f'Error creating document request {i+1}: {str(e)}'))
                continue
        
        self.stdout.write(self.style.SUCCESS(f'Successfully created layanan dummy data:'))
        self.stdout.write(f'  - Feedback: {created_feedback}')
        self.stdout.write(f'  - FAQ: {created_faq}')
        self.stdout.write(f'  - Contact: {created_contact}')
        self.stdout.write(f'  - Service: {created_service}')
        self.stdout.write(f'  - Document Request: {created_document_request}')
        self.stdout.write(f'  - Total: {created_feedback + created_faq + created_contact + created_service + created_document_request}')
