"""Isi database dengan data contoh supaya tampilan situs langsung terlihat.

Jalankan: python manage.py seed_demo
Hapus semua data contoh: python manage.py seed_demo --reset
"""

from datetime import date

from django.core.management.base import BaseCommand
from django.utils import timezone

from blog.models import Category, Comment, Post, Tag
from careers.models import Certificate, Education, Experience, Project, Skill
from core.models import ContactMessage, SiteSetting
from profiles.models import Profile, SocialLink


class Command(BaseCommand):
    help = "Isi database dengan data contoh untuk pratinjau tampilan."

    def add_arguments(self, parser):
        parser.add_argument("--reset", action="store_true", help="Kosongkan data sebelum mengisi.")

    def handle(self, *args, **options):
        if options["reset"]:
            for model in (Comment, Post, Tag, Category, Project, Experience,
                          Education, Certificate, Skill, SocialLink, ContactMessage):
                model.objects.all().delete()
            self.stdout.write(self.style.WARNING("Data lama dihapus."))

        # ------------------------------------------------------------- profil
        profile = Profile.get_solo()
        profile.full_name = "Nama Kamu"
        profile.headline = "Fullstack Developer & Problem Solver"
        profile.tagline_words = "Fullstack Developer, Django Enthusiast, UI Craftsman, Lifelong Learner"
        profile.bio = (
            "Saya membangun aplikasi web yang cepat, rapi, dan enak dipakai. "
            "Fokus di Python/Django, dengan perhatian besar pada detail antarmuka."
        )
        profile.about = (
            "Perjalanan saya di dunia teknologi dimulai dari rasa penasaran sederhana: "
            "bagaimana sebuah website bisa bekerja?\n\n"
            "Sejak itu saya menghabiskan waktu bertahun-tahun membangun berbagai produk digital — "
            "mulai dari sistem internal perusahaan, aplikasi kasir, sampai platform yang dipakai ribuan orang. "
            "Yang paling saya nikmati adalah momen ketika masalah rumit berhasil disederhanakan "
            "menjadi solusi yang terasa jelas dan wajar bagi penggunanya.\n\n"
            "Di luar coding, saya suka menulis, ngopi, dan mengulik hal-hal baru yang belum saya mengerti."
        )
        profile.location = "Semarang, Indonesia"
        profile.email = "coderingid@gmail.com"
        profile.phone = "081234567890"
        profile.meta_description = "Portofolio dan blog pribadi — Django developer asal Indonesia."
        profile.is_open_to_work = True
        profile.save()

        socials = [
            ("github", "https://github.com/username", 1),
            ("linkedin", "https://linkedin.com/in/username", 2),
            ("instagram", "https://instagram.com/username", 3),
            ("x", "https://x.com/username", 4),
        ]
        for platform, url, order in socials:
            SocialLink.objects.get_or_create(
                profile=profile, platform=platform, defaults={"url": url, "order": order}
            )

        setting = SiteSetting.get_solo()
        setting.site_name = "Nama Kamu"
        setting.site_tagline = "Portofolio, pengalaman, dan tulisan pribadi."
        setting.footer_text = "Dibuat dengan Django & MySQL."
        setting.save()

        # ------------------------------------------------------------- skill
        skill_data = [
            ("Python", "language", 92), ("JavaScript", "language", 84),
            ("PHP", "language", 75), ("HTML & CSS", "language", 90),
            ("Django", "framework", 93), ("Django REST Framework", "framework", 85),
            ("Tailwind CSS", "framework", 88), ("Alpine.js", "framework", 72),
            ("MySQL", "database", 87), ("PostgreSQL", "database", 78),
            ("Redis", "database", 65),
            ("Git & GitHub", "tool", 88), ("Docker", "tool", 70), ("Linux Server", "tool", 74),
            ("Figma", "design", 68),
            ("Problem Solving", "soft", 90), ("Komunikasi Tim", "soft", 85),
        ]
        skills = {}
        for order, (name, category, level) in enumerate(skill_data):
            skill, _ = Skill.objects.get_or_create(
                name=name,
                defaults={"category": category, "level": level, "order": order, "is_featured": level >= 80},
            )
            skills[name] = skill

        # -------------------------------------------------------- pengalaman
        experiences = [
            {
                "company": "PT Teknologi Nusantara",
                "position": "Senior Backend Developer",
                "employment_type": "fulltime",
                "location": "Jakarta",
                "location_type": "hybrid",
                "start_date": date(2023, 3, 1),
                "is_current": True,
                "description": (
                    "Memimpin pengembangan layanan backend yang melayani lebih dari 50.000 pengguna aktif bulanan.\n"
                    "Merancang ulang arsitektur database sehingga waktu respons API turun 60%.\n"
                    "Membimbing 4 developer junior lewat code review dan sesi mentoring mingguan.\n"
                    "Menyiapkan pipeline CI/CD yang memangkas waktu rilis dari 2 jam menjadi 12 menit."
                ),
                "skills": ["Python", "Django", "PostgreSQL", "Docker", "Redis"],
            },
            {
                "company": "Startup Kreatif Digital",
                "position": "Fullstack Developer",
                "employment_type": "fulltime",
                "location": "Bandung",
                "location_type": "remote",
                "start_date": date(2021, 6, 1),
                "end_date": date(2023, 2, 28),
                "description": (
                    "Membangun platform e-commerce dari nol sampai dipakai 200+ merchant.\n"
                    "Mengintegrasikan payment gateway Midtrans dan Xendit beserta rekonsiliasinya.\n"
                    "Mengembangkan dashboard analitik real-time untuk tim operasional."
                ),
                "skills": ["Django", "JavaScript", "MySQL", "Tailwind CSS"],
            },
            {
                "company": "CV Solusi Data",
                "position": "Web Developer",
                "employment_type": "contract",
                "location": "Semarang",
                "location_type": "onsite",
                "start_date": date(2020, 1, 1),
                "end_date": date(2021, 5, 31),
                "description": (
                    "Mengerjakan 12+ website klien di berbagai industri.\n"
                    "Membangun sistem manajemen inventori untuk distributor lokal.\n"
                    "Mengelola server produksi dan proses backup harian."
                ),
                "skills": ["PHP", "MySQL", "HTML & CSS", "Git & GitHub"],
            },
            {
                "company": "Universitas Diponegoro",
                "position": "Asisten Laboratorium Pemrograman",
                "employment_type": "parttime",
                "location": "Semarang",
                "location_type": "onsite",
                "start_date": date(2019, 8, 1),
                "end_date": date(2019, 12, 31),
                "description": (
                    "Mendampingi praktikum pemrograman dasar untuk 60 mahasiswa per angkatan.\n"
                    "Menyusun modul latihan dan menilai tugas mingguan."
                ),
                "skills": ["Python", "Problem Solving"],
            },
        ]

        for order, data in enumerate(experiences):
            skill_names = data.pop("skills")
            exp, created = Experience.objects.get_or_create(
                company=data["company"], position=data["position"], defaults={**data, "order": order}
            )
            if created:
                exp.skills.set([skills[n] for n in skill_names if n in skills])

        # --------------------------------------------------------- pendidikan
        Education.objects.get_or_create(
            school="Universitas Diponegoro",
            degree="S1 Teknik Informatika",
            defaults={
                "field_of_study": "Rekayasa Perangkat Lunak",
                "start_date": date(2016, 8, 1),
                "end_date": date(2020, 7, 31),
                "grade": "IPK 3.62",
                "description": "Skripsi tentang optimasi query pada sistem basis data terdistribusi.",
                "order": 0,
            },
        )
        Education.objects.get_or_create(
            school="SMA Negeri 1 Semarang",
            degree="SMA — Jurusan IPA",
            defaults={
                "start_date": date(2013, 7, 1),
                "end_date": date(2016, 6, 30),
                "order": 1,
            },
        )

        # --------------------------------------------------------- sertifikat
        certificates = [
            ("AWS Certified Solutions Architect", "Amazon Web Services", date(2024, 5, 10)),
            ("Meta Backend Developer Professional", "Meta via Coursera", date(2023, 8, 22)),
            ("Google Data Analytics", "Google", date(2022, 11, 5)),
            ("Django Advanced Concepts", "Dicoding Indonesia", date(2022, 3, 14)),
        ]
        for order, (name, issuer, issued) in enumerate(certificates):
            Certificate.objects.get_or_create(
                name=name,
                defaults={
                    "issuer": issuer,
                    "issue_date": issued,
                    "credential_url": "https://example.com/credential",
                    "order": order,
                },
            )

        # ------------------------------------------------------------ proyek
        projects = [
            {
                "title": "SIKAS — Sistem Kasir Modern",
                "short_description": "Aplikasi Point of Sale berbasis web dengan mode offline dan sinkronisasi otomatis.",
                "description": (
                    "SIKAS lahir dari keluhan pemilik toko yang kehilangan transaksi setiap kali internet mati.\n\n"
                    "Sistem ini menyimpan transaksi secara lokal di browser, lalu menyinkronkannya begitu koneksi pulih. "
                    "Fitur lain mencakup manajemen stok multi-cabang, laporan penjualan harian, dan cetak struk termal.\n\n"
                    "Kini dipakai oleh lebih dari 30 toko ritel di Jawa Tengah."
                ),
                "role": "Lead Developer",
                "client": "Beberapa UMKM Retail",
                "status": "completed",
                "is_featured": True,
                "started_at": date(2023, 1, 10),
                "finished_at": date(2023, 9, 30),
                "demo_url": "https://example.com/demo",
                "repo_url": "https://github.com/username/sikas",
                "tech": ["Django", "MySQL", "Tailwind CSS", "JavaScript"],
            },
            {
                "title": "Jelajah Nusantara",
                "short_description": "Platform pemesanan paket wisata lokal lengkap dengan itinerary interaktif.",
                "description": (
                    "Marketplace yang menghubungkan wisatawan dengan penyedia tur lokal.\n\n"
                    "Tantangan terbesarnya adalah membuat kalender ketersediaan yang akurat "
                    "ketika satu pemandu bisa memegang beberapa paket sekaligus. "
                    "Solusinya adalah model penjadwalan berbasis slot dengan penguncian optimistis."
                ),
                "role": "Fullstack Developer",
                "client": "PT Wisata Digital",
                "status": "completed",
                "is_featured": True,
                "started_at": date(2022, 4, 1),
                "finished_at": date(2022, 12, 15),
                "demo_url": "https://example.com/demo",
                "tech": ["Django", "PostgreSQL", "Alpine.js"],
            },
            {
                "title": "API Cuaca Indonesia",
                "short_description": "REST API terbuka yang menyajikan data cuaca 514 kota di Indonesia.",
                "description": (
                    "Layanan API gratis yang mengambil data BMKG, menormalkannya, dan menyajikannya "
                    "dalam format JSON yang konsisten.\n\n"
                    "Dilengkapi caching Redis dan rate limiting, mampu melayani sekitar 2 juta permintaan per bulan."
                ),
                "role": "Solo Developer",
                "status": "ongoing",
                "is_featured": True,
                "started_at": date(2024, 2, 1),
                "repo_url": "https://github.com/username/weather-api",
                "tech": ["Django REST Framework", "Redis", "Docker"],
            },
            {
                "title": "Dashboard Analitik Sekolah",
                "short_description": "Visualisasi data nilai dan kehadiran siswa untuk 3 sekolah menengah.",
                "description": "Dashboard yang membantu guru melihat tren nilai dan pola kehadiran secara sekilas.",
                "role": "Backend Developer",
                "status": "completed",
                "started_at": date(2021, 8, 1),
                "finished_at": date(2021, 11, 30),
                "tech": ["Python", "MySQL", "JavaScript"],
            },
            {
                "title": "Portofolio Generator",
                "short_description": "Alat bantu membuat website portofolio hanya dengan mengisi formulir.",
                "description": "Eksperimen akhir pekan yang berubah jadi alat yang cukup sering dipakai teman-teman.",
                "role": "Solo Developer",
                "status": "archived",
                "started_at": date(2021, 2, 1),
                "finished_at": date(2021, 4, 1),
                "tech": ["Django", "Tailwind CSS"],
            },
            {
                "title": "Bot Pengingat Tagihan",
                "short_description": "Bot WhatsApp yang mengingatkan jatuh tempo tagihan pelanggan secara otomatis.",
                "description": "Mengurangi keterlambatan pembayaran hingga 40% pada bulan pertama pemakaian.",
                "role": "Solo Developer",
                "status": "completed",
                "started_at": date(2023, 10, 1),
                "finished_at": date(2023, 12, 20),
                "tech": ["Python", "Redis", "Docker"],
            },
        ]

        for order, data in enumerate(projects):
            tech_names = data.pop("tech")
            # Deskripsi proyek dirender sebagai HTML, jadi ubah paragraf teks
            # polos di atas menjadi <p> sebelum disimpan.
            data["description"] = "".join(
                f"<p>{para.strip()}</p>"
                for para in data["description"].split("\n\n")
                if para.strip()
            )
            project, created = Project.objects.get_or_create(
                title=data["title"], defaults={**data, "order": order}
            )
            if created:
                project.tech_stack.set([skills[n] for n in tech_names if n in skills])

        # -------------------------------------------------------- kategori/tag
        categories = {}
        for name, color in [("Tutorial", "#f97316"), ("Catatan", "#facc15"), ("Karier", "#fb923c")]:
            categories[name], _ = Category.objects.get_or_create(name=name, defaults={"color": color})

        tags = {}
        for name in ["django", "python", "mysql", "produktivitas", "karier", "tailwind", "belajar"]:
            tags[name], _ = Tag.objects.get_or_create(name=name)

        # ------------------------------------------------------------ postingan
        posts = [
            {
                "title": "Kenapa Saya Masih Memilih Django di 2026",
                "category": "Catatan",
                "tags": ["django", "python"],
                "excerpt": "Di tengah ramainya framework baru, Django tetap jadi pilihan pertama saya. Ini alasannya.",
                "content": (
                    "<p>Setiap tahun muncul framework baru yang menjanjikan kecepatan dan kemudahan. "
                    "Saya sudah mencoba banyak di antaranya. Tapi ketika harus mengirim produk yang benar-benar dipakai orang, "
                    "saya selalu kembali ke Django.</p>"
                    "<h2>Baterai sudah termasuk</h2>"
                    "<p>Autentikasi, admin panel, ORM, migrasi, proteksi CSRF — semuanya sudah ada sejak menit pertama. "
                    "Waktu yang biasanya habis untuk merakit potongan-potongan itu bisa langsung dipakai membangun fitur.</p>"
                    "<h2>ORM yang matang</h2>"
                    "<p>ORM Django bukan yang paling canggih, tapi paling bisa diprediksi. "
                    "Setelah bertahun-tahun, saya hampir selalu bisa menebak query SQL apa yang akan dihasilkan.</p>"
                    "<blockquote>Teknologi yang membosankan adalah teknologi yang bisa kamu andalkan jam tiga pagi.</blockquote>"
                    "<h2>Ekosistemnya dewasa</h2>"
                    "<p>Hampir setiap masalah umum sudah ada paketnya, dan paket itu biasanya sudah teruji "
                    "bertahun-tahun di lingkungan produksi orang lain.</p>"
                    "<p>Bukan berarti Django cocok untuk semua hal. Tapi untuk aplikasi web yang punya database, "
                    "pengguna, dan aturan bisnis, Django masih sulit dikalahkan.</p>"
                ),
                "is_pinned": True,
                "views": 1284,
                "likes": 47,
            },
            {
                "title": "Membuat Sistem CRUD Rapi dengan Class-Based View",
                "category": "Tutorial",
                "tags": ["django", "python", "belajar"],
                "excerpt": "Berhenti menulis view CRUD berulang-ulang. Pola ini memangkas kodenya sampai setengah.",
                "content": (
                    "<p>Kalau kamu pernah membangun panel admin sendiri, kamu pasti tahu rasanya: "
                    "menulis <code>ListView</code>, <code>CreateView</code>, <code>UpdateView</code>, dan "
                    "<code>DeleteView</code> yang isinya nyaris sama, berulang kali untuk setiap model.</p>"
                    "<h2>Masalahnya</h2>"
                    "<p>Duplikasi. Setiap kali mau mengubah tampilan tabel, kamu harus menyentuh sepuluh template.</p>"
                    "<h2>Solusinya: base class + konfigurasi</h2>"
                    "<pre><code>class CrudListView(LoginRequiredMixin, ListView):\n"
                    "    template_name = 'dashboard/generic_list.html'\n"
                    "    columns = []\n\n"
                    "    def get_context_data(self, **kwargs):\n"
                    "        ctx = super().get_context_data(**kwargs)\n"
                    "        ctx['columns'] = self.columns\n"
                    "        return ctx</code></pre>"
                    "<p>Setelah itu, setiap model cukup mendeklarasikan kolom apa yang ingin ditampilkan:</p>"
                    "<pre><code>class ProjectListView(CrudListView):\n"
                    "    model = Project\n"
                    "    columns = [\n"
                    "        {'label': 'Judul', 'field': 'title'},\n"
                    "        {'label': 'Status', 'field': 'get_status_display'},\n"
                    "    ]</code></pre>"
                    "<p>Satu template melayani semua model. Ubah sekali, berubah di mana-mana.</p>"
                ),
                "views": 863,
                "likes": 31,
            },
            {
                "title": "Pelajaran dari Tiga Tahun Kerja Remote",
                "category": "Karier",
                "tags": ["karier", "produktivitas"],
                "excerpt": "Kerja remote bukan soal bebas bangun siang. Ini yang benar-benar menentukan.",
                "content": (
                    "<p>Tiga tahun lalu saya pikir kerja remote artinya kebebasan. Ternyata artinya disiplin.</p>"
                    "<h2>Komunikasi tertulis adalah segalanya</h2>"
                    "<p>Ketika tidak ada yang bisa menepuk bahumu, kualitas tulisanmu menentukan seberapa cepat "
                    "tim bergerak. Saya belajar menulis pesan yang bisa dipahami tanpa perlu balasan susulan.</p>"
                    "<h2>Batas waktu harus dibuat sendiri</h2>"
                    "<p>Tanpa jam pulang kantor, pekerjaan akan mengisi seluruh harimu kalau dibiarkan. "
                    "Saya menutup laptop di jam yang sama setiap hari, apa pun kondisinya.</p>"
                    "<h2>Sengaja bersosialisasi</h2>"
                    "<p>Obrolan ringan tidak terjadi dengan sendirinya di Zoom. Harus dijadwalkan, "
                    "dan itu terasa aneh di awal — tapi berpengaruh besar.</p>"
                ),
                "views": 2140,
                "likes": 89,
            },
            {
                "title": "Optimasi Query Django yang Sering Terlewat",
                "category": "Tutorial",
                "tags": ["django", "mysql", "python"],
                "excerpt": "select_related dan prefetch_related hanyalah permulaan. Ini beberapa trik lanjutannya.",
                "content": (
                    "<p>Masalah N+1 query adalah pembunuh performa paling umum di aplikasi Django. "
                    "Kebanyakan orang tahu solusi dasarnya, tapi berhenti di situ.</p>"
                    "<h2>only() dan defer()</h2>"
                    "<p>Kalau kamu cuma butuh dua kolom dari tabel dengan tiga puluh kolom, jangan ambil semuanya.</p>"
                    "<pre><code>Post.objects.only('title', 'slug')</code></pre>"
                    "<h2>Gunakan Prefetch dengan queryset khusus</h2>"
                    "<pre><code>Prefetch('comments', queryset=Comment.objects.filter(is_approved=True))</code></pre>"
                    "<h2>Hitung di database, bukan di Python</h2>"
                    "<p>Agregasi seperti <code>Count</code> dan <code>Sum</code> jauh lebih murah "
                    "dijalankan di sisi database.</p>"
                ),
                "views": 651,
                "likes": 24,
            },
            {
                "title": "Baru saja merilis versi baru website ini",
                "post_type": "update",
                "category": "Catatan",
                "tags": ["tailwind"],
                "excerpt": "Desain ulang total dengan tema gelap dan animasi yang lebih halus.",
                "content": (
                    "<p>Setelah dua minggu utak-atik di sela pekerjaan, versi baru website ini akhirnya naik.</p>"
                    "<p>Yang berubah: tema gelap penuh dengan aksen oranye-kuning, animasi scroll di hampir "
                    "setiap bagian, dan panel admin sendiri supaya saya bisa posting tanpa menyentuh kode lagi.</p>"
                    "<p>Masih ada beberapa hal yang ingin saya rapikan, tapi sudah cukup layak dipamerkan.</p>"
                ),
                "views": 412,
                "likes": 18,
            },
            {
                "title": "Cara Saya Menyusun Struktur Project Django",
                "category": "Tutorial",
                "tags": ["django", "belajar"],
                "excerpt": "Struktur folder yang tetap masuk akal setelah project tumbuh besar.",
                "content": (
                    "<p>Struktur bawaan <code>startproject</code> bagus untuk belajar, tapi mulai berantakan "
                    "begitu project punya lebih dari tiga app.</p>"
                    "<h2>Satu app satu tanggung jawab</h2>"
                    "<p>Kalau kamu kesulitan menamai sebuah app, kemungkinan besar app itu mengerjakan terlalu banyak hal.</p>"
                    "<h2>Pisahkan settings</h2>"
                    "<p>Simpan kredensial di file <code>.env</code>, jangan pernah masuk ke repository.</p>"
                    "<h2>Template mengikuti struktur app</h2>"
                    "<p>Konsistensi penamaan menghemat waktu lebih banyak daripada yang kamu kira.</p>"
                ),
                "views": 977,
                "likes": 35,
            },
        ]

        created_posts = []
        for i, data in enumerate(posts):
            post, created = Post.objects.get_or_create(
                title=data["title"],
                defaults={
                    "post_type": data.get("post_type", "article"),
                    "excerpt": data["excerpt"],
                    "content": data["content"],
                    "category": categories.get(data["category"]),
                    "status": "published",
                    "published_at": timezone.now() - timezone.timedelta(days=(len(posts) - i) * 6),
                    "is_pinned": data.get("is_pinned", False),
                    "views_count": data.get("views", 0),
                    "likes_count": data.get("likes", 0),
                },
            )
            if created:
                post.tags.set([tags[t] for t in data["tags"] if t in tags])
            created_posts.append(post)

        # ------------------------------------------------------------ komentar
        if created_posts:
            comment_data = [
                ("Budi Santoso", "budi@example.com", "Setuju banget soal 'teknologi membosankan'. Sudah 5 tahun pakai Django dan belum pernah menyesal.", True),
                ("Sari Wijaya", "sari@example.com", "Tulisan yang bagus. Boleh minta contoh repo lengkapnya?", True),
                ("Andi Pratama", "andi@example.com", "Ini yang saya cari. Terima kasih sudah menulis sedetail ini.", False),
            ]
            for name, email, body, approved in comment_data:
                Comment.objects.get_or_create(
                    post=created_posts[0],
                    name=name,
                    defaults={"email": email, "body": body, "is_approved": approved},
                )

        # --------------------------------------------------------- pesan masuk
        messages_data = [
            ("Rina Kartika", "rina@example.com", "Tawaran kerja sama proyek",
             "Halo, saya dari tim produk di sebuah startup fintech. Kami sedang mencari backend developer "
             "untuk proyek 3 bulan. Apakah kamu tersedia untuk diskusi minggu ini?", False),
            ("Dimas Nugroho", "dimas@example.com", "Pertanyaan soal artikel Django",
             "Mas, di artikel soal CRUD generik itu, bagaimana kalau modelnya punya relasi many-to-many? "
             "Apakah polanya masih bisa dipakai?", False),
            ("Laras Ayu", "laras@example.com", "Terima kasih!",
             "Cuma mau bilang terima kasih. Tutorial optimasi query-nya menyelamatkan project skripsi saya.", True),
        ]
        for name, email, subject, message, is_read in messages_data:
            ContactMessage.objects.get_or_create(
                name=name, email=email, defaults={"subject": subject, "message": message, "is_read": is_read}
            )

        self.stdout.write(self.style.SUCCESS("\nData contoh berhasil dibuat:"))
        self.stdout.write(f"  Skill          : {Skill.objects.count()}")
        self.stdout.write(f"  Pengalaman     : {Experience.objects.count()}")
        self.stdout.write(f"  Pendidikan     : {Education.objects.count()}")
        self.stdout.write(f"  Sertifikat     : {Certificate.objects.count()}")
        self.stdout.write(f"  Proyek         : {Project.objects.count()}")
        self.stdout.write(f"  Postingan      : {Post.objects.count()}")
        self.stdout.write(f"  Komentar       : {Comment.objects.count()}")
        self.stdout.write(f"  Pesan masuk    : {ContactMessage.objects.count()}")
