#!/usr/bin/env python
"""
Django management command untuk membuat data dummy layanan
Membuat layanan 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 layanan.models import (
    LayananFeedback, LayananFAQ, LayananContact, LayananService, LayananDocumentRequest
)
import random
from faker import Faker
import os

User = get_user_model()
fake = Faker('id_ID')

class Command(BaseCommand):
    help = 'Create dummy data for layanan app including services and all related data'

    def add_arguments(self, parser):
        parser.add_argument(
            '--feedback-count',
            type=int,
            default=50,
            help='Number of feedback to create (default: 50)'
        )
        parser.add_argument(
            '--document-request-count',
            type=int,
            default=30,
            help='Number of document requests to create (default: 30)'
        )
        parser.add_argument(
            '--clear-existing',
            action='store_true',
            help='Clear existing data before creating new data'
        )

    def handle(self, *args, **options):
        feedback_count = options['feedback_count']
        document_request_count = options['document_request_count']
        clear_existing = options['clear_existing']
        
        self.stdout.write(
            self.style.SUCCESS(f'Creating dummy data for layanan app...')
        )
        
        if clear_existing:
            self.clear_existing_data()
        
        with transaction.atomic():
            # 1. Create LayananService
            services = self.create_layanan_services()
            
            # 2. Create LayananContact
            contacts = self.create_layanan_contacts()
            
            # 3. Create LayananFAQ
            faqs = self.create_layanan_faqs()
            
            # 4. Create LayananFeedback
            feedbacks = self.create_layanan_feedbacks(feedback_count)
            
            # 5. Create LayananDocumentRequest
            document_requests = self.create_layanan_document_requests(document_request_count)
        
        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
        LayananDocumentRequest.objects.all().delete()
        LayananFeedback.objects.all().delete()
        LayananFAQ.objects.all().delete()
        LayananContact.objects.all().delete()
        LayananService.objects.all().delete()

    def create_layanan_services(self):
        """Create LayananService data"""
        self.stdout.write('Creating LayananService...')
        
        services_data = [
            {
                'name': 'Surat Keterangan Domisili',
                'description': 'Layanan pembuatan surat keterangan domisili untuk keperluan administrasi',
                'category': 'documents',
                'icon': 'fa-file-alt',
                'url': '/layanan/surat-keterangan-domisili/',
                'order': 1
            },
            {
                'name': 'Surat Keterangan Tidak Mampu',
                'description': 'Layanan pembuatan surat keterangan tidak mampu untuk keperluan bantuan sosial',
                'category': 'documents',
                'icon': 'fa-hand-holding-heart',
                'url': '/layanan/surat-keterangan-tidak-mampu/',
                'order': 2
            },
            {
                'name': 'Surat Pengantar Nikah',
                'description': 'Layanan pembuatan surat pengantar nikah untuk keperluan pernikahan',
                'category': 'documents',
                'icon': 'fa-heart',
                'url': '/layanan/surat-pengantar-nikah/',
                'order': 3
            },
            {
                'name': 'Surat Keterangan Usaha',
                'description': 'Layanan pembuatan surat keterangan usaha untuk keperluan bisnis',
                'category': 'business',
                'icon': 'fa-store',
                'url': '/layanan/surat-keterangan-usaha/',
                'order': 4
            },
            {
                'name': 'Surat Keterangan Kematian',
                'description': 'Layanan pembuatan surat keterangan kematian untuk keperluan administrasi',
                'category': 'documents',
                'icon': 'fa-cross',
                'url': '/layanan/surat-keterangan-kematian/',
                'order': 5
            },
            {
                'name': 'Surat Keterangan Kelahiran',
                'description': 'Layanan pembuatan surat keterangan kelahiran untuk keperluan administrasi',
                'category': 'documents',
                'icon': 'fa-baby',
                'url': '/layanan/surat-keterangan-kelahiran/',
                'order': 6
            },
            {
                'name': 'Surat Keterangan Pindah',
                'description': 'Layanan pembuatan surat keterangan pindah untuk keperluan administrasi',
                'category': 'documents',
                'icon': 'fa-home',
                'url': '/layanan/surat-keterangan-pindah/',
                'order': 7
            },
            {
                'name': 'Surat Keterangan Ahli Waris',
                'description': 'Layanan pembuatan surat keterangan ahli waris untuk keperluan administrasi',
                'category': 'documents',
                'icon': 'fa-users',
                'url': '/layanan/surat-keterangan-ahli-waris/',
                'order': 8
            },
            {
                'name': 'Surat Keterangan Beda Nama',
                'description': 'Layanan pembuatan surat keterangan beda nama untuk keperluan administrasi',
                'category': 'documents',
                'icon': 'fa-id-card',
                'url': '/layanan/surat-keterangan-beda-nama/',
                'order': 9
            },
            {
                'name': 'Surat Keterangan Belum Menikah',
                'description': 'Layanan pembuatan surat keterangan belum menikah untuk keperluan administrasi',
                'category': 'documents',
                'icon': 'fa-user',
                'url': '/layanan/surat-keterangan-belum-menikah/',
                'order': 10
            },
            {
                'name': 'Layanan Kesehatan Posyandu',
                'description': 'Layanan kesehatan posyandu untuk balita dan ibu hamil',
                'category': 'health',
                'icon': 'fa-heartbeat',
                'url': '/layanan/kesehatan-posyandu/',
                'order': 11
            },
            {
                'name': 'Layanan Kesehatan Lansia',
                'description': 'Layanan kesehatan untuk lansia dan pemeriksaan kesehatan berkala',
                'category': 'health',
                'icon': 'fa-user-md',
                'url': '/layanan/kesehatan-lansia/',
                'order': 12
            },
            {
                'name': 'Layanan Pariwisata',
                'description': 'Layanan informasi pariwisata dan potensi wisata desa',
                'category': 'tourism',
                'icon': 'fa-camera',
                'url': '/layanan/pariwisata/',
                'order': 13
            },
            {
                'name': 'Layanan Bantuan Sosial',
                'description': 'Layanan bantuan sosial dan program kemiskinan',
                'category': 'other',
                'icon': 'fa-hands-helping',
                'url': '/layanan/bantuan-sosial/',
                'order': 14
            },
            {
                'name': 'Layanan Pengaduan',
                'description': 'Layanan pengaduan dan keluhan masyarakat',
                'category': 'other',
                'icon': 'fa-comment-dots',
                'url': '/layanan/pengaduan/',
                'order': 15
            }
        ]
        
        services = []
        for service_data in services_data:
            service, created = LayananService.objects.get_or_create(
                name=service_data['name'],
                defaults={
                    'description': service_data['description'],
                    'category': service_data['category'],
                    'icon': service_data['icon'],
                    'url': service_data['url'],
                    'order': service_data['order'],
                    'is_active': True
                }
            )
            services.append(service)
        
        return services

    def create_layanan_contacts(self):
        """Create LayananContact data"""
        self.stdout.write('Creating LayananContact...')
        
        contacts_data = [
            {
                'name': 'Budi Santoso',
                'position': 'Kepala Desa',
                'phone': '081234567890',
                'email': 'kepaladesa@pulosarok.id',
                'department': 'Pemerintahan Desa',
                'notes': 'Kepala Desa Pulosarok, bertanggung jawab atas seluruh kegiatan pemerintahan desa'
            },
            {
                'name': 'Siti Aminah',
                'position': 'Sekretaris Desa',
                'phone': '081234567891',
                'email': 'sekretaris@pulosarok.id',
                'department': 'Sekretariat Desa',
                'notes': 'Sekretaris Desa, mengelola administrasi dan surat menyurat'
            },
            {
                'name': 'Ahmad Wijaya',
                'position': 'Kaur Pemerintahan',
                'phone': '081234567892',
                'email': 'pemerintahan@pulosarok.id',
                'department': 'Pemerintahan',
                'notes': 'Kaur Pemerintahan, menangani urusan pemerintahan dan administrasi'
            },
            {
                'name': 'Rina Sari',
                'position': 'Kaur Pembangunan',
                'phone': '081234567893',
                'email': 'pembangunan@pulosarok.id',
                'department': 'Pembangunan',
                'notes': 'Kaur Pembangunan, menangani urusan pembangunan dan infrastruktur'
            },
            {
                'name': 'Dedi Kurniawan',
                'position': 'Kaur Pemberdayaan Masyarakat',
                'phone': '081234567894',
                'email': 'pemberdayaan@pulosarok.id',
                'department': 'Pemberdayaan Masyarakat',
                'notes': 'Kaur Pemberdayaan Masyarakat, menangani urusan pemberdayaan dan sosial'
            },
            {
                'name': 'Maya Putri',
                'position': 'Kaur Keuangan',
                'phone': '081234567895',
                'email': 'keuangan@pulosarok.id',
                'department': 'Keuangan',
                'notes': 'Kaur Keuangan, menangani urusan keuangan dan anggaran desa'
            },
            {
                'name': 'Rudi Hartono',
                'position': 'Kaur Umum',
                'phone': '081234567896',
                'email': 'umum@pulosarok.id',
                'department': 'Umum',
                'notes': 'Kaur Umum, menangani urusan umum dan administrasi'
            },
            {
                'name': 'Lina Marlina',
                'position': 'Staff Layanan',
                'phone': '081234567897',
                'email': 'layanan@pulosarok.id',
                'department': 'Layanan',
                'notes': 'Staff Layanan, menangani pelayanan masyarakat dan administrasi'
            }
        ]
        
        contacts = []
        for contact_data in contacts_data:
            contact, created = LayananContact.objects.get_or_create(
                name=contact_data['name'],
                defaults={
                    'position': contact_data['position'],
                    'phone': contact_data['phone'],
                    'email': contact_data['email'],
                    'department': contact_data['department'],
                    'notes': contact_data['notes'],
                    'is_active': True
                }
            )
            contacts.append(contact)
        
        return contacts

    def create_layanan_faqs(self):
        """Create LayananFAQ data"""
        self.stdout.write('Creating LayananFAQ...')
        
        faqs_data = [
            {
                'question': 'Bagaimana cara mengajukan surat keterangan domisili?',
                'answer': 'Untuk mengajukan surat keterangan domisili, Anda perlu membawa KTP, KK, dan surat pengantar dari RT/RW. Proses pengajuan dapat dilakukan di kantor desa pada jam kerja.',
                'category': 'documents',
                'order': 1
            },
            {
                'question': 'Berapa lama proses pembuatan surat keterangan?',
                'answer': 'Proses pembuatan surat keterangan umumnya memakan waktu 1-3 hari kerja, tergantung jenis surat dan kelengkapan dokumen yang dibutuhkan.',
                'category': 'documents',
                'order': 2
            },
            {
                'question': 'Apa saja dokumen yang diperlukan untuk surat keterangan tidak mampu?',
                'answer': 'Dokumen yang diperlukan meliputi KTP, KK, surat pengantar RT/RW, dan surat keterangan dari kepala dusun. Untuk keperluan tertentu mungkin diperlukan dokumen tambahan.',
                'category': 'documents',
                'order': 3
            },
            {
                'question': 'Bagaimana cara mengajukan surat keterangan usaha?',
                'answer': 'Untuk mengajukan surat keterangan usaha, Anda perlu membawa KTP, KK, dan dokumen pendukung usaha seperti SIUP atau surat keterangan dari RT/RW. Proses dapat dilakukan di kantor desa.',
                'category': 'business',
                'order': 4
            },
            {
                'question': 'Apakah ada biaya untuk pembuatan surat keterangan?',
                'answer': 'Pembuatan surat keterangan di desa Pulosarok tidak dikenakan biaya (gratis) sesuai dengan peraturan yang berlaku. Namun, untuk keperluan tertentu mungkin ada biaya administrasi yang wajar.',
                'category': 'general',
                'order': 5
            },
            {
                'question': 'Bagaimana cara mengajukan surat pengantar nikah?',
                'answer': 'Untuk mengajukan surat pengantar nikah, Anda perlu membawa KTP, KK, surat pengantar RT/RW, dan surat keterangan belum menikah. Proses dapat dilakukan di kantor desa.',
                'category': 'documents',
                'order': 6
            },
            {
                'question': 'Jam berapa kantor desa buka?',
                'answer': 'Kantor desa Pulosarok buka setiap hari Senin-Jumat pukul 08.00-16.00 WIB, dan Sabtu pukul 08.00-12.00 WIB. Hari Minggu dan hari libur nasional tutup.',
                'category': 'general',
                'order': 7
            },
            {
                'question': 'Bagaimana cara mengajukan surat keterangan kematian?',
                'answer': 'Untuk mengajukan surat keterangan kematian, Anda perlu membawa KTP almarhum, KK, surat pengantar RT/RW, dan surat keterangan dari rumah sakit atau dokter. Proses dapat dilakukan di kantor desa.',
                'category': 'documents',
                'order': 8
            },
            {
                'question': 'Apa saja layanan kesehatan yang tersedia di desa?',
                'answer': 'Desa Pulosarok menyediakan layanan kesehatan melalui Posyandu untuk balita dan ibu hamil, serta layanan kesehatan lansia. Layanan ini dilaksanakan secara berkala sesuai jadwal yang telah ditentukan.',
                'category': 'health',
                'order': 9
            },
            {
                'question': 'Bagaimana cara mengajukan bantuan sosial?',
                'answer': 'Untuk mengajukan bantuan sosial, Anda perlu mengisi formulir pengajuan yang tersedia di kantor desa, dilengkapi dengan dokumen pendukung seperti surat keterangan tidak mampu dan dokumen lainnya sesuai persyaratan.',
                'category': 'other',
                'order': 10
            },
            {
                'question': 'Bagaimana cara mengajukan pengaduan atau keluhan?',
                'answer': 'Pengaduan atau keluhan dapat diajukan secara langsung di kantor desa, melalui surat tertulis, atau melalui sistem pengaduan online yang tersedia di website desa. Setiap pengaduan akan ditindaklanjuti sesuai prosedur yang berlaku.',
                'category': 'other',
                'order': 11
            },
            {
                'question': 'Apa saja potensi wisata yang ada di desa Pulosarok?',
                'answer': 'Desa Pulosarok memiliki berbagai potensi wisata seperti wisata alam, wisata budaya, dan wisata kuliner. Informasi lengkap tentang potensi wisata dapat diperoleh di kantor desa atau melalui website desa.',
                'category': 'tourism',
                'order': 12
            }
        ]
        
        faqs = []
        for faq_data in faqs_data:
            faq, created = LayananFAQ.objects.get_or_create(
                question=faq_data['question'],
                defaults={
                    'answer': faq_data['answer'],
                    'category': faq_data['category'],
                    'order': faq_data['order'],
                    'is_active': True
                }
            )
            faqs.append(faq)
        
        return faqs

    def create_layanan_feedbacks(self, count):
        """Create LayananFeedback data"""
        self.stdout.write(f'Creating {count} LayananFeedback...')
        
        feedback_subjects = [
            'Pelayanan yang sangat memuaskan',
            'Proses administrasi yang cepat dan mudah',
            'Staff yang ramah dan membantu',
            'Fasilitas yang memadai',
            'Informasi yang jelas dan mudah dipahami',
            'Layanan yang responsif',
            'Prosedur yang tidak berbelit-belit',
            'Kualitas pelayanan yang baik',
            'Kemudahan dalam mengakses layanan',
            'Transparansi dalam proses administrasi'
        ]
        
        feedback_messages = [
            'Saya sangat puas dengan pelayanan yang diberikan oleh staff desa. Proses pembuatan surat keterangan berjalan lancar dan cepat.',
            'Pelayanan yang diberikan sangat memuaskan. Staff desa sangat ramah dan membantu dalam menjelaskan prosedur yang harus diikuti.',
            'Saya mengucapkan terima kasih atas pelayanan yang diberikan. Proses administrasi berjalan dengan baik dan sesuai dengan yang diharapkan.',
            'Kualitas pelayanan yang diberikan sangat baik. Staff desa profesional dan responsif dalam menangani setiap permohonan.',
            'Saya sangat terbantu dengan layanan yang diberikan. Informasi yang disampaikan jelas dan mudah dipahami.',
            'Pelayanan yang diberikan sesuai dengan standar yang diharapkan. Proses administrasi berjalan lancar dan tidak berbelit-belit.',
            'Saya puas dengan kualitas pelayanan yang diberikan. Staff desa sangat membantu dan ramah dalam melayani masyarakat.',
            'Layanan yang diberikan sangat memuaskan. Proses pembuatan dokumen berjalan dengan cepat dan sesuai dengan prosedur.',
            'Saya mengucapkan terima kasih atas pelayanan yang diberikan. Kualitas layanan yang diberikan sangat baik dan memuaskan.',
            'Pelayanan yang diberikan sesuai dengan harapan. Staff desa profesional dan responsif dalam menangani setiap permohonan.'
        ]
        
        feedback_replies = [
            'Terima kasih atas feedback yang diberikan. Kami akan terus berupaya memberikan pelayanan terbaik untuk masyarakat.',
            'Kami sangat menghargai feedback yang diberikan. Ini akan menjadi motivasi untuk terus meningkatkan kualitas pelayanan.',
            'Terima kasih atas apresiasi yang diberikan. Kami akan terus berupaya memberikan pelayanan yang memuaskan.',
            'Kami sangat senang mendengar feedback positif dari masyarakat. Ini akan menjadi motivasi untuk terus berimprovisasi.',
            'Terima kasih atas kepercayaan yang diberikan. Kami akan terus berupaya memberikan pelayanan terbaik.',
            'Kami sangat menghargai feedback yang diberikan. Ini akan menjadi bahan evaluasi untuk meningkatkan kualitas pelayanan.',
            'Terima kasih atas apresiasi yang diberikan. Kami akan terus berupaya memberikan pelayanan yang memuaskan masyarakat.',
            'Kami sangat senang mendengar feedback positif. Ini akan menjadi motivasi untuk terus berimprovisasi dan memberikan pelayanan terbaik.',
            'Terima kasih atas kepercayaan yang diberikan. Kami akan terus berupaya memberikan pelayanan yang sesuai dengan harapan masyarakat.',
            'Kami sangat menghargai feedback yang diberikan. Ini akan menjadi bahan evaluasi untuk terus meningkatkan kualitas pelayanan.'
        ]
        
        feedbacks = []
        for i in range(count):
            feedback = LayananFeedback.objects.create(
                name=fake.name(),
                email=fake.email(),
                phone=fake.phone_number(),
                category=random.choice([choice[0] for choice in LayananFeedback.CATEGORY_CHOICES]),
                status=random.choice([choice[0] for choice in LayananFeedback.STATUS_CHOICES]),
                subject=random.choice(feedback_subjects),
                message=random.choice(feedback_messages),
                reply=random.choice(feedback_replies) if random.random() > 0.3 else '',
                replied_at=timezone.now() - timedelta(days=random.randint(1, 30)) if random.random() > 0.3 else None,
                created_at=timezone.now() - timedelta(days=random.randint(1, 90))
            )
            feedbacks.append(feedback)
            
            if (i + 1) % 10 == 0:
                self.stdout.write(f'Created {i + 1} feedback...')
        
        return feedbacks

    def create_layanan_document_requests(self, count):
        """Create LayananDocumentRequest data"""
        self.stdout.write(f'Creating {count} LayananDocumentRequest...')
        
        users = list(User.objects.all())
        if not users:
            self.stdout.write(self.style.WARNING('No users found. Creating document requests without processors.'))
            users = [None]
        
        purposes = [
            'Keperluan administrasi',
            'Keperluan pekerjaan',
            'Keperluan pendidikan',
            'Keperluan pernikahan',
            'Keperluan bisnis',
            'Keperluan bantuan sosial',
            'Keperluan administrasi kependudukan',
            'Keperluan perizinan',
            'Keperluan keuangan',
            'Keperluan lainnya'
        ]
        
        descriptions = [
            'Dokumen diperlukan untuk keperluan administrasi resmi',
            'Dokumen diperlukan untuk melengkapi persyaratan administrasi',
            'Dokumen diperlukan untuk keperluan pekerjaan',
            'Dokumen diperlukan untuk keperluan pendidikan',
            'Dokumen diperlukan untuk keperluan pernikahan',
            'Dokumen diperlukan untuk keperluan bisnis',
            'Dokumen diperlukan untuk keperluan bantuan sosial',
            'Dokumen diperlukan untuk keperluan administrasi kependudukan',
            'Dokumen diperlukan untuk keperluan perizinan',
            'Dokumen diperlukan untuk keperluan keuangan'
        ]
        
        rejection_reasons = [
            'Dokumen tidak lengkap',
            'Data tidak sesuai dengan yang tercantum di KK',
            'Surat pengantar RT/RW tidak valid',
            'Dokumen pendukung tidak memenuhi syarat',
            'Data yang diisi tidak sesuai dengan dokumen asli',
            'Dokumen sudah kadaluarsa',
            'Dokumen tidak sesuai dengan keperluan',
            'Data tidak sesuai dengan database kependudukan',
            'Dokumen tidak memenuhi persyaratan yang ditentukan',
            'Dokumen tidak sesuai dengan ketentuan yang berlaku'
        ]
        
        document_requests = []
        for i in range(count):
            status = random.choice([choice[0] for choice in LayananDocumentRequest.STATUS_CHOICES])
            processed_by = random.choice(users) if status in ['approved', 'rejected'] else None
            processed_at = timezone.now() - timedelta(days=random.randint(1, 30)) if processed_by else None
            
            document_request = LayananDocumentRequest.objects.create(
                full_name=fake.name(),
                nik=fake.numerify('##############'),
                phone=fake.phone_number(),
                email=fake.email() if random.random() > 0.3 else '',
                address=fake.address(),
                document_type=random.choice([choice[0] for choice in LayananDocumentRequest.DOCUMENT_TYPE_CHOICES]),
                purpose=random.choice(purposes),
                description=random.choice(descriptions),
                status=status,
                rejection_reason=random.choice(rejection_reasons) if status == 'rejected' else '',
                processed_by=processed_by,
                processed_at=processed_at,
                created_at=timezone.now() - timedelta(days=random.randint(1, 60))
            )
            document_requests.append(document_request)
            
            if (i + 1) % 10 == 0:
                self.stdout.write(f'Created {i + 1} document requests...')
        
        return document_requests




