#!/usr/bin/env python
"""
Django management command untuk membuat data dummy news
Membuat berita 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 news.models import (
    NewsPageHeader, NewsCategory, NewsTag, News, NewsComment, 
    NewsView, NewsImage, NewsLike, NewsShare, Announcement, NotificationSettings
)
import random
from faker import Faker
import os

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

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

    def add_arguments(self, parser):
        parser.add_argument(
            '--news-count',
            type=int,
            default=30,
            help='Number of news to create (default: 30)'
        )
        parser.add_argument(
            '--announcement-count',
            type=int,
            default=10,
            help='Number of announcements to create (default: 10)'
        )
        parser.add_argument(
            '--clear-existing',
            action='store_true',
            help='Clear existing data before creating new data'
        )

    def handle(self, *args, **options):
        news_count = options['news_count']
        announcement_count = options['announcement_count']
        clear_existing = options['clear_existing']
        
        self.stdout.write(
            self.style.SUCCESS(f'Creating dummy data for {news_count} news and {announcement_count} announcements...')
        )
        
        if clear_existing:
            self.clear_existing_data()
        
        with transaction.atomic():
            # 1. Create NewsPageHeader
            header = self.create_news_page_header()
            
            # 2. Create NewsCategory
            categories = self.create_news_categories()
            
            # 3. Create NewsTag
            tags = self.create_news_tags()
            
            # 4. Create News
            news_list = self.create_news(news_count, categories, tags)
            
            # 5. Create NewsComment
            self.create_news_comments(news_list)
            
            # 6. Create NewsView
            self.create_news_views(news_list)
            
            # 7. Create NewsImage
            self.create_news_images(news_list)
            
            # 8. Create NewsLike
            self.create_news_likes(news_list)
            
            # 9. Create NewsShare
            self.create_news_shares(news_list)
            
            # 10. Create Announcement
            self.create_announcements(announcement_count)
            
            # 11. Create NotificationSettings
            self.create_notification_settings()
        
        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
        NewsShare.objects.all().delete()
        NewsLike.objects.all().delete()
        NewsImage.objects.all().delete()
        NewsView.objects.all().delete()
        NewsComment.objects.all().delete()
        News.objects.all().delete()
        Announcement.objects.all().delete()
        NewsTag.objects.all().delete()
        NewsCategory.objects.all().delete()
        NewsPageHeader.objects.all().delete()
        NotificationSettings.objects.all().delete()

    def create_news_page_header(self):
        """Create NewsPageHeader data"""
        self.stdout.write('Creating NewsPageHeader...')
        
        header, created = NewsPageHeader.objects.get_or_create(
            is_active=True,
            defaults={
                'title': 'Berita Desa Pulosarok',
                'description': 'Informasi terkini dan berita terbaru dari Desa Pulosarok',
                'is_active': True
            }
        )
        
        return header

    def create_news_categories(self):
        """Create NewsCategory data"""
        self.stdout.write('Creating NewsCategory...')
        
        categories_data = [
            {
                'name': 'Pemerintahan',
                'description': 'Berita tentang pemerintahan desa',
                'color': '#007bff',
                'icon': 'fa-landmark',
                'order': 1
            },
            {
                'name': 'Pembangunan',
                'description': 'Berita tentang pembangunan desa',
                'color': '#28a745',
                'icon': 'fa-hammer',
                'order': 2
            },
            {
                'name': 'Kesehatan',
                'description': 'Berita tentang kesehatan masyarakat',
                'color': '#dc3545',
                'icon': 'fa-heart',
                'order': 3
            },
            {
                'name': 'Pendidikan',
                'description': 'Berita tentang pendidikan',
                'color': '#ffc107',
                'icon': 'fa-graduation-cap',
                'order': 4
            },
            {
                'name': 'Ekonomi',
                'description': 'Berita tentang ekonomi desa',
                'color': '#17a2b8',
                'icon': 'fa-chart-line',
                'order': 5
            },
            {
                'name': 'Sosial',
                'description': 'Berita tentang kegiatan sosial',
                'color': '#6f42c1',
                'icon': 'fa-users',
                'order': 6
            },
            {
                'name': 'Olahraga',
                'description': 'Berita tentang olahraga',
                'color': '#fd7e14',
                'icon': 'fa-futbol',
                'order': 7
            },
            {
                'name': 'Budaya',
                'description': 'Berita tentang budaya dan adat',
                'color': '#e83e8c',
                'icon': 'fa-music',
                'order': 8
            }
        ]
        
        categories = []
        for category_data in categories_data:
            category, created = NewsCategory.objects.get_or_create(
                name=category_data['name'],
                defaults={
                    'description': category_data['description'],
                    'color': category_data['color'],
                    'icon': category_data['icon'],
                    'order': category_data['order'],
                    'is_active': True
                }
            )
            categories.append(category)
        
        return categories

    def create_news_tags(self):
        """Create NewsTag data"""
        self.stdout.write('Creating NewsTag...')
        
        tags_data = [
            {'name': 'Pemerintahan', 'color': '#007bff'},
            {'name': 'Pembangunan', 'color': '#28a745'},
            {'name': 'Kesehatan', 'color': '#dc3545'},
            {'name': 'Pendidikan', 'color': '#ffc107'},
            {'name': 'Ekonomi', 'color': '#17a2b8'},
            {'name': 'Sosial', 'color': '#6f42c1'},
            {'name': 'Olahraga', 'color': '#fd7e14'},
            {'name': 'Budaya', 'color': '#e83e8c'},
            {'name': 'Lingkungan', 'color': '#20c997'},
            {'name': 'Teknologi', 'color': '#6c757d'},
            {'name': 'Pariwisata', 'color': '#fd7e14'},
            {'name': 'Pertanian', 'color': '#28a745'},
            {'name': 'Perempuan', 'color': '#e83e8c'},
            {'name': 'Pemuda', 'color': '#007bff'},
            {'name': 'Lansia', 'color': '#6c757d'}
        ]
        
        tags = []
        for tag_data in tags_data:
            tag, created = NewsTag.objects.get_or_create(
                name=tag_data['name'],
                defaults={
                    'color': tag_data['color'],
                    'description': f'Tag untuk {tag_data["name"]}'
                }
            )
            tags.append(tag)
        
        return tags

    def create_news(self, count, categories, tags):
        """Create News data"""
        self.stdout.write(f'Creating {count} News...')
        
        users = list(User.objects.all())
        if not users:
            self.stdout.write(self.style.WARNING('No users found. Creating news without authors.'))
            users = [None]
        
        news_titles = [
            'Pembangunan Jembatan Penghubung Antar Dusun',
            'Program Posyandu Bulanan untuk Balita',
            'Pelatihan Kewirausahaan untuk Pemuda Desa',
            'Festival Budaya Desa Pulosarok 2025',
            'Pembangunan Jalan Lingkungan yang Lebih Baik',
            'Program Bantuan Sosial untuk Keluarga Miskin',
            'Kegiatan Gotong Royong Membersihkan Lingkungan',
            'Pelatihan Pertanian Organik untuk Petani',
            'Program Pemberdayaan Perempuan Desa',
            'Pembangunan Taman Bermain untuk Anak-anak',
            'Kegiatan Olahraga Bulan Ini',
            'Program Literasi Digital untuk Masyarakat',
            'Pembangunan MCK Umum di Setiap Dusun',
            'Kegiatan Keagamaan Bulanan',
            'Program Pelatihan Kerajinan Tangan',
            'Pembangunan Pos Ronda untuk Keamanan',
            'Kegiatan PKK dan Karang Taruna',
            'Program Penanaman Pohon di Lingkungan',
            'Pembangunan Tempat Sampah Terpadu',
            'Kegiatan Seni dan Budaya Lokal',
            'Program Bantuan Pendidikan untuk Anak',
            'Pembangunan Lapangan Olahraga',
            'Kegiatan Sosialisasi Program Pemerintah',
            'Program Pelatihan Teknologi Informasi',
            'Pembangunan Tempat Ibadah',
            'Kegiatan Peringatan Hari Besar Nasional',
            'Program Pelatihan Pertanian Modern',
            'Pembangunan Fasilitas Umum',
            'Kegiatan Bakti Sosial',
            'Program Pelatihan Keterampilan'
        ]
        
        news_contents = [
            'Desa Pulosarok terus berupaya meningkatkan kesejahteraan masyarakat melalui berbagai program pembangunan yang berkelanjutan. Program ini diharapkan dapat memberikan manfaat yang besar bagi seluruh warga desa.',
            'Kegiatan ini merupakan bagian dari upaya pemerintah desa untuk meningkatkan kualitas hidup masyarakat. Semua warga diharapkan dapat berpartisipasi aktif dalam setiap program yang dilaksanakan.',
            'Program ini dilaksanakan dengan melibatkan seluruh elemen masyarakat, mulai dari tokoh masyarakat, pemuda, hingga organisasi kemasyarakatan yang ada di desa.',
            'Kegiatan ini diharapkan dapat menjadi momentum untuk mempererat tali silaturahmi antar warga desa dan meningkatkan rasa kebersamaan dalam membangun desa yang lebih baik.',
            'Program ini merupakan wujud nyata dari komitmen pemerintah desa dalam memberikan pelayanan terbaik kepada masyarakat. Semua kegiatan dilaksanakan dengan transparan dan akuntabel.',
            'Kegiatan ini diharapkan dapat memberikan dampak positif yang signifikan bagi perkembangan desa. Semua pihak diharapkan dapat mendukung dan berpartisipasi aktif dalam setiap program.',
            'Program ini dilaksanakan dengan mengedepankan prinsip gotong royong dan kebersamaan yang menjadi ciri khas masyarakat desa. Semua warga diharapkan dapat berpartisipasi dengan penuh semangat.',
            'Kegiatan ini merupakan bagian dari upaya untuk meningkatkan kualitas sumber daya manusia di desa. Program ini diharapkan dapat memberikan manfaat yang berkelanjutan bagi masyarakat.',
            'Program ini dilaksanakan dengan melibatkan berbagai pihak terkait, mulai dari pemerintah desa, tokoh masyarakat, hingga organisasi kemasyarakatan yang ada di desa.',
            'Kegiatan ini diharapkan dapat menjadi contoh yang baik bagi desa-desa lain di sekitarnya. Semua program dilaksanakan dengan mengedepankan prinsip transparansi dan akuntabilitas.'
        ]
        
        status_choices = [choice[0] for choice in News.STATUS_CHOICES]
        priority_choices = [choice[0] for choice in News.PRIORITY_CHOICES]
        
        news_list = []
        for i in range(count):
            category = random.choice(categories)
            selected_tags = random.sample(tags, random.randint(2, 5))
            status = random.choice(status_choices)
            priority = random.choice(priority_choices)
            
            # Set published_date based on status
            published_date = None
            if status == 'published':
                published_date = timezone.now() - timedelta(days=random.randint(1, 30))
            elif status == 'scheduled':
                published_date = timezone.now() + timedelta(days=random.randint(1, 7))
            
            news = News.objects.create(
                title=random.choice(news_titles),
                category=category,
                content=random.choice(news_contents),
                status=status,
                priority=priority,
                is_featured=random.choice([True, False]) if random.random() > 0.8 else False,
                is_breaking=random.choice([True, False]) if random.random() > 0.9 else False,
                is_summonote=random.choice([True, False]) if random.random() > 0.9 else False,
                published_date=published_date,
                author=random.choice(users),
                total_views=random.randint(0, 1000),
                reading_time=random.randint(1, 10),
                meta_title=f'Berita {i+1} - Desa Pulosarok',
                meta_description=f'Informasi terkini tentang {category.name} di Desa Pulosarok',
                allow_comments=random.choice([True, False]),
                created_at=timezone.now() - timedelta(days=random.randint(1, 60))
            )
            
            # Add tags
            news.tags.set(selected_tags)
            news_list.append(news)
            
            if (i + 1) % 10 == 0:
                self.stdout.write(f'Created {i + 1} news...')
        
        return news_list

    def create_news_comments(self, news_list):
        """Create NewsComment data"""
        self.stdout.write('Creating NewsComment...')
        
        comment_texts = [
            'Berita yang sangat informatif dan bermanfaat untuk masyarakat.',
            'Terima kasih atas informasi yang diberikan, sangat membantu untuk memahami kondisi desa.',
            'Program yang bagus, semoga dapat berjalan dengan lancar dan memberikan manfaat yang besar.',
            'Kegiatan yang sangat positif, diharapkan dapat terus dilaksanakan secara berkelanjutan.',
            'Informasi yang sangat jelas dan mudah dipahami, terima kasih atas update yang diberikan.',
            'Program yang sangat bagus untuk kemajuan desa, semoga dapat memberikan dampak positif.',
            'Kegiatan yang sangat bermanfaat untuk masyarakat, diharapkan dapat terus dikembangkan.',
            'Informasi yang sangat berguna, terima kasih atas transparansi yang diberikan.',
            'Program yang sangat positif untuk pembangunan desa, semoga dapat berhasil dengan baik.',
            'Kegiatan yang sangat bagus untuk meningkatkan kesejahteraan masyarakat desa.'
        ]
        
        status_choices = [choice[0] for choice in NewsComment.STATUS_CHOICES]
        
        for news in news_list:
            # Create 0-5 comments per news
            num_comments = random.randint(0, 5)
            for _ in range(num_comments):
                NewsComment.objects.create(
                    news=news,
                    author_name=fake.name(),
                    author_email=fake.email(),
                    author_website=fake.url() if random.random() > 0.7 else '',
                    content=random.choice(comment_texts),
                    status=random.choice(status_choices),
                    ip_address=fake.ipv4(),
                    user_agent=fake.user_agent(),
                    is_author_verified=random.choice([True, False]),
                    created_at=news.created_at + timedelta(days=random.randint(1, 30))
                )

    def create_news_views(self, news_list):
        """Create NewsView data"""
        self.stdout.write('Creating NewsView...')
        
        devices = ['desktop', 'mobile', 'tablet']
        browsers = ['Chrome', 'Firefox', 'Safari', 'Edge', 'Opera']
        operating_systems = ['Windows', 'macOS', 'Linux', 'Android', 'iOS']
        
        for news in news_list:
            # Create 0-20 views per news
            num_views = random.randint(0, 20)
            for _ in range(num_views):
                NewsView.objects.create(
                    news=news,
                    ip_address=fake.ipv4(),
                    user_agent=fake.user_agent(),
                    referrer=fake.url() if random.random() > 0.5 else '',
                    session_key=fake.uuid4()[:32],
                    user=random.choice(list(User.objects.all())) if random.random() > 0.7 else None,
                    view_duration=random.randint(10, 300),
                    device_type=random.choice(devices),
                    browser=random.choice(browsers),
                    operating_system=random.choice(operating_systems),
                    view_date=news.created_at + timedelta(days=random.randint(1, 30))
                )

    def create_news_images(self, news_list):
        """Create NewsImage data"""
        self.stdout.write('Creating NewsImage...')
        
        captions = [
            'Gambar dokumentasi kegiatan',
            'Foto kegiatan yang berlangsung',
            'Dokumentasi pelaksanaan program',
            'Gambar suasana kegiatan',
            'Foto peserta kegiatan',
            'Dokumentasi hasil kegiatan',
            'Gambar lokasi kegiatan',
            'Foto suasana acara',
            'Dokumentasi pelaksanaan acara',
            'Gambar kegiatan yang berlangsung'
        ]
        
        for news in news_list:
            # Create 0-3 images per news
            num_images = random.randint(0, 3)
            for i in range(num_images):
                NewsImage.objects.create(
                    news=news,
                    image=f'news/gallery/dummy_{news.id}_{i+1}.jpg',
                    caption=random.choice(captions),
                    alt_text=f'Gambar {i+1} untuk {news.title}',
                    is_featured=i == 0,
                    order=i + 1
                )

    def create_news_likes(self, news_list):
        """Create NewsLike data"""
        self.stdout.write('Creating NewsLike...')
        
        users = list(User.objects.all())
        
        for news in news_list:
            # Create 0-10 likes per news
            num_likes = random.randint(0, 10)
            for _ in range(num_likes):
                NewsLike.objects.create(
                    news=news,
                    user=random.choice(users) if users and random.random() > 0.5 else None,
                    ip_address=fake.ipv4(),
                    session_key=fake.uuid4()[:32],
                    user_agent=fake.user_agent(),
                    created_at=news.created_at + timedelta(days=random.randint(1, 30))
                )

    def create_news_shares(self, news_list):
        """Create NewsShare data"""
        self.stdout.write('Creating NewsShare...')
        
        platform_choices = [choice[0] for choice in NewsShare.PLATFORM_CHOICES]
        users = list(User.objects.all())
        
        for news in news_list:
            # Create 0-5 shares per news
            num_shares = random.randint(0, 5)
            for _ in range(num_shares):
                NewsShare.objects.create(
                    news=news,
                    platform=random.choice(platform_choices),
                    user=random.choice(users) if users and random.random() > 0.5 else None,
                    ip_address=fake.ipv4(),
                    session_key=fake.uuid4()[:32],
                    user_agent=fake.user_agent(),
                    referrer=fake.url() if random.random() > 0.5 else '',
                    created_at=news.created_at + timedelta(days=random.randint(1, 30))
                )

    def create_announcements(self, count):
        """Create Announcement data"""
        self.stdout.write(f'Creating {count} Announcement...')
        
        users = list(User.objects.all())
        if not users:
            self.stdout.write(self.style.WARNING('No users found. Creating announcements without authors.'))
            users = [None]
        
        announcement_titles = [
            'Pengumuman Jadwal Pelayanan Administrasi',
            'Informasi Program Bantuan Sosial',
            'Pengumuman Kegiatan Gotong Royong',
            'Informasi Jadwal Posyandu',
            'Pengumuman Kegiatan PKK',
            'Informasi Program Pelatihan',
            'Pengumuman Kegiatan Karang Taruna',
            'Informasi Jadwal Kegiatan Olahraga',
            'Pengumuman Program Pemberdayaan',
            'Informasi Kegiatan Keagamaan'
        ]
        
        announcement_contents = [
            'Diberitahukan kepada seluruh warga desa bahwa jadwal pelayanan administrasi akan dilaksanakan sesuai dengan ketentuan yang berlaku. Semua warga diharapkan dapat mematuhi jadwal yang telah ditentukan.',
            'Program bantuan sosial akan dilaksanakan dengan melibatkan seluruh elemen masyarakat. Semua warga yang memenuhi kriteria diharapkan dapat mendaftar sesuai dengan ketentuan yang berlaku.',
            'Kegiatan gotong royong akan dilaksanakan dengan mengedepankan prinsip kebersamaan dan gotong royong. Semua warga diharapkan dapat berpartisipasi aktif dalam kegiatan ini.',
            'Jadwal posyandu akan dilaksanakan secara berkala untuk memberikan pelayanan kesehatan yang terbaik bagi masyarakat. Semua ibu dan balita diharapkan dapat mengikuti jadwal yang telah ditentukan.',
            'Kegiatan PKK akan dilaksanakan dengan melibatkan seluruh anggota PKK. Semua anggota diharapkan dapat berpartisipasi aktif dalam setiap kegiatan yang dilaksanakan.',
            'Program pelatihan akan dilaksanakan dengan mengedepankan peningkatan kualitas sumber daya manusia. Semua peserta diharapkan dapat mengikuti pelatihan dengan penuh semangat.',
            'Kegiatan Karang Taruna akan dilaksanakan dengan melibatkan seluruh pemuda desa. Semua anggota diharapkan dapat berpartisipasi aktif dalam setiap kegiatan yang dilaksanakan.',
            'Jadwal kegiatan olahraga akan dilaksanakan secara berkala untuk meningkatkan kesehatan dan kebugaran masyarakat. Semua warga diharapkan dapat mengikuti jadwal yang telah ditentukan.',
            'Program pemberdayaan akan dilaksanakan dengan mengedepankan peningkatan kesejahteraan masyarakat. Semua warga diharapkan dapat berpartisipasi aktif dalam program ini.',
            'Kegiatan keagamaan akan dilaksanakan dengan mengedepankan nilai-nilai spiritual dan keagamaan. Semua warga diharapkan dapat berpartisipasi aktif dalam setiap kegiatan yang dilaksanakan.'
        ]
        
        type_choices = [choice[0] for choice in Announcement.TYPE_CHOICES]
        status_choices = [choice[0] for choice in Announcement.STATUS_CHOICES]
        priority_choices = [choice[0] for choice in Announcement.PRIORITY_CHOICES]
        
        for i in range(count):
            start_date = timezone.now() - timedelta(days=random.randint(1, 30))
            end_date = start_date + timedelta(days=random.randint(1, 30)) if random.random() > 0.5 else None
            
            Announcement.objects.create(
                title=random.choice(announcement_titles),
                content=random.choice(announcement_contents),
                announcement_type=random.choice(type_choices),
                status=random.choice(status_choices),
                priority=random.choice(priority_choices),
                is_pinned=random.choice([True, False]) if random.random() > 0.8 else False,
                is_popup=random.choice([True, False]) if random.random() > 0.9 else False,
                start_date=start_date,
                end_date=end_date,
                target_audience=random.choice(['Semua Warga', 'Ibu-ibu PKK', 'Pemuda', 'Remaja', 'Lansia']),
                contact_person=fake.name(),
                contact_phone=fake.phone_number(),
                location=random.choice(['Kantor Desa', 'Balai Desa', 'Lapangan Desa', 'Masjid', 'Sekolah']),
                author=random.choice(users),
                created_at=timezone.now() - timedelta(days=random.randint(1, 60))
            )

    def create_notification_settings(self):
        """Create NotificationSettings data"""
        self.stdout.write('Creating NotificationSettings...')
        
        settings, created = NotificationSettings.objects.get_or_create(
            name='default',
            defaults={
                'is_enabled': True,
                'show_in_navbar': True,
                'auto_show_delay': 1000,
                'auto_hide_delay': 15000,
                'show_count_badge': True,
                'max_notifications': 5,
                'slide_animation': True,
                'sound_enabled': False,
                'vibration_enabled': True
            }
        )
        
        return settings