<?php

namespace Database\Seeders;

use App\Models\{Activity, AttendanceSession, AuditLog, Letter, Member, News, Organization, PopupAnnouncement, Program, User, WhatsAppLog};
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Str;

class DatabaseSeeder extends Seeder
{
    public function run(): void
    {
        $mwc = Organization::updateOrCreate(
            ['slug' => 'mwcnu-tugu'],
            [
                'type' => 'mwcnu',
                'name' => 'MWCNU Kecamatan Tugu',
                'acronym' => 'MWCNU Tugu',
                'website' => 'https://nutugu.org',
                'theme_color' => '#07583b',
                'email' => 'sekretariat@nutugu.org',
                'phone' => '08xxxxxxxxxx',
                'address' => 'Kecamatan Tugu, Kota Semarang',
                'period_start' => '2026-01-01',
                'period_end' => '2031-12-31',
                'is_active' => true,
                'public_page_enabled' => true,
                'show_in_main_menu' => true,
                'aggregate_news' => true,
                'aggregate_events' => true,
                'aggregate_programs' => true,
                'aggregate_gallery' => true,
                'include_in_statistics' => true,
                'include_in_reports' => true,
                'settings' => $this->profileSettings(
                    'MWCNU Tugu menjadi ruang khidmah, koordinasi, pelayanan jam’iyah dan jamaah di Kecamatan Tugu.',
                    'Terwujudnya tata kelola MWCNU Tugu yang tertib, aktif, kolaboratif, transparan, dan dekat dengan jamaah.',
                    [
                        'Menguatkan administrasi dan kelembagaan MWCNU, Ranting, Banom, dan Lembaga.',
                        'Mendorong program keagamaan, sosial, pendidikan, kaderisasi, dan ekonomi yang terukur.',
                        'Memperkuat koordinasi antarunit dan dokumentasi kegiatan secara digital.',
                        'Menyediakan layanan informasi organisasi yang mudah diakses pengurus dan masyarakat.',
                    ],
                    ['Administrasi Organisasi', 'Koordinasi Ranting', 'Kaderisasi', 'Pelayanan Jamaah', 'Publikasi & Informasi', 'Monitoring Program']
                ),
            ]
        );

        $unitDefinitions = [
            [
                'type' => 'banom', 'name' => 'IPNU-IPPNU Kecamatan Tugu', 'acronym' => 'IPNU-IPPNU', 'slug' => 'ipnuippnu', 'color' => '#11663c',
                'tagline' => 'Ruang kaderisasi, pembelajaran, dan pengabdian pelajar NU Kecamatan Tugu.',
                'vision' => 'Terbentuknya kader pelajar NU yang berilmu, berkarakter, aktif berorganisasi, dan mampu memberi manfaat di lingkungan masing-masing.',
                'missions' => ['Memperkuat kaderisasi pelajar.', 'Mengembangkan literasi, kepemimpinan, dan kecakapan digital.', 'Mendorong kegiatan keagamaan dan sosial pelajar.', 'Menguatkan koordinasi pimpinan ranting dan komisariat.'],
                'services' => ['Database Kader', 'Kaderisasi', 'Ranting/Komisariat', 'Agenda Pelajar', 'Berita', 'Surat Menyurat'],
            ],
            [
                'type' => 'banom', 'name' => 'GP Ansor Kecamatan Tugu', 'acronym' => 'GP Ansor', 'slug' => 'ansor', 'color' => '#0a7d45',
                'tagline' => 'Khidmah kader muda NU melalui penguatan organisasi, kaderisasi, sosial, dan kebangsaan.',
                'vision' => 'Terwujudnya kader Ansor yang militan dalam khidmah, tertib organisasi, dan hadir memberi manfaat bagi masyarakat.',
                'missions' => ['Penguatan kaderisasi berjenjang.', 'Penataan administrasi organisasi.', 'Pengembangan kegiatan sosial dan kemasyarakatan.', 'Penguatan koordinasi dengan Ranting dan MWCNU.'],
                'services' => ['Kaderisasi', 'Data Kader', 'Program Sosial', 'Ranting', 'Agenda', 'Surat Menyurat'],
            ],
            [
                'type' => 'banom', 'name' => 'Fatayat NU Kecamatan Tugu', 'acronym' => 'Fatayat NU', 'slug' => 'fatayat', 'color' => '#0f8b5f',
                'tagline' => 'Penguatan perempuan muda NU melalui kaderisasi, keluarga, pendidikan, sosial, dan kemandirian.',
                'vision' => 'Terwujudnya kader Fatayat NU yang berdaya, berpengetahuan, berakhlak, dan aktif memberi manfaat bagi keluarga serta masyarakat.',
                'missions' => ['Menguatkan kaderisasi perempuan muda NU.', 'Mengembangkan program keluarga, pendidikan, dan sosial.', 'Meningkatkan literasi kesehatan dan ekonomi keluarga.', 'Mendorong tertib administrasi dan publikasi organisasi.'],
                'services' => ['Kaderisasi', 'Program Perempuan', 'Keluarga', 'Sosial', 'Berita', 'Surat Menyurat'],
            ],
            [
                'type' => 'banom', 'name' => 'Muslimat NU Kecamatan Tugu', 'acronym' => 'Muslimat NU', 'slug' => 'muslimat', 'color' => '#357a38',
                'tagline' => 'Menguatkan majelis, pendidikan keluarga, sosial, dan pelayanan jamaah perempuan NU.',
                'vision' => 'Terwujudnya jamaah Muslimat NU yang kuat dalam keagamaan, keluarga, pendidikan, sosial, dan kemandirian.',
                'missions' => ['Mengembangkan kegiatan keagamaan dan majelis taklim.', 'Memperkuat pendidikan keluarga.', 'Mendorong kegiatan sosial dan kesehatan.', 'Menguatkan jaringan pengurus dan ranting.'],
                'services' => ['Majelis Taklim', 'Program Keluarga', 'Sosial', 'Pendidikan', 'Agenda', 'Administrasi'],
            ],
            [
                'type' => 'lembaga', 'name' => 'LAZISNU MWCNU Tugu', 'acronym' => 'LAZISNU', 'slug' => 'lazisnu', 'color' => '#0a8a55',
                'tagline' => 'Pengelolaan zakat, infak, sedekah, dan program sosial secara tertib, transparan, dan tepat sasaran.',
                'vision' => 'Menjadi pengelola ZIS yang amanah, profesional, transparan, dan berdampak bagi masyarakat Kecamatan Tugu.',
                'missions' => ['Meningkatkan penghimpunan ZIS.', 'Menyusun program penyaluran yang terukur.', 'Meningkatkan transparansi dan pelaporan.', 'Menguatkan jejaring UPZIS dan relawan.'],
                'services' => ['Penghimpunan', 'Penyaluran', 'Program ZIS', 'Penerima Manfaat', 'Transparansi', 'Laporan'],
            ],
            [
                'type' => 'lembaga', 'name' => 'LBMNU MWCNU Tugu', 'acronym' => 'LBMNU', 'slug' => 'lbm', 'color' => '#24593f',
                'tagline' => 'Ruang kajian, diskusi, dan Bahtsul Masail untuk menjawab persoalan keagamaan dan kemasyarakatan.',
                'vision' => 'Terwujudnya forum kajian keislaman yang responsif, tertib, dan bermanfaat bagi warga NU di Kecamatan Tugu.',
                'missions' => ['Menghimpun persoalan keagamaan dari jamaah.', 'Menyelenggarakan Bahtsul Masail secara berkala.', 'Mendokumentasikan hasil kajian dan referensi.', 'Menghubungkan persoalan yang memerlukan pembahasan tingkat lebih tinggi.'],
                'services' => ['Usulan Masalah', 'Bahtsul Masail', 'Hasil Kajian', 'Referensi', 'Dokumen', 'Agenda'],
            ],
            [
                'type' => 'lembaga', 'name' => 'Lembaga Perekonomian NU Tugu', 'acronym' => 'Perekonomian', 'slug' => 'perekonomian', 'color' => '#496d3c',
                'tagline' => 'Penguatan ekonomi jamaah melalui pendataan potensi, UMKM, pelatihan, dan kolaborasi usaha.',
                'vision' => 'Terbangunnya ekosistem ekonomi warga NU Kecamatan Tugu yang saling terhubung, produktif, dan berkelanjutan.',
                'missions' => ['Mendata UMKM dan pengusaha NU.', 'Mendorong pelatihan serta pendampingan usaha.', 'Membuka ruang promosi dan jejaring produk.', 'Mengembangkan kolaborasi ekonomi antarjamaah.'],
                'services' => ['Direktori UMKM', 'Pelatihan', 'Pendampingan', 'Produk', 'Kerja Sama', 'Program Ekonomi'],
            ],
            [
                'type' => 'lembaga', 'name' => 'LP Ma’arif NU Kecamatan Tugu', 'acronym' => 'LP Ma’arif', 'slug' => 'lpmaarif', 'color' => '#1f7049',
                'tagline' => 'Sinergi pendidikan NU melalui pendataan satuan pendidikan, program mutu, dan kegiatan pendidikan.',
                'vision' => 'Terwujudnya jejaring pendidikan NU Kecamatan Tugu yang tertata, kolaboratif, dan berorientasi pada peningkatan mutu.',
                'missions' => ['Memetakan satuan pendidikan dan potensi pendidikan NU.', 'Mendorong peningkatan mutu pembelajaran dan kelembagaan.', 'Mengembangkan program guru, siswa, dan wali murid.', 'Mendokumentasikan kegiatan dan capaian pendidikan.'],
                'services' => ['Data Sekolah/Madrasah', 'Program Pendidikan', 'Guru & Siswa', 'Agenda', 'Berita', 'Dokumen'],
            ],
        ];

        $units = [];
        foreach ($unitDefinitions as $i => $d) {
            $units[$d['slug']] = Organization::updateOrCreate(
                ['slug' => $d['slug']],
                [
                    'parent_id' => $mwc->id,
                    'type' => $d['type'],
                    'name' => $d['name'],
                    'acronym' => $d['acronym'],
                    'website' => 'https://nutugu.org/'.$d['slug'],
                    'theme_color' => $d['color'],
                    'email' => $d['slug'].'@nutugu.org',
                    'phone' => '08xxxxxxxxxx',
                    'address' => 'Kecamatan Tugu, Kota Semarang',
                    'period_start' => '2026-01-01',
                    'period_end' => '2031-12-31',
                    'is_active' => true,
                    'public_page_enabled' => true,
                    'show_in_main_menu' => true,
                    'aggregate_news' => true,
                    'aggregate_events' => true,
                    'aggregate_programs' => true,
                    'aggregate_gallery' => true,
                    'include_in_statistics' => true,
                    'include_in_reports' => true,
                    'sort_order' => $i + 1,
                    'settings' => $this->profileSettings($d['tagline'], $d['vision'], $d['missions'], $d['services']),
                ]
            );
        }

        // Kecamatan Tugu terdiri dari tujuh kelurahan. Status PRNU di bawah ini adalah contoh awal aplikasi dan dapat diubah/dinonaktifkan admin.
        $rantingNames = ['Jerakah', 'Tugurejo', 'Karanganyar', 'Randugarut', 'Mangkang Wetan', 'Mangunharjo', 'Mangkang Kulon'];
        $rantings = [];
        foreach ($rantingNames as $i => $area) {
            $slug = Str::slug($area);
            $rantings[$slug] = Organization::updateOrCreate(
                ['slug' => $slug],
                [
                    'parent_id' => $mwc->id,
                    'type' => 'ranting',
                    'name' => 'PRNU '.$area,
                    'acronym' => 'PRNU '.$area,
                    'website' => 'https://nutugu.org/ranting/'.$slug,
                    'theme_color' => '#0b6b45',
                    'email' => $slug.'@nutugu.org',
                    'address' => 'Kelurahan '.$area.', Kecamatan Tugu, Kota Semarang',
                    'period_start' => '2026-01-01',
                    'period_end' => '2031-12-31',
                    'is_active' => true,
                    'public_page_enabled' => true,
                    'show_in_main_menu' => false,
                    'aggregate_news' => true,
                    'aggregate_events' => true,
                    'aggregate_programs' => true,
                    'aggregate_gallery' => true,
                    'include_in_statistics' => true,
                    'include_in_reports' => true,
                    'sort_order' => $i + 1,
                    'settings' => $this->profileSettings(
                        'Halaman informasi dan administrasi digital PRNU '.$area.'.',
                        'Mewujudkan Ranting NU yang aktif, tertib administrasi, dekat dengan jamaah, dan terhubung dengan MWCNU Tugu.',
                        ['Menata administrasi dan data pengurus.', 'Mengaktifkan kegiatan keagamaan dan sosial.', 'Mendokumentasikan program serta kegiatan.', 'Menguatkan koordinasi dengan MWCNU dan unit organisasi lain.'],
                        ['Pengurus', 'Program Ranting', 'Kegiatan', 'Berita', 'Surat', 'Dokumen']
                    ),
                ]
            );
        }

        $super = User::updateOrCreate(
            ['email' => 'admin@nutugu.org'],
            ['name' => 'Super Admin MWCNU', 'password' => Hash::make('Admin123!'), 'role' => 'super_admin', 'is_active' => true]
        );

        foreach ($units as $slug => $unit) {
            User::updateOrCreate(
                ['email' => $slug.'@nutugu.org'],
                ['organization_id' => $unit->id, 'name' => 'Admin '.$unit->acronym, 'password' => Hash::make('Admin123!'), 'role' => 'admin_unit', 'is_active' => true]
            );
        }

        foreach ($rantings as $slug => $ranting) {
            User::updateOrCreate(
                ['email' => 'ranting.'.$slug.'@nutugu.org'],
                ['organization_id' => $ranting->id, 'name' => 'Admin '.$ranting->acronym, 'password' => Hash::make('Admin123!'), 'role' => 'admin_unit', 'is_active' => true]
            );
        }

        $allOrganizations = collect([$mwc])->merge($units)->merge($rantings)->values();
        foreach ($allOrganizations as $index => $org) {
            $this->seedMembers($org, $index);
            $this->seedPrograms($org, $index);
            $this->seedActivities($org, $index);
            $this->seedNews($org, $super, $index);
            $this->seedLetters($org, $index);
        }

        $this->seedLetterTemplates($mwc, $units);
        $this->seedPopups();
        $this->seedAttendance($mwc);
        $this->seedAuditLogs($allOrganizations, $super);

        $ansor = $units['ansor'];
        $member = Member::where('organization_id', $ansor->id)->first();
        if ($member) {
            WhatsAppLog::updateOrCreate(
                ['organization_id' => $ansor->id, 'member_id' => $member->id, 'message' => "Assalamu'alaikum {$member->nickname}"],
                ['user_id' => $super->id, 'clicked_at' => now()->subHour()]
            );
        }
    }

    private function profileSettings(string $tagline, string $vision, array $missions, array $services): array
    {
        return [
            'demo_content' => true,
            'content_notice' => 'Konten awal/demo untuk memudahkan pengoperasian. Ganti nama pengurus, alamat, periode, program, dan informasi organisasi dengan data resmi sebelum publikasi penuh.',
            'tagline' => $tagline,
            'profile_intro' => $tagline.' Website ini disiapkan sebagai pusat informasi, dokumentasi kegiatan, program kerja, administrasi, dan publikasi organisasi.',
            'vision' => $vision,
            'missions' => $missions,
            'services' => $services,
            'socials' => ['instagram' => '', 'facebook' => '', 'youtube' => ''],
        ];
    }

    private function seedMembers(Organization $org, int $orgIndex): void
    {
        $positions = $org->type === 'mwcnu'
            ? ['Rais Syuriyah', 'Katib Syuriyah', 'Ketua Tanfidziyah', 'Sekretaris', 'Bendahara', 'Wakil Ketua Bidang Organisasi', 'Wakil Ketua Bidang Program', 'Wakil Sekretaris']
            : ['Ketua', 'Wakil Ketua', 'Sekretaris', 'Wakil Sekretaris', 'Bendahara', 'Koordinator Program', 'Koordinator Publikasi', 'Koordinator Kaderisasi'];

        if ($org->type === 'ranting') {
            $positions = ['Rais Syuriyah', 'Ketua Tanfidziyah', 'Sekretaris', 'Bendahara', 'Koordinator Kegiatan'];
        }

        $firstNames = ['Ahmad', 'Muhammad', 'Abdul', 'Fauzan', 'Syafi’i', 'Hasan', 'Husain', 'Siti', 'Aisyah', 'Nur', 'Fatimah', 'Khusnul', 'Lutfi', 'Zainal', 'Rizki', 'Miftah'];
        $lastNames = ['Hidayat', 'Ma’arif', 'Fauzi', 'Hakim', 'Anwar', 'Karim', 'Munir', 'Rahmawati', 'Khasanah', 'Nafisah', 'Salsabila', 'Hidayah', 'Arifin', 'Mustofa', 'Salim', 'Aziz'];

        foreach ($positions as $i => $position) {
            $name = $firstNames[($orgIndex + $i) % count($firstNames)].' '.$lastNames[($orgIndex * 2 + $i) % count($lastNames)];
            $nickname = ($i % 3 === 0 ? 'Pak ' : ($i % 3 === 1 ? 'Mas ' : 'Bu ')).explode(' ', $name)[0];
            Member::updateOrCreate(
                ['organization_id' => $org->id, 'position' => $position],
                [
                    'full_name' => $name.' (Demo)',
                    'nickname' => $nickname,
                    'whatsapp' => '0812'.str_pad((string)($org->id * 100 + $i + 1), 8, '0', STR_PAD_LEFT),
                    'email' => 'pengurus'.$org->id.'.'.($i + 1).'@nutugu.org',
                    'address' => $org->address,
                    'sk_number' => 'DEMO/SK/'.$org->id.'/'.str_pad((string)($i + 1), 3, '0', STR_PAD_LEFT).'/2026',
                    'period_start' => $org->period_start ?: '2026-01-01',
                    'period_end' => $org->period_end ?: '2031-12-31',
                    'is_active' => true,
                ]
            );
        }
    }

    private function seedPrograms(Organization $org, int $orgIndex): void
    {
        $programs = $this->programCatalog($org);
        foreach ($programs as $i => $item) {
            Program::updateOrCreate(
                ['organization_id' => $org->id, 'name' => $item[0]],
                [
                    'category' => $item[1],
                    'target' => $item[2],
                    'start_date' => now()->startOfYear()->addWeeks($i * 2)->toDateString(),
                    'due_date' => now()->addDays(($i - 2) * 35)->toDateString(),
                    'budget' => 1500000 * ($i + 1),
                    'realization' => 750000 * ($i + 1),
                    'progress' => min(95, 28 + ($orgIndex % 6) * 5 + $i * 11),
                    'status' => $i === 0 ? 'completed' : ($i === 3 ? 'late' : 'running'),
                    'public_visible' => true,
                    'aggregate_to_main' => true,
                    'notes' => 'Konten demo. Lengkapi target, PIC, anggaran, indikator, dan bukti realisasi dengan data organisasi resmi.',
                ]
            );
        }
    }

    private function programCatalog(Organization $org): array
    {
        $common = [
            ['Penataan Administrasi dan Arsip Digital', 'Organisasi', 'Dokumen, surat, dan data pengurus tersusun serta mudah dicari.'],
            ['Rapat Koordinasi Berkala', 'Organisasi', 'Koordinasi rutin berjalan dan keputusan rapat memiliki tindak lanjut.'],
            ['Peningkatan Publikasi Kegiatan', 'Publikasi', 'Kegiatan organisasi terdokumentasi dan informasi publik diperbarui berkala.'],
            ['Penguatan Database Pengurus', 'Data', 'Data pengurus aktif, kontak, masa khidmah, dan SK terbarui.'],
            ['Program Pelayanan Jamaah', 'Sosial', 'Terselenggara program yang memberi manfaat langsung kepada jamaah.'],
        ];

        return match ($org->slug) {
            'ipnuippnu' => [
                ['Pendataan Kader IPNU-IPPNU Tugu', 'Kaderisasi', 'Database kader, jenjang kaderisasi, dan asal ranting/komisariat tersusun.'],
                ['Kelas Kepemimpinan Pelajar', 'Kaderisasi', 'Pelajar memperoleh ruang belajar kepemimpinan dan organisasi.'],
                ['Gerakan Literasi Pelajar NU', 'Pendidikan', 'Terselenggara kegiatan literasi, diskusi, dan publikasi pelajar.'],
                ['Konsolidasi Pimpinan Ranting/Komisariat', 'Organisasi', 'Koordinasi antar pimpinan berjalan rutin dan terukur.'],
                ['Pelajar NU Peduli Lingkungan', 'Sosial', 'Kegiatan sosial dan lingkungan melibatkan kader pelajar.'],
            ],
            'ansor' => [
                ['Penguatan Database Kader Ansor', 'Kaderisasi', 'Data kader dan riwayat kaderisasi terdokumentasi.'],
                ['Konsolidasi Ranting GP Ansor', 'Organisasi', 'Ranting memperoleh pendampingan administrasi dan program.'],
                ['Ansor Peduli Sosial', 'Sosial', 'Program sosial rutin dilaksanakan dan terdokumentasi.'],
                ['Pelatihan Kepemimpinan & Organisasi', 'Kaderisasi', 'Kader memiliki kemampuan dasar kepemimpinan dan tata kelola.'],
                ['Digitalisasi Administrasi Ansor', 'Administrasi', 'Surat, agenda, dan laporan dikelola melalui sistem.'],
            ],
            'fatayat' => [
                ['Kelas Kader Perempuan Muda NU', 'Kaderisasi', 'Kader mendapat penguatan kepemimpinan dan organisasi.'],
                ['Program Keluarga Sehat', 'Kesehatan', 'Edukasi kesehatan keluarga terselenggara berkala.'],
                ['Pelatihan Ekonomi Keluarga', 'Ekonomi', 'Anggota memperoleh pelatihan usaha dan pengelolaan ekonomi keluarga.'],
                ['Fatayat Peduli Pendidikan', 'Pendidikan', 'Kegiatan pendampingan pendidikan dan literasi berjalan.'],
                ['Penataan Administrasi Fatayat', 'Administrasi', 'Surat, pengurus, agenda, dan laporan tertib.'],
            ],
            'muslimat' => [
                ['Penguatan Majelis Taklim', 'Keagamaan', 'Majelis dan kegiatan keagamaan terdokumentasi dan terjadwal.'],
                ['Sekolah Keluarga Muslimat', 'Keluarga', 'Program pendidikan keluarga terselenggara berkala.'],
                ['Muslimat Peduli Sosial', 'Sosial', 'Program sosial dan kepedulian jamaah berjalan terukur.'],
                ['Pendataan Pengurus dan Ranting', 'Organisasi', 'Data organisasi dan kontak pengurus terbarui.'],
                ['Program Kesehatan Jamaah', 'Kesehatan', 'Edukasi dan layanan kesehatan dasar dilakukan melalui kolaborasi.'],
            ],
            'lazisnu' => [
                ['Gerakan Kotak Infak NU', 'Penghimpunan', 'Penghimpunan infak tercatat, terukur, dan memiliki laporan berkala.'],
                ['Program Santunan Pendidikan', 'Penyaluran', 'Bantuan pendidikan disalurkan kepada penerima manfaat sesuai kriteria.'],
                ['Program Tanggap Sosial', 'Sosial', 'Respons bantuan sosial dapat dilakukan cepat dan terdokumentasi.'],
                ['Transparansi Penghimpunan dan Penyaluran', 'Laporan', 'Laporan program diterbitkan secara berkala.'],
                ['Penguatan Jejaring UPZIS', 'Organisasi', 'Koordinasi penghimpunan dan penyaluran tingkat wilayah semakin tertata.'],
            ],
            'lbm' => [
                ['Bahtsul Masail Rutin', 'Keagamaan', 'Forum pembahasan persoalan keagamaan terselenggara berkala.'],
                ['Bank Masalah Jamaah', 'Data', 'Usulan persoalan masyarakat dihimpun dan diklasifikasikan.'],
                ['Digitalisasi Hasil Bahtsul Masail', 'Dokumentasi', 'Hasil pembahasan mudah dicari dan dipelajari kembali.'],
                ['Kajian Fikih Kemasyarakatan', 'Kajian', 'Kajian responsif terhadap persoalan masyarakat lokal.'],
                ['Penguatan Referensi LBMNU', 'Literasi', 'Referensi kitab dan dokumen kajian tertata.'],
            ],
            'perekonomian' => [
                ['Pendataan UMKM Warga NU', 'Ekonomi', 'Direktori UMKM dan pengusaha NU tersusun dan terbarui.'],
                ['Pelatihan Digital Marketing UMKM', 'Pelatihan', 'Pelaku usaha memahami promosi digital dasar.'],
                ['Forum Jejaring Pengusaha NU', 'Jejaring', 'Pelaku usaha dapat berjejaring dan membangun kolaborasi.'],
                ['Etalase Produk Jamaah', 'Promosi', 'Produk warga memperoleh ruang promosi melalui portal organisasi.'],
                ['Pendampingan Legalitas Usaha', 'Pendampingan', 'Pelaku usaha memahami kebutuhan legalitas dasar.'],
            ],
            'lpmaarif' => [
                ['Pendataan Satuan Pendidikan NU', 'Data Pendidikan', 'Data sekolah, madrasah, TPQ, dan lembaga pendidikan terpetakan.'],
                ['Forum Guru Ma’arif Tugu', 'Pendidikan', 'Guru memiliki forum berbagi praktik baik dan pembelajaran.'],
                ['Program Literasi Siswa', 'Kesiswaan', 'Kegiatan literasi dan pengembangan karakter siswa berjalan.'],
                ['Digitalisasi Data Pendidikan', 'Administrasi', 'Dokumen dan data pendidikan mudah diperbarui serta dilaporkan.'],
                ['Sinergi Sekolah dan Masyarakat', 'Kolaborasi', 'Program pendidikan melibatkan orang tua dan lingkungan.'],
            ],
            default => $common,
        };
    }

    private function seedActivities(Organization $org, int $orgIndex): void
    {
        $activities = [
            ['Rapat Koordinasi Bulanan '.$org->acronym, 'Rapat', 'Koordinasi program, administrasi, dan tindak lanjut keputusan organisasi.'],
            ['Penguatan Administrasi '.$org->acronym, 'Administrasi', 'Pendampingan kelengkapan data pengurus, program, arsip, dan surat menyurat.'],
            ['Kegiatan Khidmah dan Pelayanan Jamaah', 'Sosial', 'Kegiatan pelayanan jamaah yang dilaksanakan bersama pengurus dan relawan.'],
            ['Evaluasi Program Triwulan', 'Evaluasi', 'Evaluasi capaian program, hambatan, dan rencana tindak lanjut.'],
        ];

        foreach ($activities as $i => $item) {
            Activity::updateOrCreate(
                ['organization_id' => $org->id, 'title' => $item[0]],
                [
                    'type' => $item[1],
                    'description' => $item[2].' (Konten demo untuk latihan pengoperasian.)',
                    'start_at' => now()->addDays(($orgIndex % 5) * 3 + $i * 12 + 1)->setTime(19, 30),
                    'end_at' => now()->addDays(($orgIndex % 5) * 3 + $i * 12 + 1)->setTime(21, 30),
                    'location' => $org->type === 'ranting' ? $org->address : 'Kecamatan Tugu, Kota Semarang',
                    'participants_count' => 20 + (($orgIndex + $i) * 3),
                    'budget' => 350000 + ($i * 250000),
                    'report' => 'Laporan kegiatan demo. Isi dengan ringkasan pelaksanaan, jumlah peserta, hasil, dokumentasi, evaluasi, dan tindak lanjut.',
                    'status' => $i === 0 ? 'planned' : 'planned',
                    'public_visible' => true,
                    'aggregate_to_main' => true,
                ]
            );
        }
    }

    private function seedNews(Organization $org, User $author, int $orgIndex): void
    {
        $titles = $this->newsCatalog($org);
        foreach ($titles as $i => $item) {
            $slug = Str::slug($org->slug.'-'.$item[0]);
            News::updateOrCreate(
                ['slug' => $slug],
                [
                    'organization_id' => $org->id,
                    'user_id' => $author->id,
                    'title' => $item[0],
                    'excerpt' => $item[1],
                    'content' => $this->articleBody($org, $item[0], $item[1]),
                    'category' => 'Konten Demo',
                    'status' => 'published',
                    'public_visible' => true,
                    'aggregate_to_main' => true,
                    'published_at' => now()->subDays(($orgIndex * 2 + $i) % 40),
                    'views' => 45 + ($orgIndex * 23) + ($i * 17),
                ]
            );
        }
    }

    private function newsCatalog(Organization $org): array
    {
        $name = $org->acronym ?: $org->name;
        $generic = [
            ['Contoh Berita: '.$name.' Perkuat Konsolidasi Organisasi', 'Pengurus melakukan koordinasi untuk memperkuat administrasi, program kerja, dan komunikasi antarbidang.'],
            ['Contoh Berita: '.$name.' Siapkan Agenda Pelayanan Jamaah', 'Program pelayanan jamaah disiapkan dengan pembagian tugas, target, dan dokumentasi yang lebih tertib.'],
            ['Contoh Berita: Digitalisasi Administrasi '.$name, 'Pemanfaatan NUTUGU.ORG diharapkan memudahkan surat menyurat, data pengurus, kegiatan, dan laporan.'],
            ['Contoh Berita: Evaluasi Program Kerja '.$name, 'Evaluasi berkala dilakukan untuk melihat capaian, hambatan, dan tindak lanjut program organisasi.'],
            ['Contoh Berita: '.$name.' Dorong Publikasi Kegiatan yang Lebih Aktif', 'Setiap kegiatan didorong terdokumentasi agar informasi organisasi lebih mudah diakses jamaah.'],
            ['Contoh Berita: Sinergi '.$name.' dengan MWCNU Tugu', 'Koordinasi antarunit menjadi bagian penting untuk memperkuat khidmah organisasi di Kecamatan Tugu.'],
        ];

        return match ($org->slug) {
            'lazisnu' => [
                ['Contoh Berita: LAZISNU Tugu Siapkan Pelaporan Penghimpunan Berkala', 'Penghimpunan dan penyaluran ZIS diarahkan semakin tertib dan mudah dipantau.'],
                ['Contoh Berita: Program Santunan Pendidikan LAZISNU Tugu', 'Program pendidikan menjadi salah satu contoh skema penyaluran yang dapat dikelola melalui sistem.'],
                ['Contoh Berita: LAZISNU Tugu Perkuat Data Penerima Manfaat', 'Pendataan membantu proses verifikasi, penyaluran, dan penyusunan laporan program.'],
                ['Contoh Berita: Penguatan Jejaring UPZIS di Kecamatan Tugu', 'Koordinasi wilayah dapat dimanfaatkan untuk memperluas penghimpunan dan pelayanan sosial.'],
                ['Contoh Berita: Transparansi Program Sosial Melalui NUTUGU.ORG', 'Website dapat menampilkan ringkasan program tanpa membuka data pribadi penerima manfaat.'],
                ['Contoh Berita: LAZISNU Tugu Siapkan Agenda Tanggap Sosial', 'Sistem membantu mencatat kegiatan, relawan, anggaran, dokumentasi, dan laporan.'],
            ],
            'lbm' => [
                ['Contoh Berita: LBMNU Tugu Siapkan Bank Usulan Bahtsul Masail', 'Persoalan keagamaan dapat dihimpun, dikategorikan, dan ditindaklanjuti secara tertib.'],
                ['Contoh Berita: Dokumentasi Hasil Bahtsul Masail Mulai Didigitalisasi', 'Hasil kajian dapat disimpan agar mudah dicari kembali oleh pengurus dan jamaah.'],
                ['Contoh Berita: LBMNU Tugu Dorong Kajian Fikih Kemasyarakatan', 'Kajian dapat diarahkan pada persoalan yang dekat dengan kehidupan masyarakat.'],
                ['Contoh Berita: Penguatan Referensi untuk Forum Bahtsul Masail', 'Dokumen dan bahan kajian dapat disimpan dalam pusat arsip digital.'],
                ['Contoh Berita: LBMNU Tugu Siapkan Agenda Kajian Berkala', 'Agenda kajian dapat dipublikasikan melalui portal utama MWCNU Tugu.'],
                ['Contoh Berita: Sinergi LBMNU dan Ranting dalam Menghimpun Persoalan Jamaah', 'Ranting dapat menjadi pintu awal penghimpunan persoalan untuk dibahas lebih lanjut.'],
            ],
            'perekonomian' => [
                ['Contoh Berita: Pendataan UMKM Warga NU Kecamatan Tugu', 'Direktori usaha menjadi dasar pengembangan jejaring ekonomi jamaah.'],
                ['Contoh Berita: Pelatihan Digital Marketing untuk UMKM', 'Pelaku usaha dapat dikenalkan pada promosi digital, konten, dan pengelolaan pelanggan.'],
                ['Contoh Berita: Perekonomian NU Tugu Siapkan Etalase Produk Jamaah', 'Produk warga dapat ditampilkan pada direktori usaha yang mudah diperbarui.'],
                ['Contoh Berita: Forum Jejaring Pengusaha NU Tugu', 'Forum dapat digunakan untuk berbagi peluang, kebutuhan, dan kolaborasi usaha.'],
                ['Contoh Berita: Pendampingan Administrasi dan Legalitas Usaha', 'Program pendampingan dapat dicatat per peserta dan dilaporkan secara berkala.'],
                ['Contoh Berita: Pemetaan Potensi Ekonomi Ranting', 'Data dari Ranting dapat diakumulasi menjadi gambaran potensi ekonomi tingkat kecamatan.'],
            ],
            'lpmaarif' => [
                ['Contoh Berita: LP Ma’arif Tugu Mulai Memetakan Satuan Pendidikan', 'Pendataan menjadi langkah awal untuk melihat kebutuhan dan potensi pendidikan NU.'],
                ['Contoh Berita: Forum Guru Ma’arif Siapkan Program Berbagi Praktik Baik', 'Kegiatan guru dapat terdokumentasi dan dijadwalkan melalui sistem.'],
                ['Contoh Berita: Program Literasi Siswa Menjadi Agenda Pendidikan', 'Kegiatan literasi dapat melibatkan sekolah, madrasah, guru, dan masyarakat.'],
                ['Contoh Berita: Digitalisasi Dokumen Pendidikan di LP Ma’arif Tugu', 'Dokumen program dan kegiatan pendidikan dapat tersimpan dalam arsip digital.'],
                ['Contoh Berita: Sinergi Pendidikan dengan Ranting dan MWCNU', 'Kolaborasi lintas unit dapat memperluas dampak program pendidikan.'],
                ['Contoh Berita: LP Ma’arif Tugu Siapkan Kalender Kegiatan Pendidikan', 'Agenda pendidikan dapat tampil bersama kalender organisasi MWCNU.'],
            ],
            default => $generic,
        };
    }

    private function articleBody(Organization $org, string $title, string $excerpt): string
    {
        return "<p><strong>Catatan:</strong> artikel ini adalah konten demo untuk memudahkan latihan pengoperasian NUTUGU.ORG. Silakan ganti dengan berita resmi sebelum website dipublikasikan penuh.</p>"
            ."<p>{$excerpt}</p>"
            ."<p>Melalui sistem informasi organisasi, {$org->name} dapat mencatat agenda, penanggung jawab, peserta, dokumentasi, program kerja, serta tindak lanjut kegiatan dalam satu tempat. Data yang sama juga dapat digunakan untuk membuat ringkasan laporan dan publikasi sehingga pengurus tidak perlu menginput informasi berulang kali.</p>"
            ."<p>Setiap publikasi dapat diatur apakah hanya tampil pada halaman {$org->acronym} atau sekaligus diagregasikan ke halaman utama MWCNU Tugu. Pengaturan ini memberi keleluasaan kepada pengurus untuk menentukan informasi yang perlu diketahui publik dan informasi yang cukup disimpan sebagai administrasi internal.</p>"
            ."<p>Admin dapat mengedit judul, isi, kategori, tanggal terbit, foto utama, status publikasi, dan pengaturan agregasi melalui menu Publikasi &gt; Berita. Konten ini sengaja dibuat cukup lengkap sebagai contoh alur kerja.</p>";
    }

    private function seedLetters(Organization $org, int $orgIndex): void
    {
        $letters = [
            ['Undangan', 'Rapat Koordinasi Bulanan', 'Pengurus '.$org->acronym],
            ['Pemberitahuan', 'Pemberitahuan Agenda Kegiatan Organisasi', 'Pengurus dan Koordinator Bidang'],
            ['Surat Tugas', 'Penugasan Perwakilan Kegiatan', 'Pengurus yang ditugaskan'],
            ['Permohonan', 'Permohonan Dukungan Kegiatan', 'Mitra/Instansi Tujuan'],
        ];
        foreach ($letters as $i => $item) {
            $number = 'DEMO-'.str_pad((string)($orgIndex + 1), 2, '0', STR_PAD_LEFT).'-'.str_pad((string)($i + 1), 3, '0', STR_PAD_LEFT).'/IX/2026';
            Letter::updateOrCreate(
                ['organization_id' => $org->id, 'number' => $number],
                [
                    'direction' => 'outgoing',
                    'type' => $item[0],
                    'classification_code' => 'DEMO',
                    'subject' => $item[1],
                    'recipient' => $item[2],
                    'letter_date' => now()->subDays(($orgIndex + $i) % 20)->toDateString(),
                    'body' => 'Konten surat demo. Format nomor, kop, klasifikasi, penandatangan, dan redaksi wajib disesuaikan dengan pedoman resmi organisasi masing-masing.',
                    'status' => 'published',
                    'signatory_1' => 'Ketua (Demo)',
                    'signatory_2' => 'Sekretaris (Demo)',
                    'qr_token' => Str::upper(substr(hash('sha256', $org->id.'-'.$number), 0, 16)),
                ]
            );
        }
    }

    private function seedLetterTemplates(Organization $mwc, array $units): void
    {
        $templates = [
            ['Undangan Rapat', 'UNDANGAN', '<p>Assalamu’alaikum Wr. Wb.</p><p>Dengan hormat, kami mengundang {{nama_penerima}} untuk menghadiri {{nama_kegiatan}} yang akan dilaksanakan pada {{hari}}, {{tanggal}}, pukul {{waktu}}, bertempat di {{tempat}}.</p><p>Demikian undangan ini disampaikan. Atas perhatian dan kehadirannya kami sampaikan terima kasih.</p>'],
            ['Surat Tugas', 'TUGAS', '<p>Dengan ini memberikan tugas kepada {{nama_penerima}} untuk melaksanakan/menghadiri {{nama_kegiatan}} pada {{tanggal}} di {{tempat}}.</p>'],
            ['Pemberitahuan', 'PEMBERITAHUAN', '<p>Dengan hormat, kami sampaikan pemberitahuan mengenai {{perihal}}. Informasi lengkap dapat disesuaikan melalui editor surat.</p>'],
            ['Permohonan', 'PERMOHONAN', '<p>Dengan hormat, sehubungan dengan {{nama_kegiatan}}, kami bermaksud mengajukan permohonan {{jenis_permohonan}}. Besar harapan kami agar permohonan ini dapat dipertimbangkan.</p>'],
            ['Berita Acara', 'BA', '<p>Pada hari {{hari}}, tanggal {{tanggal}}, telah dilaksanakan {{nama_kegiatan}} bertempat di {{tempat}}. Berita acara ini dibuat untuk digunakan sebagaimana mestinya.</p>'],
        ];

        foreach (collect([$mwc])->merge($units) as $org) {
            foreach ($templates as $template) {
                DB::table('letter_templates')->updateOrInsert(
                    ['organization_id' => $org->id, 'name' => $template[0]],
                    [
                        'code' => $template[1],
                        'body_html' => $template[2],
                        'numbering_format' => 'KONFIGURASI-PEDOMAN-RESMI',
                        'is_active' => true,
                        'created_at' => now(),
                        'updated_at' => now(),
                    ]
                );
            }
        }
    }

    private function seedPopups(): void
    {
        $popups = [
            ['Selamat Datang di NUTUGU.ORG', 'Portal informasi dan kantor digital MWCNU Kecamatan Tugu. Konten awal website ini berisi data demo agar admin mudah mempelajari sistem.', 'Mulai Jelajahi', '/berita', 'once_session', true],
            ['Contoh Pengumuman Agenda MWCNU', 'Popup ini dapat dijadwalkan, diaktifkan, dinonaktifkan, dan diarahkan ke halaman agenda atau informasi tertentu.', 'Lihat Agenda', '/agenda', 'once_day', false],
            ['Contoh Pengumuman Penting', 'Gunakan popup untuk Musker, konferensi, pengajian, kaderisasi, pelayanan sosial, atau pemberitahuan penting lainnya.', 'Buka Website', '/', 'every_visit', false],
        ];

        foreach ($popups as $i => $p) {
            PopupAnnouncement::updateOrCreate(
                ['title' => $p[0]],
                [
                    'body' => $p[1],
                    'button_label' => $p[2],
                    'button_url' => $p[3],
                    'frequency' => $p[4],
                    'starts_at' => now()->subDay(),
                    'ends_at' => now()->addMonths(6),
                    'show_desktop' => true,
                    'show_mobile' => true,
                    'is_active' => $p[5],
                    'sort_order' => $i + 1,
                ]
            );
        }
    }

    private function seedAttendance(Organization $mwc): void
    {
        $activity = Activity::where('organization_id', $mwc->id)->orderBy('id')->first();
        AttendanceSession::updateOrCreate(
            ['token' => 'DEMOHADIR1'],
            [
                'organization_id' => $mwc->id,
                'activity_id' => $activity?->id,
                'title' => 'Presensi Rapat Pleno MWCNU Tugu (Demo)',
                'opens_at' => now()->subDay(),
                'closes_at' => now()->addDays(30),
                'location_name' => 'Lokasi Kegiatan Demo — ubah koordinat sebelum digunakan',
                'latitude' => -6.9850000,
                'longitude' => 110.3500000,
                'radius_meters' => 300,
                'require_location' => true,
                'require_photo' => true,
                'one_device_one_person' => true,
                'allow_public' => true,
                'is_active' => true,
                'retention_months' => 6,
            ]
        );
    }

    private function seedAuditLogs($organizations, User $super): void
    {
        $modules = ['berita', 'program', 'surat', 'pengurus', 'kegiatan', 'popup', 'presensi', 'dokumen'];
        foreach (range(1, 80) as $i) {
            $org = $organizations[$i % $organizations->count()];
            AuditLog::updateOrCreate(
                ['description' => 'Demo aktivitas #'.$i.' — '.$org->acronym.' pada modul '.$modules[$i % count($modules)]],
                [
                    'organization_id' => $org->id,
                    'user_id' => $super->id,
                    'action' => ['create', 'update', 'publish', 'login'][$i % 4],
                    'module' => $modules[$i % count($modules)],
                    'ip_address' => '127.0.0.1',
                    'user_agent' => 'Seeder Demo NUTUGU',
                    'meta' => ['demo' => true],
                    'created_at' => now()->subMinutes($i * 11),
                    'updated_at' => now()->subMinutes($i * 11),
                ]
            );
        }
    }
}
