@extends('layouts.app')

@section('content')
<link href="https://fonts.googleapis.com/css2?family=Poppins:wght@400;500;600;700;800&display=swap" rel="stylesheet">

@php
    $currentMonthNum = (int) now()->format('n');
    $currentMonthLabel = now()->locale('id')->translatedFormat('F Y');

    $monthlyMarketMap = [
        1 => [
            'badge' => 'January push',
            'headline' => 'Januari: dorong order awal tahun, materi branding baru, dan paket restart bisnis.',
            'summary' => 'Awal tahun cocok untuk mendorong bisnis yang mulai aktif kembali. Fokuskan promosi ke pembaruan materi usaha, branding toko, media promosi, dan paket siap jalan untuk UMKM.',
            'signals' => [
                [
                    'title' => 'Paket branding awal tahun lebih mudah closing',
                    'type' => 'Growth',
                    'reason' => 'Banyak usaha memulai tahun dengan semangat baru dan butuh tampilan promosi yang lebih rapi.',
                    'products' => ['Banner toko', 'Kartu nama', 'Poster promo', 'Stiker branding'],
                    'strategy' => 'Jual paket “Mulai Tahun Baru” berisi banner + kartu nama + stiker + bonus revisi minor.',
                ],
                [
                    'title' => 'Pelanggan lama lebih mudah diaktifkan kembali',
                    'type' => 'Repeat',
                    'reason' => 'Awal tahun adalah momen tepat untuk follow-up customer lama yang sempat berhenti order.',
                    'products' => ['Cetak ulang materi lama', 'Update daftar harga', 'Flyer promo baru'],
                    'strategy' => 'Kirim WA personal ke customer lama dengan penawaran repeat order + prioritas produksi.',
                ],
                [
                    'title' => 'Kompetitor mesin baru jangan dilawan dengan perang harga',
                    'type' => 'Defense',
                    'reason' => 'Mesin baru menarik perhatian, tapi owner tetap bisa menang lewat layanan lebih cepat, komunikatif, dan mudah dipesan.',
                    'products' => ['Paket express', 'Desain cepat', 'Finishing rapi'],
                    'strategy' => 'Gunakan positioning: cepat respon, file dibantu, hasil aman, dan deadline jelas.',
                ],
                [
                    'title' => 'Materi promosi toko fisik masih relevan',
                    'type' => 'Offline',
                    'reason' => 'Banyak usaha memulai aktivasi penjualan awal tahun dengan promosi visual sederhana.',
                    'products' => ['Banner promo', 'Poster display', 'X-banner', 'Price tag'],
                    'strategy' => 'Dorong order paket display toko dengan harga bundling, bukan satuan.',
                ],
            ],
            'recommendations' => [
                'Jalankan promo awal tahun untuk branding usaha dan materi promosi toko.',
                'Aktifkan repeat order customer lama dengan penawaran personal via WhatsApp.',
                'Tawarkan paket express agar kompetitor mesin baru tidak mendominasi persepsi pasar.',
                'Jual bundling yang jelas isinya agar customer cepat ambil keputusan.',
                'Utamakan bonus layanan dibanding diskon besar agar margin tetap aman.',
            ],
            'selling' => '“Awal tahun lebih rapi, promosi lebih siap, order lebih cepat selesai.”',
            'promo_lines' => [
                'Paket branding awal tahun',
                'Repeat order dapat prioritas produksi',
                'Bonus revisi minor untuk order minggu ini',
                'Bundling banner + stiker + kartu nama',
            ],
        ],
        2 => [
            'badge' => 'February push',
            'headline' => 'Februari: mainkan promo cepat closing, paket toko, dan materi campaign musiman.',
            'summary' => 'Februari cocok untuk promo yang cepat jalan, khususnya untuk usaha kecil yang butuh materi cetak sederhana namun efektif. Fokus ke paket toko, kampanye tematik, dan repeat order ringan.',
            'signals' => [
                [
                    'title' => 'Order kecil cepat jadi lebih gampang masuk',
                    'type' => 'Fast moving',
                    'reason' => 'Bulan ini bagus untuk mendorong order bernilai menengah-kecil tapi frekuensinya tinggi.',
                    'products' => ['Flyer', 'Poster A3', 'Stiker promo', 'Kartu nama'],
                    'strategy' => 'Tawarkan minimum order ringan dan opsi express agar conversion lebih cepat.',
                ],
                [
                    'title' => 'Promosi tematik bulanan bisa menaikkan repeat order',
                    'type' => 'Theme',
                    'reason' => 'Tema bulanan lebih mudah dipakai customer untuk promosi singkat di toko atau online.',
                    'products' => ['Poster promo', 'Stiker campaign', 'Tent card'],
                    'strategy' => 'Siapkan template promo tematik yang bisa langsung dipakai customer.',
                ],
                [
                    'title' => 'Kompetitor baru rawan menarik pelanggan yang butuh cepat',
                    'type' => 'Defense',
                    'reason' => 'Jika kompetitor punya mesin baru, pelanggan akan menilai kecepatan dulu sebelum harga.',
                    'products' => ['Paket express', 'Cetak prioritas', 'Finishing cepat'],
                    'strategy' => 'Tonjolkan SLA produksi dan kepastian selesai, bukan sekadar harga murah.',
                ],
                [
                    'title' => 'Bundling display toko punya nilai jual tinggi',
                    'type' => 'Bundle',
                    'reason' => 'Pelanggan lebih mudah membeli paket jadi daripada memesan item satu per satu.',
                    'products' => ['Banner', 'Poster', 'Price tag', 'Stiker etalase'],
                    'strategy' => 'Buat paket Basic, Standard, Premium untuk display usaha.',
                ],
            ],
            'recommendations' => [
                'Jual paket display toko yang siap pakai.',
                'Dorong cetak cepat jadi untuk kebutuhan mendadak.',
                'Beri bonus desain minor untuk order bernilai tertentu.',
                'Bangun persepsi cepat dan rapi agar kompetitor baru tidak unggul sendiri.',
                'Fokus pada transaksi menengah-kecil yang bisa berulang.',
            ],
            'selling' => '“Pesan cepat, file dibantu, hasil rapi, promosi langsung jalan.”',
            'promo_lines' => [
                'Promo paket toko hemat',
                'Cetak express untuk kebutuhan mendadak',
                'Bonus desain minor',
                'Paket banner + poster + stiker',
            ],
        ],
        3 => [
            'badge' => 'Ramadan build-up',
            'headline' => 'Maret: dorong promo Ramadan, kemasan, stiker, dan materi promosi usaha.',
            'summary' => 'Maret biasanya sangat kuat untuk kebutuhan promosi Ramadan. Fokuskan ke materi promosi jualan, packaging, label, banner, dan item support penjualan cepat.',
            'signals' => [
                [
                    'title' => 'Materi promo Ramadan paling cepat bergerak',
                    'type' => 'Seasonal',
                    'reason' => 'Usaha makanan, fashion, dan retail biasanya aktif promosi selama Ramadan.',
                    'products' => ['Banner Ramadan', 'Poster promo', 'Menu buka puasa', 'Stiker promo'],
                    'strategy' => 'Dorong paket promo Ramadan dengan deadline produksi cepat.',
                ],
                [
                    'title' => 'Packaging dan label UMKM naik nilainya',
                    'type' => 'UMKM',
                    'reason' => 'Penjualan parcel, hampers, makanan, dan produk custom biasanya naik.',
                    'products' => ['Label produk', 'Stiker kemasan', 'Sleeve', 'Thank you card'],
                    'strategy' => 'Buat paket “Ramadan UMKM” berisi label + stiker + insert promo.',
                ],
                [
                    'title' => 'Repeat order lebih mudah lewat promosi musiman',
                    'type' => 'Repeat',
                    'reason' => 'Customer lama cenderung responsif saat kebutuhan pasarnya sedang tinggi.',
                    'products' => ['Cetak ulang promo', 'Packaging tambahan', 'Display toko'],
                    'strategy' => 'Kirim broadcast personal ke customer lama yang pernah order di kategori serupa.',
                ],
                [
                    'title' => 'Kompetitor mesin baru harus dilawan dengan kecepatan respon',
                    'type' => 'Defense',
                    'reason' => 'Di musim ramai, yang menang bukan hanya mesin cepat, tapi juga toko yang paling sigap dan paling mudah diajak kerja.',
                    'products' => ['Express order', 'Prioritas antrean', 'File check'],
                    'strategy' => 'Tonjolkan layanan konsultasi file dan slot produksi prioritas.',
                ],
            ],
            'recommendations' => [
                'Gas promo Ramadan untuk banner, stiker, packaging, dan materi display toko.',
                'Follow-up customer lama dengan tema Ramadan dan promo repeat order.',
                'Bangun paket UMKM musiman agar order lebih gampang masuk.',
                'Gunakan bonus finishing atau prioritas produksi agar margin tetap aman.',
                'Percepat respon chat karena musim ramai sangat sensitif pada kecepatan.',
            ],
            'selling' => '“Promo Ramadan siap cepat, file aman, produksi dibantu sampai jadi.”',
            'promo_lines' => [
                'Paket promo Ramadan',
                'Label + stiker + insert UMKM',
                'Order express untuk kebutuhan mendadak',
                'Repeat order prioritas antrean',
            ],
        ],
        4 => [
            'badge' => 'Post-Eid recovery',
            'headline' => 'April: reaktivasi pelanggan pasca-Lebaran, paket cepat jadi, dan bundling UMKM agar tidak kalah gaung dari kompetitor mesin baru.',
            'summary' => 'Akhir April lebih cocok dipakai untuk menghidupkan repeat order, mengejar kebutuhan promosi toko dan UMKM setelah libur, serta membangun persepsi bahwa toko Anda lebih sigap, lebih cepat respon, dan lebih gampang diajak produksi.',
            'signals' => [
                [
                    'title' => 'Reaktivasi pelanggan lama pasca-Lebaran',
                    'type' => 'April',
                    'reason' => 'Setelah periode libur, pelanggan yang sempat jeda lebih mudah ditarik kembali lewat penawaran ringan dan komunikasi personal.',
                    'products' => ['Cetak ulang menu', 'Sticker promo toko', 'Banner reopening', 'Flyer promo akhir bulan'],
                    'strategy' => 'Kirim promo WA ke customer lama: repeat order dapat prioritas produksi atau bonus finishing minor.',
                ],
                [
                    'title' => 'Paket cepat jadi untuk lawan efek mesin baru',
                    'type' => 'Defense',
                    'reason' => 'Kompetitor dengan mesin baru biasanya dipersepsikan lebih cepat. Strategi jual harus menjawab persepsi itu.',
                    'products' => ['Banner express', 'Poster express', 'Stiker cut-to-size', 'Kartu nama cepat jadi'],
                    'strategy' => 'Jual 3 tier layanan: Reguler, Express 6 jam, Express 3 jam.',
                ],
                [
                    'title' => 'Bundling UMKM dan online seller masih relevan',
                    'type' => 'Growth',
                    'reason' => 'Permintaan materi branding kecil-menengah seperti label, packaging, stiker, dan insert promosi tetap menarik.',
                    'products' => ['Label produk', 'Stiker kemasan', 'Thank you card', 'Insert promo'],
                    'strategy' => 'Buat paket “UMKM Mulai Jual Lagi”: label + stiker + insert + bonus revisi minor.',
                ],
                [
                    'title' => 'Jaga margin lewat bonus layanan, bukan perang harga',
                    'type' => 'Margin',
                    'reason' => 'Saat kompetitor baru muncul, perang harga mudah merusak laba. Lebih sehat menjual nilai tambah.',
                    'products' => ['Laminasi', 'Finishing potong', 'Desain minor', 'Prioritas antrean'],
                    'strategy' => 'Gunakan headline promo: bonus finishing atau prioritas produksi, bukan diskon besar.',
                ],
            ],
            'recommendations' => [
                'Promo utama April: repeat order pelanggan lama dengan bonus prioritas produksi atau finishing minor.',
                'Buat paket Express untuk order mendadak supaya kompetitor mesin baru tidak mengambil segmen cepat jadi.',
                'Dorong paket UMKM: label + stiker + insert promo + bonus konsultasi file.',
                'Gunakan materi promosi yang menekankan cepat respon, hasil rapi, dan dibantu sampai siap cetak.',
                'Pantau produk paling cepat closing: banner cepat jadi, stiker, label, dan cetak promosi toko.',
            ],
            'selling' => '“Bukan cuma cetak, kami bantu file siap, proses cepat, hasil rapi, dan ada opsi express.”',
            'promo_lines' => [
                'Repeat order dapat prioritas produksi',
                'Paket Express untuk order mendadak',
                'Bundling label + stiker + insert untuk UMKM',
                'Bonus finishing minor tanpa potong harga utama',
            ],
        ],
        5 => [
            'badge' => 'School & event season',
            'headline' => 'Mei: dorong kebutuhan event, promosi sekolah, sertifikat, banner, dan materi presentasi.',
            'summary' => 'Mei ideal untuk menangkap kebutuhan sekolah, event komunitas, bisnis lokal, dan promosi usaha yang mulai padat. Fokus pada produk yang mudah dibundling dan cepat diproses.',
            'signals' => [
                [
                    'title' => 'Materi event lebih mudah masuk',
                    'type' => 'Event',
                    'reason' => 'Periode ini sering ramai untuk kebutuhan acara, seminar, lomba, dan kegiatan institusi.',
                    'products' => ['Backdrop', 'Banner acara', 'Sertifikat', 'ID card'],
                    'strategy' => 'Buat paket event lengkap agar customer tidak belanja terpisah.',
                ],
                [
                    'title' => 'Kebutuhan sekolah dan komunitas cukup aktif',
                    'type' => 'Education',
                    'reason' => 'Sekolah, kampus, dan komunitas biasanya membutuhkan cetak cepat dengan nominal menengah.',
                    'products' => ['Sertifikat', 'Poster kegiatan', 'Brosur', 'Name tag'],
                    'strategy' => 'Tawarkan harga paket kuantitas dan pengerjaan cepat.',
                ],
                [
                    'title' => 'Kompetitor baru rawan mengambil order event last-minute',
                    'type' => 'Defense',
                    'reason' => 'Order event sering sangat sensitif terhadap deadline.',
                    'products' => ['Express backdrop', 'Express banner', 'Cetak prioritas'],
                    'strategy' => 'Tonjolkan kesiapan produksi dan kepastian jadi sebelum acara.',
                ],
                [
                    'title' => 'Bundling acara menaikkan average order',
                    'type' => 'Upsell',
                    'reason' => 'Customer event biasanya butuh lebih dari satu item.',
                    'products' => ['Backdrop', 'Banner', 'ID card', 'Sertifikat'],
                    'strategy' => 'Paketkan per acara: basic, lengkap, premium.',
                ],
            ],
            'recommendations' => [
                'Jual paket event dan kebutuhan sekolah dalam satu penawaran.',
                'Buat layanan express untuk order acara yang mendadak.',
                'Fokus ke bundling agar nilai transaksi naik.',
                'Jaga komunikasi cepat karena customer event sangat sensitif pada kepastian.',
                'Tonjolkan hasil rapi dan deadline aman sebagai senjata lawan kompetitor.',
            ],
            'selling' => '“Acara mepet tetap aman, file dibantu, hasil siap tepat waktu.”',
            'promo_lines' => [
                'Paket event lengkap',
                'Sertifikat + banner + ID card',
                'Express untuk kebutuhan acara mendadak',
                'Bonus revisi layout ringan',
            ],
        ],
        6 => [
            'badge' => 'Mid-year sales push',
            'headline' => 'Juni: dorong branding usaha, kampanye tengah tahun, dan paket penjualan cepat.',
            'summary' => 'Juni cocok untuk mendorong promosi tengah tahun. Usaha biasanya butuh materi diskon, branding ulang ringan, dan media pendukung penjualan.',
            'signals' => [
                [
                    'title' => 'Materi promo pertengahan tahun menarik untuk UMKM',
                    'type' => 'Promo',
                    'reason' => 'Banyak bisnis mencari momentum untuk menjaga ritme penjualan.',
                    'products' => ['Poster diskon', 'Banner promo', 'Flyer', 'Stiker campaign'],
                    'strategy' => 'Buat paket mid-year sale dengan desain sederhana dan produksi cepat.',
                ],
                [
                    'title' => 'Repeat order banner dan display cukup potensial',
                    'type' => 'Repeat',
                    'reason' => 'Display promosi biasanya diganti berkala di pertengahan tahun.',
                    'products' => ['Banner toko', 'Poster etalase', 'Price card'],
                    'strategy' => 'Follow-up customer lama yang pernah order materi display.',
                ],
                [
                    'title' => 'Kompetitor mesin baru unggul kalau toko lambat respon',
                    'type' => 'Defense',
                    'reason' => 'Pelanggan yang butuh cepat akan mudah pindah jika admin lambat dan opsi paket tidak jelas.',
                    'products' => ['Express banner', 'Quick print', 'Fast finishing'],
                    'strategy' => 'Sediakan pilihan harga cepat jadi yang mudah dipahami.',
                ],
                [
                    'title' => 'Bundling promosi toko memberi margin lebih baik',
                    'type' => 'Margin',
                    'reason' => 'Lebih sehat menjual paket display dan finishing dibanding perang harga item tunggal.',
                    'products' => ['Banner', 'Poster', 'Laminasi', 'Stiker'],
                    'strategy' => 'Bangun paket hemat dengan bonus finishing minor.',
                ],
            ],
            'recommendations' => [
                'Dorong campaign promosi tengah tahun.',
                'Aktifkan repeat order untuk materi display toko.',
                'Tonjolkan layanan cepat agar kompetitor baru tidak unggul sendirian.',
                'Jual paket promosi, bukan item satuan saja.',
                'Manfaatkan bonus finishing untuk menjaga margin.',
            ],
            'selling' => '“Promo tengah tahun lebih siap, lebih cepat, dan lebih mudah dipesan.”',
            'promo_lines' => [
                'Paket mid-year sale',
                'Banner + poster + stiker promo',
                'Repeat order cepat jadi',
                'Bonus finishing minor',
            ],
        ],
        7 => [
            'badge' => 'School reopening',
            'headline' => 'Juli: fokus kebutuhan sekolah, orientasi, event, seragam usaha, dan materi promosi baru.',
            'summary' => 'Juli biasanya kuat untuk kebutuhan edukasi, orientasi, acara, dan pembaruan materi promosi berbagai usaha setelah pergantian semester atau periode kerja baru.',
            'signals' => [
                [
                    'title' => 'Cetak kebutuhan sekolah dan orientasi naik',
                    'type' => 'Education',
                    'reason' => 'Sekolah, kampus, dan lembaga biasanya aktif membuat materi visual dan dokumen pendukung.',
                    'products' => ['Poster', 'Banner', 'ID card', 'Sertifikat'],
                    'strategy' => 'Bangun paket orientasi atau kegiatan sekolah dengan opsi kuantitas.',
                ],
                [
                    'title' => 'Kebutuhan seragam usaha dan branding kecil ikut bergerak',
                    'type' => 'Branding',
                    'reason' => 'Banyak usaha ikut memperbarui tampilan ketika pasar mulai aktif lagi.',
                    'products' => ['Stiker logo', 'Label', 'Poster toko', 'Kartu nama'],
                    'strategy' => 'Jual paket branding ringan untuk UMKM dan usaha lokal.',
                ],
                [
                    'title' => 'Kompetitor baru cenderung menarget order cepat volume sedang',
                    'type' => 'Defense',
                    'reason' => 'Order pendidikan dan kegiatan biasanya butuh waktu singkat dengan kuantitas lumayan.',
                    'products' => ['Quick print', 'Express banner', 'Cetak prioritas'],
                    'strategy' => 'Sediakan paket express yang jelas dan mudah dipilih.',
                ],
                [
                    'title' => 'Event komunitas juga layak disasar',
                    'type' => 'Community',
                    'reason' => 'Bulan ini cocok untuk acara lokal, lomba, dan kegiatan organisasi.',
                    'products' => ['Backdrop', 'Spanduk', 'ID card', 'Piagam'],
                    'strategy' => 'Buat paket event komunitas dengan harga bertingkat.',
                ],
            ],
            'recommendations' => [
                'Target sekolah, kampus, dan komunitas dengan paket acara.',
                'Jual branding ringan untuk usaha yang mulai aktif kembali.',
                'Sediakan express order untuk kebutuhan mendadak.',
                'Follow-up customer lama kategori event dan edukasi.',
                'Gunakan bundling agar nilai transaksi naik.',
            ],
            'selling' => '“Kebutuhan sekolah dan acara siap lebih cepat, rapi, dan aman deadline.”',
            'promo_lines' => [
                'Paket orientasi dan kegiatan sekolah',
                'Backdrop + banner + ID card',
                'Express order untuk acara mendadak',
                'Paket branding ringan UMKM',
            ],
        ],
        8 => [
            'badge' => 'Independence promo',
            'headline' => 'Agustus: dorong tema kemerdekaan, event, dekorasi, lomba, dan promosi toko.',
            'summary' => 'Agustus biasanya sangat kuat untuk kebutuhan event, dekorasi, lomba, dan materi promosi tematik. Ini bulan yang cocok untuk agresif menjual paket acara dan display visual.',
            'signals' => [
                [
                    'title' => 'Materi event kemerdekaan paling cepat bergerak',
                    'type' => 'Seasonal',
                    'reason' => 'Banyak RT, sekolah, kantor, dan komunitas butuh cetakan bertema kemerdekaan.',
                    'products' => ['Spanduk', 'Banner lomba', 'Backdrop', 'Poster'],
                    'strategy' => 'Buat paket event kemerdekaan siap pakai.',
                ],
                [
                    'title' => 'Kebutuhan dekorasi dan identitas acara meningkat',
                    'type' => 'Event',
                    'reason' => 'Acara komunitas dan kantor biasanya perlu item tambahan selain banner utama.',
                    'products' => ['ID card', 'Nomor peserta', 'Label', 'Sertifikat'],
                    'strategy' => 'Upsell item pendukung ke setiap order event.',
                ],
                [
                    'title' => 'Kompetitor baru bisa unggul di order mendadak',
                    'type' => 'Defense',
                    'reason' => 'Musim acara sangat padat dan banyak order last-minute.',
                    'products' => ['Express spanduk', 'Quick banner', 'Fast finishing'],
                    'strategy' => 'Tekankan slot express terbatas untuk mendorong closing lebih cepat.',
                ],
                [
                    'title' => 'Promosi toko bertema kemerdekaan juga relevan',
                    'type' => 'Retail',
                    'reason' => 'Banyak toko membuat promo tematik untuk menarik traffic.',
                    'products' => ['Poster promo', 'Banner diskon', 'Stiker tema'],
                    'strategy' => 'Jual paket promo toko bertema Agustus.',
                ],
            ],
            'recommendations' => [
                'Gas paket event kemerdekaan seagresif mungkin.',
                'Tambahkan upsell item pendukung pada tiap order acara.',
                'Bangun paket express untuk kebutuhan mendadak.',
                'Dorong toko retail memakai materi promo tematik.',
                'Jaga kecepatan chat karena order Agustus sangat sensitif waktu.',
            ],
            'selling' => '“Event merdeka lebih siap, visual lebih ramai, produksi lebih cepat.”',
            'promo_lines' => [
                'Paket event kemerdekaan',
                'Spanduk + banner + ID card + sertifikat',
                'Express order untuk lomba dan acara',
                'Promo tema Agustus untuk toko',
            ],
        ],
        9 => [
            'badge' => 'Q3 optimization',
            'headline' => 'September: fokus repeat order, promosi toko, packaging, dan efisiensi transaksi.',
            'summary' => 'September cocok untuk menata ulang ritme order. Bulan ini bagus untuk menekan follow-up pelanggan lama, paket UMKM, dan transaksi yang lebih efisien namun rutin.',
            'signals' => [
                [
                    'title' => 'Repeat order kembali jadi mesin penjualan utama',
                    'type' => 'Repeat',
                    'reason' => 'Setelah musim ramai event, follow-up customer lama bisa lebih efektif daripada promosi massal.',
                    'products' => ['Cetak ulang banner', 'Label', 'Poster promo', 'Stiker'],
                    'strategy' => 'Aktifkan customer lama 30–90 hari terakhir.',
                ],
                [
                    'title' => 'Packaging dan label masih layak didorong',
                    'type' => 'UMKM',
                    'reason' => 'UMKM dan seller online tetap butuh bahan branding kecil secara berkala.',
                    'products' => ['Label produk', 'Stiker kemasan', 'Thank you card'],
                    'strategy' => 'Jual paket refill branding untuk usaha kecil.',
                ],
                [
                    'title' => 'Kompetitor baru mulai bermain di segmen rutin',
                    'type' => 'Defense',
                    'reason' => 'Setelah hype mesin baru, kompetitor biasanya masuk ke order harian yang berulang.',
                    'products' => ['Paket langganan', 'Quick repeat print'],
                    'strategy' => 'Bangun program pelanggan tetap dengan prioritas produksi.',
                ],
                [
                    'title' => 'Paket langganan bisa menaikkan retensi',
                    'type' => 'Retention',
                    'reason' => 'Customer rutin lebih mudah dipertahankan dengan benefit sederhana.',
                    'products' => ['Repeat banner', 'Label bulanan', 'Stiker rutin'],
                    'strategy' => 'Tawarkan benefit repeat order: antrean prioritas atau bonus minor finishing.',
                ],
            ],
            'recommendations' => [
                'Utamakan reaktivasi dan repeat order customer lama.',
                'Dorong paket refill branding untuk UMKM.',
                'Bangun program pelanggan tetap agar tidak pindah ke kompetitor baru.',
                'Jual benefit layanan, bukan diskon besar.',
                'Pastikan admin follow-up lebih disiplin di bulan ini.',
            ],
            'selling' => '“Repeat order lebih mudah, proses lebih aman, dan hasil tetap konsisten.”',
            'promo_lines' => [
                'Paket repeat order prioritas',
                'Refill branding UMKM',
                'Bonus antrean cepat untuk pelanggan rutin',
                'Label + stiker + insert refill',
            ],
        ],
        10 => [
            'badge' => 'Q4 warm-up',
            'headline' => 'Oktober: mulai dorong kebutuhan akhir tahun, event, branding usaha, dan paket promosi besar.',
            'summary' => 'Oktober adalah bulan persiapan menuju penutupan tahun. Cocok untuk mulai membangun pipeline order event, promo toko, hampers, packaging, dan materi visual bisnis.',
            'signals' => [
                [
                    'title' => 'Pelanggan mulai menyiapkan materi akhir tahun',
                    'type' => 'Preparation',
                    'reason' => 'Bisnis yang rapi biasanya mulai menyiapkan materi promo dan branding sejak Oktober.',
                    'products' => ['Banner promo', 'Packaging', 'Label produk', 'Poster'],
                    'strategy' => 'Arahkan customer untuk booking lebih awal.',
                ],
                [
                    'title' => 'Event perusahaan dan komunitas mulai naik',
                    'type' => 'Event',
                    'reason' => 'Menjelang akhir tahun, kebutuhan acara cenderung bertambah.',
                    'products' => ['Backdrop', 'ID card', 'Sertifikat', 'Spanduk'],
                    'strategy' => 'Buat penawaran paket event akhir tahun.',
                ],
                [
                    'title' => 'Kompetitor mesin baru akan agresif di Q4',
                    'type' => 'Defense',
                    'reason' => 'Kuartal akhir biasanya jadi momen rebutan pelanggan.',
                    'products' => ['Paket express', 'Priority slot', 'Finishing cepat'],
                    'strategy' => 'Tekankan kapasitas, kepastian selesai, dan kemudahan order.',
                ],
                [
                    'title' => 'Bundling akhir tahun bisa menaikkan omzet',
                    'type' => 'Upsell',
                    'reason' => 'Customer cenderung lebih mudah membeli paket lengkap saat masuk musim ramai.',
                    'products' => ['Banner', 'Poster', 'Packaging', 'Insert promo'],
                    'strategy' => 'Buat tier bundle yang jelas untuk berbagai tipe customer.',
                ],
            ],
            'recommendations' => [
                'Mulai dorong booking order akhir tahun sejak Oktober.',
                'Jual paket event dan promo toko sekaligus.',
                'Bangun persepsi toko siap ramai dan siap cepat.',
                'Tonjolkan kepastian jadi untuk melawan kompetitor baru.',
                'Naikkan average order lewat bundling lengkap.',
            ],
            'selling' => '“Siap ramai akhir tahun, order lebih aman kalau disiapkan dari sekarang.”',
            'promo_lines' => [
                'Booking awal order akhir tahun',
                'Paket event dan promo Q4',
                'Priority slot produksi',
                'Bundling packaging + promo display',
            ],
        ],
        11 => [
            'badge' => 'Year-end acceleration',
            'headline' => 'November: dorong promo akhir tahun, packaging, label, hampers, display, dan order perusahaan.',
            'summary' => 'November sangat cocok untuk agresif menjual kebutuhan akhir tahun, promosi toko, acara perusahaan, dan produk packaging bernilai tinggi.',
            'signals' => [
                [
                    'title' => 'Packaging akhir tahun sangat layak dikejar',
                    'type' => 'Packaging',
                    'reason' => 'Hampers, parcel, promo toko, dan produk retail biasanya membutuhkan tampilan yang lebih menarik.',
                    'products' => ['Label hampers', 'Stiker kemasan', 'Tag produk', 'Insert promo'],
                    'strategy' => 'Buat paket hampers dan packaging akhir tahun.',
                ],
                [
                    'title' => 'Order perusahaan dan event mulai padat',
                    'type' => 'Corporate',
                    'reason' => 'Banyak perusahaan dan komunitas menyiapkan acara penutupan tahun.',
                    'products' => ['Backdrop', 'Sertifikat', 'ID card', 'Buku acara'],
                    'strategy' => 'Dorong paket event korporat dengan opsi express.',
                ],
                [
                    'title' => 'Kompetitor baru akan bermain agresif di deadline ketat',
                    'type' => 'Defense',
                    'reason' => 'Musim padat membuat pelanggan memilih vendor paling responsif.',
                    'products' => ['Express print', 'Priority queue', 'Fast finishing'],
                    'strategy' => 'Bangun urgensi: slot terbatas dan deadline aman.',
                ],
                [
                    'title' => 'Promo display toko akhir tahun juga kuat',
                    'type' => 'Retail',
                    'reason' => 'Retail dan UMKM cenderung meningkatkan promosi menjelang Desember.',
                    'products' => ['Banner diskon', 'Poster toko', 'Stiker promo'],
                    'strategy' => 'Jual paket visual promo toko dengan waktu pengerjaan singkat.',
                ],
            ],
            'recommendations' => [
                'Gas packaging, hampers, dan label produk akhir tahun.',
                'Kejar order perusahaan dan event dari awal November.',
                'Gunakan urgency untuk mengunci slot produksi.',
                'Naikkan average order dengan bundling display dan packaging.',
                'Jangan masuk perang harga, jual kecepatan dan kepastian hasil.',
            ],
            'selling' => '“Musim akhir tahun lebih aman kalau order di tempat yang cepat, rapi, dan siap ramai.”',
            'promo_lines' => [
                'Paket hampers dan packaging akhir tahun',
                'Express slot untuk order deadline ketat',
                'Paket event perusahaan',
                'Banner + poster + display promo toko',
            ],
        ],
        12 => [
            'badge' => 'Peak season',
            'headline' => 'Desember: maksimalkan musim ramai akhir tahun dengan promo cepat, packaging, event, dan display toko.',
            'summary' => 'Desember adalah bulan puncak. Fokus utama adalah kecepatan closing, kejelasan paket, kapasitas produksi, dan upsell untuk order yang sudah masuk.',
            'signals' => [
                [
                    'title' => 'Order mendadak sangat tinggi',
                    'type' => 'Peak',
                    'reason' => 'Banyak customer bergerak mepet deadline di akhir tahun.',
                    'products' => ['Banner express', 'Poster express', 'Packaging cepat', 'Stiker cepat jadi'],
                    'strategy' => 'Tonjolkan layanan express dan slot prioritas.',
                ],
                [
                    'title' => 'Packaging, label, dan display toko paling kuat',
                    'type' => 'Retail',
                    'reason' => 'Bisnis biasanya gencar promosi, gift, dan hampers.',
                    'products' => ['Label produk', 'Stiker kemasan', 'Poster promo', 'Banner display'],
                    'strategy' => 'Jual paket retail akhir tahun yang siap pakai.',
                ],
                [
                    'title' => 'Kompetitor baru bisa menang kalau admin lambat',
                    'type' => 'Defense',
                    'reason' => 'Di Desember, respons lambat sama bahayanya dengan harga mahal.',
                    'products' => ['Quick quotation', 'Express package', 'Fast proofing'],
                    'strategy' => 'Buat alur order cepat: respon, cek file, konfirmasi, produksi.',
                ],
                [
                    'title' => 'Upsell finishing lebih mudah diterima',
                    'type' => 'Margin',
                    'reason' => 'Customer akhir tahun biasanya lebih fokus ke hasil dan deadline daripada selisih kecil harga.',
                    'products' => ['Laminasi', 'Cutting', 'Finishing premium'],
                    'strategy' => 'Dorong finishing premium pada order bernilai menengah ke atas.',
                ],
            ],
            'recommendations' => [
                'Maksimalkan layanan express dan priority queue.',
                'Jual paket retail, packaging, dan event secara agresif.',
                'Percepat respons admin dan alur approval file.',
                'Dorong finishing premium untuk menjaga margin.',
                'Gunakan urgency dan slot terbatas untuk closing cepat.',
            ],
            'selling' => '“Akhir tahun serba mepet, jadi pilih vendor yang cepat respon dan aman deadline.”',
            'promo_lines' => [
                'Slot express terbatas',
                'Paket retail dan packaging akhir tahun',
                'Bonus prioritas produksi untuk nominal tertentu',
                'Upsell finishing premium',
            ],
        ],
    ];

    $marketData = $monthlyMarketMap[$currentMonthNum] ?? $monthlyMarketMap[4];
@endphp

<style>
    .ai-owner-page{font-family:'Poppins',sans-serif;padding-top:96px;}
    .ai-owner-shell{max-width:1280px;margin:0 auto;padding:16px 20px 32px;background:
        radial-gradient(1000px 380px at 12% 0%, rgba(99,102,241,.16), transparent 62%),
        radial-gradient(950px 340px at 88% 8%, rgba(16,185,129,.14), transparent 62%),
        radial-gradient(900px 360px at 50% 115%, rgba(244,63,94,.10), transparent 62%);border-radius:18px;}
    .ai-hero{position:relative;overflow:hidden;border-radius:24px;padding:28px;background:linear-gradient(135deg,#0f172a 0%,#1e293b 52%,#1d4ed8 100%);color:#fff;box-shadow:0 20px 50px rgba(15,23,42,.22);}
    .ai-hero-grid{display:grid;grid-template-columns:minmax(0,1.8fr) minmax(280px,.8fr);gap:24px;align-items:start;}
    .ai-badges{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:16px;}
    .ai-badge{display:inline-flex;align-items:center;gap:8px;border-radius:999px;padding:8px 12px;font-size:12px;font-weight:700;background:rgba(255,255,255,.12);border:1px solid rgba(255,255,255,.16);color:#fff;}
    .ai-badge .dot{width:8px;height:8px;border-radius:999px;background:#34d399;display:inline-block;}
    .ai-title{margin:0;font-size:42px;line-height:1.15;font-weight:800;letter-spacing:-0.03em;color:#fff;}
    .ai-title span{color:#8be0ff;}
    .ai-subtitle{margin:14px 0 0;max-width:860px;font-size:14px;line-height:1.9;color:rgba(255,255,255,.86);}
    .ai-mini-stats{margin-top:20px;display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:12px;}
    .ai-mini-stat{border-radius:18px;padding:16px;background:rgba(255,255,255,.10);border:1px solid rgba(255,255,255,.12);backdrop-filter:blur(8px);}
    .ai-mini-stat small{display:block;font-size:11px;text-transform:uppercase;letter-spacing:.16em;color:rgba(255,255,255,.68);}
    .ai-mini-stat strong{display:block;margin-top:8px;font-size:16px;color:#fff;}
    .ai-guard{border-radius:20px;padding:20px;background:rgba(255,255,255,.10);border:1px solid rgba(255,255,255,.14);backdrop-filter:blur(8px);}
    .ai-guard h3{margin:0;font-size:15px;font-weight:700;color:#fff;}
    .ai-guard ul{margin:14px 0 0;padding-left:18px;color:rgba(255,255,255,.84);font-size:13px;line-height:1.8;}
    .ai-card{border-radius:24px;padding:22px;background:rgba(255,255,255,.84);border:1px solid rgba(15,23,42,.10);box-shadow:0 14px 36px rgba(15,23,42,.08);backdrop-filter:blur(10px);}
    .dark .ai-card{background:rgba(17,24,39,.72);border:1px solid rgba(255,255,255,.08);box-shadow:none;}
    .ai-controls{margin-top:24px;display:grid;grid-template-columns:minmax(0,1.4fr) 320px;gap:20px;}
    .ai-label{display:block;margin-bottom:8px;font-size:12px;font-weight:700;text-transform:uppercase;letter-spacing:.16em;color:#64748b;}
    .dark .ai-label{ color:rgba(255,255,255,.56); }
    .ai-textarea,.ai-select{width:100%;border-radius:16px;border:1px solid #dbe3ef;background:#fff;color:#111827;box-shadow:inset 0 1px 2px rgba(15,23,42,.04);font-family:'Poppins',sans-serif;}
    .ai-textarea{min-height:124px;padding:16px;resize:vertical;font-size:14px;line-height:1.8;}
    .ai-select{height:46px;padding:0 14px;font-size:14px;}
    .ai-textarea::placeholder{ color:#94a3b8; }
    .ai-textarea:focus,.ai-select:focus{outline:none;border-color:#465fff;box-shadow:0 0 0 4px rgba(70,95,255,.12);}
    .dark .ai-textarea,.dark .ai-select{background:rgba(15,23,42,.84);border:1px solid rgba(255,255,255,.10);color:#fff;box-shadow:none;}
    .dark .ai-textarea::placeholder{ color:rgba(255,255,255,.42); }
    .ai-grid-3{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:12px;}
    .ai-chips{display:flex;flex-wrap:wrap;gap:8px;}
    .scope-chip,.quick-chip{display:inline-flex;align-items:center;justify-content:center;border-radius:999px;border:1px solid rgba(17,24,39,.10);background:rgba(255,255,255,.82);padding:9px 12px;font-size:12px;font-weight:700;color:#374151;transition:all .15s ease;font-family:'Poppins',sans-serif;}
    .scope-chip:hover,.quick-chip:hover{transform:translateY(-1px);background:#fff;}
    .scope-chip.active{border-color:#465fff;background:#eff2ff;color:#3247d5;}
    .dark .scope-chip,.dark .quick-chip{border:1px solid rgba(255,255,255,.10);background:rgba(255,255,255,.06);color:rgba(255,255,255,.86);}
    .dark .scope-chip.active{border-color:#7f9cff;background:rgba(70,95,255,.18);color:#c8d4ff;}
    .ai-actions{display:flex;flex-wrap:wrap;align-items:center;gap:12px;}
    .ai-btn-primary,.ai-btn-secondary{display:inline-flex;align-items:center;justify-content:center;gap:8px;border-radius:14px;font-family:'Poppins',sans-serif;cursor:pointer;transition:all .15s ease;}
    .ai-btn-primary{padding:12px 18px;background:#465fff;color:#fff;font-size:14px;font-weight:700;box-shadow:0 12px 24px rgba(70,95,255,.22);}
    .ai-btn-primary:hover{background:#3949d3;transform:translateY(-1px);}
    .ai-btn-secondary{padding:11px 16px;border:1px solid rgba(17,24,39,.12);background:rgba(255,255,255,.84);color:#111827;font-size:14px;font-weight:600;}
    .ai-btn-secondary:hover{background:#fff;}
    .dark .ai-btn-secondary{border:1px solid rgba(255,255,255,.10);background:rgba(255,255,255,.06);color:rgba(255,255,255,.88);}
    .dark .ai-btn-secondary:hover{background:rgba(255,255,255,.10);}
    .ai-tip-box{border-radius:20px;padding:18px;background:rgba(255,255,255,.76);border:1px solid rgba(15,23,42,.08);}
    .dark .ai-tip-box{background:rgba(255,255,255,.04);border:1px solid rgba(255,255,255,.08);}
    .ai-tip-box h3{margin:0 0 10px;font-size:15px;font-weight:700;color:#0f172a;}
    .dark .ai-tip-box h3{color:#fff;}
    .ai-tip-box ul{margin:0;padding-left:18px;color:#334155;font-size:13px;line-height:1.8;}
    .dark .ai-tip-box ul{color:rgba(255,255,255,.78);}
    .ai-last-updated{margin-top:14px;font-size:12px;color:#64748b;}
    .dark .ai-last-updated{ color:rgba(255,255,255,.52); }
    .ai-kpis{margin-top:24px;display:grid;grid-template-columns:repeat(6,minmax(0,1fr));gap:14px;}
    .ai-kpi{border-radius:20px;padding:18px;background:rgba(255,255,255,.84);border:1px solid rgba(15,23,42,.08);box-shadow:0 10px 24px rgba(15,23,42,.05);}
    .dark .ai-kpi{background:rgba(255,255,255,.05);border:1px solid rgba(255,255,255,.08);box-shadow:none;}
    .ai-kpi small{display:block;font-size:12px;color:#64748b;}
    .dark .ai-kpi small{color:rgba(255,255,255,.54);}
    .ai-kpi strong{display:block;margin-top:10px;font-size:28px;line-height:1.1;font-weight:800;color:#0f172a;letter-spacing:-0.03em;}
    .dark .ai-kpi strong{color:#fff;}
    .ai-error{margin-top:20px;border-radius:20px;padding:18px;border:1px solid #fecaca;background:#fff1f2;color:#9f1239;}
    .ai-section-grid{margin-top:20px;display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:16px;}
    .ai-section-grid .span-2{grid-column:span 2;}
    .ai-soft{border-radius:18px;border:1px solid rgba(15,23,42,.08);background:rgba(255,255,255,.68);padding:16px;}
    .dark .ai-soft{border:1px solid rgba(255,255,255,.08);background:rgba(255,255,255,.04);}
    .ai-panel-title{margin:0;font-size:15px;font-weight:700;color:#0f172a;}
    .dark .ai-panel-title{color:#fff;}
    .ai-panel-note{margin-top:4px;font-size:12px;color:#64748b;}
    .dark .ai-panel-note{color:rgba(255,255,255,.56);}
    .ai-stack{display:flex;flex-direction:column;gap:12px;}
    .ai-text{color:#111827;font-size:14px;line-height:1.8;}
    .dark .ai-text{color:rgba(255,255,255,.88);}
    .ai-result-grid{margin-top:20px;display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:20px;}
    .ai-chart-wrap{height:290px;}
    .ai-table-wrap{overflow:auto;border:1px solid rgba(15,23,42,.08);border-radius:18px;margin-top:14px;background:#fff;}
    .dark .ai-table-wrap{border:1px solid rgba(255,255,255,.08);background:rgba(255,255,255,.03);}
    .ai-table{min-width:100%;border-collapse:collapse;}
    .ai-table thead{background:#f8fafc;}
    .dark .ai-table thead{background:rgba(255,255,255,.04);}
    .ai-table th{padding:14px 16px;text-align:left;font-size:12px;font-weight:700;letter-spacing:.04em;text-transform:uppercase;color:#64748b;white-space:nowrap;}
    .dark .ai-table th{color:rgba(255,255,255,.58);}
    .ai-table td{padding:14px 16px;font-size:14px;color:#111827;white-space:nowrap;border-top:1px solid #eef2f7;}
    .dark .ai-table td{color:rgba(255,255,255,.88);border-top:1px solid rgba(255,255,255,.06);}
    .market-grid{margin-top:20px;display:grid;grid-template-columns:1.2fr .8fr;gap:16px;}
    .trend-list,.recommend-list{display:flex;flex-direction:column;gap:10px;margin-top:14px;}
    .trend-item,.recommend-item{border-radius:16px;padding:14px;border:1px solid rgba(15,23,42,.08);background:rgba(255,255,255,.70);}
    .dark .trend-item,.dark .recommend-item{border:1px solid rgba(255,255,255,.08);background:rgba(255,255,255,.04);}
    .trend-item a{color:#1d4ed8;text-decoration:none;font-weight:600;}
    .trend-item a:hover{text-decoration:underline;}
    .small-note{font-size:12px;color:#64748b;line-height:1.7;}
    .dark .small-note{color:rgba(255,255,255,.56);}
    .hidden{display:none!important;}
    @media (max-width: 1200px){.ai-kpis{grid-template-columns:repeat(3,minmax(0,1fr));}.ai-controls{grid-template-columns:1fr;}.market-grid{grid-template-columns:1fr;}}
    @media (max-width: 900px){.ai-hero-grid,.ai-result-grid,.ai-section-grid{grid-template-columns:1fr;}.ai-section-grid .span-2{grid-column:span 1;}.ai-mini-stats{grid-template-columns:1fr;}.ai-grid-3{grid-template-columns:1fr;}.ai-kpis{grid-template-columns:repeat(2,minmax(0,1fr));}.ai-title{font-size:32px;}}
    @media (max-width: 640px){.ai-owner-shell{padding:12px;}.ai-hero,.ai-card{padding:18px;}.ai-kpis{grid-template-columns:1fr;}}
</style>

<div class="ai-owner-page">
    <div class="ai-owner-shell">
        <section class="ai-hero">
            <div class="ai-hero-grid">
                <div>
                    <div class="ai-badges">
                        <span class="ai-badge"><span class="dot"></span> AI Penjualan & Business Intelligence</span>
                        <span class="ai-badge">READ ONLY</span>
                        <span class="ai-badge">Tampilan Aman</span>
                    </div>

                    <h1 class="ai-title">
                        AI Analisis Penjualan & Operasional
                    </h1>

                    <p class="ai-subtitle">
                        Halaman ini berfungsi untuk membantu owner memahami kondisi usaha secara menyeluruh. Anda bisa melihat ringkasan performa, tren penjualan, kondisi stok, arus pembayaran, serta rekomendasi yang dapat membantu pengambilan keputusan bisnis.
                    </p>

                    <div class="ai-mini-stats">
                        <div class="ai-mini-stat">
                            <small>Mode</small>
                            <strong>Owner friendly</strong>
                        </div>
                        <div class="ai-mini-stat">
                            <small>Output</small>
                            <strong>Insight, angka, promo</strong>
                        </div>
                        <div class="ai-mini-stat">
                            <small>Keamanan</small>
                            <strong>Tanpa query mentah</strong>
                        </div>
                    </div>
                </div>

                <aside class="ai-guard">
                    <h3>Guardrail Aktif</h3>
                    <ul>
                        <li>Hanya membaca data</li>
                        <li>Tidak menampilkan query mentah</li>
                        <li>Tidak bisa create, update, delete, atau cancel transaksi</li>
                        <li>Fokus pada ringkasan, analisa, dan strategi owner</li>
                    </ul>
                </aside>
            </div>
        </section>

        <section class="ai-controls ai-card">
            <div>
                <label class="ai-label" for="question">Pertanyaan / Instruksi Analisa</label>
                <textarea
                    id="question"
                    class="ai-textarea"
                    placeholder="Contoh: Baca performa bisnis 30 hari terakhir, cari anomali, prediksi 7 hari ke depan, dan beri saran promosi paling efektif."
                ></textarea>

                <div class="ai-grid-3" style="margin-top:14px;">
                    <div>
                        <label class="ai-label" for="analysisMode">Mode analisa</label>
                        <select id="analysisMode" class="ai-select">
                            <option value="ceo">CEO / Owner</option>
                            <option value="marketing">Marketing / Promo</option>
                            <option value="finance">Finance / Cashflow</option>
                            <option value="operations">Operations / Produksi</option>
                            <option value="inventory">Inventory / Stok</option>
                            <option value="full">Semua data</option>
                        </select>
                    </div>
                    <div>
                        <label class="ai-label" for="analysisDepth">Kedalaman</label>
                        <select id="analysisDepth" class="ai-select">
                            <option value="standard">Standard</option>
                            <option value="deep" selected>Deep</option>
                            <option value="ultra">Ultra</option>
                        </select>
                    </div>
                    <div>
                        <label class="ai-label" for="autoRefresh">Auto refresh</label>
                        <select id="autoRefresh" class="ai-select">
                            <option value="0" selected>Mati</option>
                            <option value="30000">30 detik</option>
                            <option value="60000">60 detik</option>
                            <option value="120000">120 detik</option>
                        </select>
                    </div>
                </div>

                <div style="margin-top:16px;">
                    <div class="ai-label">Scope data aktif</div>
                    <div class="ai-chips">
                        <button type="button" class="scope-chip active" data-scope="sales">Penjualan</button>
                        <button type="button" class="scope-chip active" data-scope="orders">Order</button>
                        <button type="button" class="scope-chip active" data-scope="payments">Pembayaran</button>
                        <button type="button" class="scope-chip active" data-scope="inventory">Stok</button>
                        <button type="button" class="scope-chip active" data-scope="purchases">Pembelian</button>
                        <button type="button" class="scope-chip active" data-scope="production">Produksi</button>
                        <button type="button" class="scope-chip active" data-scope="customers">Customer</button>
                        <button type="button" class="scope-chip active" data-scope="finance">Keuangan</button>
                    </div>
                </div>

                <div style="margin-top:16px;">
                    <div class="ai-label">Quick ask</div>
                    <div class="ai-chips">
                        <button type="button" class="quick-chip" data-q="Baca semua data penting hari ini, cari masalah, peluang, dan prioritas utama untuk owner.">Brief owner hari ini</button>
                        <button type="button" class="quick-chip" data-q="Analisa penjualan 30 hari terakhir, tren harian, prediksi 7 hari ke depan, dan risiko utama.">Tren dan forecast</button>
                        <button type="button" class="quick-chip" data-q="Cari peluang promosi minggu ini dan buatkan strategi promosi yang paling cocok.">Promo mingguan</button>
                        <button type="button" class="quick-chip" data-q="Analisa cashflow, pembayaran, pengeluaran, pembelian, dan titik rawan finansial.">Finance check</button>
                        <button type="button" class="quick-chip" data-q="Analisa order tertunda, belum bayar, bottleneck produksi, dan tindakan operasional tercepat.">Ops alert</button>
                        <button type="button" class="quick-chip" data-q="Baca stok, pembelian, pemakaian bahan, bahan custom, dan beri saran restock serta efisiensi.">Inventory radar</button>
                    </div>
                </div>

                <div class="ai-actions" style="margin-top:18px;">
                    <button id="sendBtn" type="button" class="ai-btn-primary">Jalankan analisa</button>
                    <button id="clearBtn" type="button" class="ai-btn-secondary">Reset</button>
                    <div id="statusText" class="ai-text" style="font-size:13px;color:#64748b;"></div>
                </div>
            </div>

            <aside class="ai-tip-box">
                <h3>Tips</h3>
                <ul>
                    <li>Pakai pertanyaan “per hari” agar forecast 7 hari lebih mudah muncul.</li>
                    <li>Untuk rekening dan metode bayar, AI akan membaca pembayaran dan rekening tujuan.</li>
                    <li>Untuk owner, minta ringkasan + risiko + tindakan prioritas.</li>
                    <li>Semua nominal uang akan otomatis tampil dengan format Rupiah.</li>
                </ul>
                <div id="lastUpdatedText" class="ai-last-updated">Belum ada analisa berjalan.</div>
            </aside>
        </section>

        <section class="market-grid">
            <div class="ai-card">
                <div style="display:flex;align-items:flex-start;justify-content:space-between;gap:12px;">
                    <div>
                        <h3 class="ai-panel-title">Sinyal pasar yang relevan</h3>
                        <div class="ai-panel-note">Strategi otomatis bulanan • Periode: {{ $currentMonthLabel }}</div>
                    </div>
                    <span class="ai-badge" style="background:#fff;border-color:#e5e7eb;color:#334155;">{{ $marketData['badge'] }}</span>
                </div>

                <div class="small-note" style="margin-top:12px;">
                    <b style="color:#0f172a;">{{ $marketData['headline'] }}</b><br>
                    {{ $marketData['summary'] }}
                </div>

                <div class="trend-list">
                    @foreach($marketData['signals'] as $item)
                        <div class="trend-item">
                            <div style="display:flex;justify-content:space-between;gap:12px;align-items:flex-start;">
                                <div>
                                    <div style="font-size:15px;font-weight:700;color:#0f172a;">{{ $item['title'] }}</div>
                                    @if(!empty($item['reason']))
                                        <div class="small-note" style="margin-top:6px;">{{ $item['reason'] }}</div>
                                    @endif
                                </div>

                                @if(!empty($item['type']))
                                    <span style="display:inline-flex;white-space:nowrap;border-radius:999px;padding:6px 10px;font-size:11px;font-weight:700;background:#eff6ff;color:#1d4ed8;border:1px solid #bfdbfe;">
                                        {{ $item['type'] }}
                                    </span>
                                @endif
                            </div>

                            @if(!empty($item['products']) && is_array($item['products']))
                                <div class="small-note" style="margin-top:10px;">
                                    <b style="color:#0f172a;">Produk yang didorong:</b>
                                    {{ implode(', ', $item['products']) }}
                                </div>
                            @endif

                            @if(!empty($item['strategy']))
                                <div class="small-note" style="margin-top:8px;">
                                    <b style="color:#0f172a;">Aksi owner:</b>
                                    {{ $item['strategy'] }}
                                </div>
                            @endif
                        </div>
                    @endforeach
                </div>
            </div>

            <div class="ai-card">
                <h3 class="ai-panel-title">Strategi owner bulan ini</h3>
                <div class="ai-panel-note">Saran marketing cepat, lebih agresif, dan tetap menjaga margin saat kompetitor hadir dengan mesin baru</div>

                <div class="recommend-list">
                    @foreach($marketData['recommendations'] as $item)
                        <div class="recommend-item ai-text">{{ $item }}</div>
                    @endforeach
                </div>

                <div class="small-note" style="margin-top:14px;">
                    <b style="color:#0f172a;">Posisi jual yang disarankan:</b><br>
                    {{ $marketData['selling'] }}
                </div>

                <div class="small-note" style="margin-top:12px;">
                    <b style="color:#0f172a;">Headline promo yang bisa dipakai:</b><br>
                    @foreach($marketData['promo_lines'] as $line)
                        • {{ $line }}<br>
                    @endforeach
                </div>
            </div>
        </section>

        <section class="ai-kpis">
            <div class="ai-kpi"><small>Total utama</small><strong id="kpiTotal">-</strong></div>
            <div class="ai-kpi"><small>Jumlah baris</small><strong id="kpiRows">-</strong></div>
            <div class="ai-kpi"><small>Jumlah kolom</small><strong id="kpiCols">-</strong></div>
            <div class="ai-kpi"><small>Waktu request</small><strong id="kpiMs">-</strong></div>
            <div class="ai-kpi"><small>Confidence</small><strong id="kpiConfidence">-</strong></div>
            <div class="ai-kpi"><small>Freshness</small><strong id="kpiFreshness">-</strong></div>
        </section>

        <section id="errorArea" class="ai-error hidden">
            <div style="font-size:14px;font-weight:700;">AI Error</div>
            <div id="errorMessage" style="margin-top:8px;font-size:14px;"></div>
            <div id="errorHint" style="margin-top:4px;font-size:12px;"></div>
        </section>

        <section id="execArea" class="hidden">
            <div class="ai-section-grid">
                <div class="ai-card span-2">
                    <div style="display:flex;align-items:flex-start;justify-content:space-between;gap:12px;">
                        <div>
                            <h3 class="ai-panel-title">Ringkasan owner</h3>
                            <div class="ai-panel-note">Ringkasan cepat untuk owner / boss.</div>
                        </div>
                        <span id="trendBadge" class="ai-badge" style="background:#fff;border-color:#e5e7eb;color:#334155;">-</span>
                    </div>

                    <div class="ai-stack" style="margin-top:16px;">
                        <div id="execLine1" class="ai-soft ai-text">-</div>
                        <div id="execLine2" class="ai-soft ai-text">-</div>
                        <div id="execLine3" class="ai-soft ai-text">-</div>
                    </div>

                    <div class="ai-actions" style="margin-top:14px;">
                        <button id="copyExecBtn" type="button" class="ai-btn-secondary" style="padding:10px 14px;font-size:12px;">Copy ringkasan</button>
                        <button id="copyWABtn" type="button" class="ai-btn-secondary" style="padding:10px 14px;font-size:12px;">Copy script WA</button>
                    </div>
                </div>

                <div class="ai-card">
                    <h3 class="ai-panel-title">Risk alerts</h3>
                    <div class="ai-panel-note">Peringatan yang perlu dicek sekarang.</div>
                    <div id="riskList" class="ai-stack" style="margin-top:16px;">
                        <div class="ai-text" style="color:#64748b;">-</div>
                    </div>
                </div>
            </div>

            <div class="ai-section-grid">
                <div class="ai-card span-2">
                    <div style="display:flex;align-items:flex-start;justify-content:space-between;gap:12px;">
                        <div>
                            <h3 class="ai-panel-title">Forecast 7 hari</h3>
                            <div id="forecastHint" class="ai-panel-note">Akan muncul jika data punya kolom tanggal dan angka.</div>
                        </div>
                        <span id="forecastConfidence" class="ai-badge" style="background:#fff;border-color:#e5e7eb;color:#334155;">-</span>
                    </div>

                    <div class="ai-grid-3" style="margin-top:16px;">
                        <div class="ai-soft"><div class="ai-panel-note">Prediksi total 7 hari</div><div id="forecastTotal7d" style="margin-top:8px;font-size:22px;font-weight:800;color:#0f172a;">-</div></div>
                        <div class="ai-soft"><div class="ai-panel-note">Rentang</div><div id="forecastRange" style="margin-top:8px;font-size:22px;font-weight:800;color:#0f172a;">-</div></div>
                        <div class="ai-soft"><div class="ai-panel-note">Arah tren</div><div id="forecastTrend" style="margin-top:8px;font-size:22px;font-weight:800;color:#0f172a;">-</div></div>
                    </div>

                    <div class="ai-chart-wrap" style="margin-top:16px;">
                        <canvas id="forecastChart"></canvas>
                    </div>
                </div>

                <div class="ai-card">
                    <h3 class="ai-panel-title">Saran promosi</h3>
                    <div class="ai-panel-note">Action plan yang cepat dijalankan.</div>
                    <div id="playbookArea" class="ai-stack" style="margin-top:16px;">
                        <div class="ai-soft ai-text">-</div>
                    </div>
                </div>
            </div>

            <div class="ai-section-grid" style="grid-template-columns:repeat(2,minmax(0,1fr));">
                <div class="ai-card">
                    <h3 class="ai-panel-title">Peluang yang terlihat</h3>
                    <div class="ai-panel-note">Peluang yang paling layak dikejar.</div>
                    <div id="opportunityArea" class="ai-stack" style="margin-top:16px;">
                        <div class="ai-soft ai-text">-</div>
                    </div>
                </div>

                <div class="ai-card">
                    <h3 class="ai-panel-title">Checklist owner</h3>
                    <div class="ai-panel-note">Yang perlu dipantau berkala.</div>
                    <div id="monitoringArea" class="ai-stack" style="margin-top:16px;">
                        <div class="ai-soft ai-text">-</div>
                    </div>
                </div>
            </div>
        </section>

        <section id="resultArea" class="hidden ai-result-grid">
            <div class="ai-card">
                <div style="display:flex;align-items:flex-start;justify-content:space-between;gap:12px;">
                    <div>
                        <h3 class="ai-panel-title">Chart</h3>
                        <div id="chartHint" class="ai-panel-note">Chart otomatis dari hasil data.</div>
                    </div>
                    <div class="ai-actions" style="gap:8px;">
                        <button id="copyJsonBtn" type="button" class="ai-btn-secondary" style="padding:10px 14px;font-size:12px;">Copy data</button>
                        <button id="printPdfBtn" type="button" class="ai-btn-secondary" style="padding:10px 14px;font-size:12px;">Print / Save PDF</button>
                    </div>
                </div>
                <div class="ai-chart-wrap" style="margin-top:14px;">
                    <canvas id="resultChart"></canvas>
                </div>
            </div>

            <div class="ai-card">
                <div style="display:flex;align-items:flex-start;justify-content:space-between;gap:12px;">
                    <h3 class="ai-panel-title">Jawaban AI</h3>
                </div>
                <div id="answerText" class="ai-text" style="margin-top:12px;"></div>
            </div>

            <div id="printTableArea" class="ai-card" style="grid-column:1 / -1;">
                <div>
                    <h3 class="ai-panel-title">Tabel data</h3>
                    <div id="tableHint" class="ai-panel-note">Header otomatis dirapikan agar mudah dibaca.</div>
                </div>

                <div class="ai-table-wrap">
                    <table class="ai-table">
                        <thead id="tableHead"></thead>
                        <tbody id="tableBody"></tbody>
                    </table>
                </div>
            </div>
        </section>
    </div>
</div>

<script src="https://cdn.jsdelivr.net/npm/chart.js@4.4.1/dist/chart.umd.min.js"></script>
<script>
const SHOP_SETTINGS = @json($settings ?? []);
</script>
<script>
document.addEventListener("DOMContentLoaded", () => {
    const btn = document.getElementById("sendBtn");
    const clearBtn = document.getElementById("clearBtn");
    const statusText = document.getElementById("statusText");
    const resultArea = document.getElementById("resultArea");
    const execArea = document.getElementById("execArea");
    const errorArea = document.getElementById("errorArea");
    const errorMessage = document.getElementById("errorMessage");
    const errorHint = document.getElementById("errorHint");

    const kpiTotal = document.getElementById("kpiTotal");
    const kpiRows  = document.getElementById("kpiRows");
    const kpiCols  = document.getElementById("kpiCols");
    const kpiMs    = document.getElementById("kpiMs");
    const kpiConfidence = document.getElementById("kpiConfidence");
    const kpiFreshness = document.getElementById("kpiFreshness");

    const answerText = document.getElementById("answerText");
    const tableHead = document.getElementById("tableHead");
    const tableBody = document.getElementById("tableBody");

    const copyJsonBtn = document.getElementById("copyJsonBtn");
    const printPdfBtn = document.getElementById("printPdfBtn");

    const chartHint = document.getElementById("chartHint");
    const questionEl = document.getElementById("question");
    const analysisModeEl = document.getElementById("analysisMode");
    const analysisDepthEl = document.getElementById("analysisDepth");
    const autoRefreshEl = document.getElementById("autoRefresh");
    const lastUpdatedText = document.getElementById("lastUpdatedText");

    const trendBadge = document.getElementById("trendBadge");
    const execLine1 = document.getElementById("execLine1");
    const execLine2 = document.getElementById("execLine2");
    const execLine3 = document.getElementById("execLine3");
    const riskList  = document.getElementById("riskList");
    const copyExecBtn = document.getElementById("copyExecBtn");
    const copyWABtn = document.getElementById("copyWABtn");

    const forecastHint = document.getElementById("forecastHint");
    const forecastConfidence = document.getElementById("forecastConfidence");
    const forecastTotal7d = document.getElementById("forecastTotal7d");
    const forecastRange = document.getElementById("forecastRange");
    const forecastTrend = document.getElementById("forecastTrend");

    const playbookArea = document.getElementById("playbookArea");
    const opportunityArea = document.getElementById("opportunityArea");
    const monitoringArea = document.getElementById("monitoringArea");

    let latestJson = null;
    let latestPrompt = "";
    let chartInstance = null;
    let forecastChartInstance = null;
    let bestWAScript = "";
    let refreshTimer = null;

    function hideError() {
        errorArea.classList.add("hidden");
        errorMessage.textContent = "";
        errorHint.textContent = "";
    }

    function showError(message, hint = "") {
        errorArea.classList.remove("hidden");
        errorMessage.textContent = message || "Terjadi kesalahan.";
        errorHint.textContent = hint || "";
    }

    function getSelectedScopes() {
        return [...document.querySelectorAll(".scope-chip.active")].map(el => el.dataset.scope);
    }

    function scopeText(scopes) {
        const map = {
            sales: "penjualan",
            orders: "order",
            payments: "pembayaran",
            inventory: "stok dan bahan",
            purchases: "pembelian",
            production: "produksi",
            customers: "customer",
            finance: "keuangan"
        };
        return scopes.map(s => map[s] || s).join(", ");
    }

    function modeInstruction(mode) {
        if (mode === "marketing") return "Fokus utama promosi, pertumbuhan penjualan, dan repeat order.";
        if (mode === "finance") return "Fokus utama cashflow, pembayaran, piutang, dan kesehatan finansial.";
        if (mode === "operations") return "Fokus utama order tertunda, bottleneck produksi, dan risiko operasional.";
        if (mode === "inventory") return "Fokus utama stok, pemakaian bahan, pembelian, dan restock.";
        if (mode === "full") return "Baca seluruh data lintas modul dan cari insight paling penting untuk owner.";
        return "Fokus utama executive summary untuk owner.";
    }

    function depthInstruction(depth) {
        if (depth === "ultra") return "Berikan analisa maksimal: ringkasan, tren, risiko, peluang, prioritas tindakan, dan promosi.";
        if (depth === "deep") return "Berikan analisa mendalam: ringkasan, tren, risiko utama, peluang, dan saran aksi.";
        return "Berikan jawaban ringkas namun jelas dan berbasis data.";
    }

    function buildPrompt(rawQuestion) {
        const scopes = getSelectedScopes();
        const mode = analysisModeEl.value;
        const depth = analysisDepthEl.value;

        return [
            "ATURAN WAJIB:",
            "- Hanya baca data. READ ONLY.",
            "- Dilarang membuat, mengubah, menghapus, membatalkan, approve, atau mengeksekusi transaksi.",
            "- Gunakan bahasa Indonesia yang natural dan mudah dibaca owner.",
            "- Jangan gunakan snake_case di jawaban deskriptif.",
            "- Jika ada nilai uang, prioritaskan konteks nominal agar frontend bisa format Rupiah.",
            "",
            "MODE ANALISA:",
            modeInstruction(mode),
            "",
            "KEDALAMAN:",
            depthInstruction(depth),
            "",
            "SCOPE DATA AKTIF:",
            scopeText(scopes),
            "",
            "PERMINTAAN USER:",
            rawQuestion
        ].join("\n");
    }

    function stopAutoRefresh() {
        if (refreshTimer) {
            clearInterval(refreshTimer);
            refreshTimer = null;
        }
    }

    function restartAutoRefresh() {
        stopAutoRefresh();
        const interval = Number(autoRefreshEl.value || 0);
        if (!interval || !latestPrompt) return;
        refreshTimer = setInterval(() => runAnalysis({ silent: true, forcePrompt: latestPrompt }), interval);
    }

    function resetAll() {
        questionEl.value = "";
        statusText.textContent = "";
        hideError();

        execArea.classList.add("hidden");
        resultArea.classList.add("hidden");

        kpiTotal.textContent = "-";
        kpiRows.textContent = "-";
        kpiCols.textContent = "-";
        kpiMs.textContent = "-";
        kpiConfidence.textContent = "-";
        kpiFreshness.textContent = "-";

        answerText.textContent = "";
        tableHead.innerHTML = "";
        tableBody.innerHTML = "";

        latestJson = null;
        latestPrompt = "";

        trendBadge.textContent = "-";
        trendBadge.style.background = "#fff";
        trendBadge.style.color = "#334155";

        execLine1.textContent = "-";
        execLine2.textContent = "-";
        execLine3.textContent = "-";
        riskList.innerHTML = '<div class="ai-text" style="color:#64748b;">-</div>';
        playbookArea.innerHTML = '<div class="ai-soft ai-text">-</div>';
        opportunityArea.innerHTML = '<div class="ai-soft ai-text">-</div>';
        monitoringArea.innerHTML = '<div class="ai-soft ai-text">-</div>';
        forecastHint.textContent = "Akan muncul jika data punya kolom tanggal dan angka.";
        forecastConfidence.textContent = "-";
        forecastTotal7d.textContent = "-";
        forecastRange.textContent = "-";
        forecastTrend.textContent = "-";
        bestWAScript = "";
        lastUpdatedText.textContent = "Belum ada analisa berjalan.";

        if (chartInstance) { chartInstance.destroy(); chartInstance = null; }
        if (forecastChartInstance) { forecastChartInstance.destroy(); forecastChartInstance = null; }

        stopAutoRefresh();
    }

    document.querySelectorAll(".scope-chip").forEach(chip => {
        chip.addEventListener("click", () => chip.classList.toggle("active"));
    });

    document.querySelectorAll(".quick-chip").forEach(chip => {
        chip.addEventListener("click", () => {
            questionEl.value = chip.dataset.q || "";
            runAnalysis();
        });
    });

    clearBtn.addEventListener("click", resetAll);

    copyJsonBtn.addEventListener("click", async () => {
        if (!latestJson) return;
        await navigator.clipboard.writeText(JSON.stringify(latestJson, null, 2));
        statusText.textContent = "Data disalin";
        setTimeout(() => statusText.textContent = "", 1200);
    });

    copyExecBtn.addEventListener("click", async () => {
        const txt = [execLine1.textContent, execLine2.textContent, execLine3.textContent].filter(Boolean).join("\n");
        if (!txt || txt.trim() === "-" || txt.trim() === "") return;
        await navigator.clipboard.writeText(txt);
        statusText.textContent = "Ringkasan disalin";
        setTimeout(() => statusText.textContent = "", 1200);
    });

    copyWABtn.addEventListener("click", async () => {
        if (!bestWAScript) return;
        await navigator.clipboard.writeText(bestWAScript);
        statusText.textContent = "Script WA disalin";
        setTimeout(() => statusText.textContent = "", 1200);
    });

    printPdfBtn.addEventListener("click", () => window.print());

    function isDateLikeKey(key) {
        const k = (key || "").toLowerCase();
        return k.includes("date") || k.includes("tanggal") || k.includes("day") || k.includes("created at") || k.includes("created_at") || k.includes("paid_at");
    }

    function parseNumberMaybe(v) {
        if (v === null || v === undefined) return null;
        if (typeof v === "number") return v;

        const s = String(v).trim();
        if (!s) return null;

        if (s.includes(",")) {
            const normalized = s.replace(/\./g, "").replace(",", ".");
            const n = Number(normalized);
            return Number.isFinite(n) ? n : null;
        }

        const n = Number(s);
        return Number.isFinite(n) ? n : null;
    }

    function formatNumberID(n, maxFractionDigits = 2) {
        if (n === null || n === undefined) return "-";
        const v = (typeof n === "number") ? n : parseNumberMaybe(n);
        if (v === null) return String(n);
        return new Intl.NumberFormat("id-ID", { maximumFractionDigits: maxFractionDigits }).format(v);
    }

    function formatRupiah(n) {
        const v = (typeof n === "number") ? n : parseNumberMaybe(n);
        if (v === null) return "-";
        return "Rp " + new Intl.NumberFormat("id-ID", { maximumFractionDigits: 0 }).format(v);
    }

    function humanizeKey(key) {
        const map = {
            total_order_value: "Total order",
            total_order: "Total order",
            total_orders: "Total order",
            total_penjualan: "Total penjualan",
            total_pembayaran: "Total pembayaran",
            total_expenses: "Total pengeluaran",
            total_expenses_30d: "Total pengeluaran 30 hari",
            total_payments_30d: "Total pembayaran 30 hari",
            total_purchase_payments_30d: "Total pembayaran pembelian 30 hari",
            total_purchases_30d: "Total pembelian 30 hari",
            outstanding_receivables: "Piutang belum lunas",
            payment_method: "Metode pembayaran",
            payment_provider: "Provider pembayaran",
            payment_account_number: "Nomor rekening",
            payment_account_holder: "Pemilik rekening",
            customer_name: "Nama customer",
            customer_phone: "Nomor customer",
            invoice_number: "Nomor invoice",
            order_created_at: "Tanggal order",
            production_status: "Status produksi",
            payment_status: "Status pembayaran",
            paid_amount: "Sudah dibayar",
            total_price: "Total harga",
            unit_price: "Harga satuan",
            amount: "Nominal",
            total: "Total",
            qty: "Qty",
            total_qty: "Total qty",
            total_clicks: "Total klik",
            total_sales: "Total penjualan",
            materials_below_min_stock: "Bahan di bawah stok minimum",
        };

        const raw = String(key || "");
        if (map[raw]) return map[raw];

        const cleaned = raw
            .replace(/_/g, " ")
            .replace(/\s+/g, " ")
            .trim()
            .toLowerCase();

        if (!cleaned) return "-";

        return cleaned.charAt(0).toUpperCase() + cleaned.slice(1);
    }

    function isCurrencyKey(key) {
        const k = String(key || "").toLowerCase();

        const exactFalse = [
            "total order",
            "total orders",
            "jumlah order",
            "qty",
            "total qty",
            "total click",
            "total clicks",
            "jumlah transaksi",
            "rows",
            "cols",
        ];

        if (exactFalse.includes(k)) return false;

        const falseHints = ["qty", "count", "jumlah", "click", "sisi", "hari", "baris", "kolom"];
        if (falseHints.some(h => k.includes(h)) && !k.includes("amount")) return false;

        const trueHints = [
            "total", "amount", "price", "paid", "revenue", "omzet", "cost",
            "expense", "saldo", "receivable", "pembayaran", "penjualan",
            "harga", "biaya", "nominal", "piutang", "hutang", "deposit",
            "cash", "modal"
        ];

        return trueHints.some(h => k.includes(h));
    }

    function beautifyText(text) {
        return String(text || "").replace(/_/g, " ").replace(/\s+/g, " ").trim();
    }

    function formatValueByKey(key, value) {
        if (value === null || value === undefined || value === "") return "-";

        const humanKey = humanizeKey(key);
        const num = parseNumberMaybe(value);

        if (num !== null) {
            if (isCurrencyKey(humanKey) || isCurrencyKey(key)) {
                return formatRupiah(num);
            }
            if (Number.isInteger(num)) {
                return formatNumberID(num, 0);
            }
            return formatNumberID(num, 2);
        }

        return beautifyText(value);
    }

    function renderTable(rows) {
        tableHead.innerHTML = "";
        tableBody.innerHTML = "";

        const safeRows = Array.isArray(rows) ? rows : [];
        const cols = safeRows.length ? Object.keys(safeRows[0]) : [];

        const tr = document.createElement("tr");
        cols.forEach(c => {
            const th = document.createElement("th");
            th.textContent = humanizeKey(c);
            tr.appendChild(th);
        });
        tableHead.appendChild(tr);

        safeRows.forEach(r => {
            const trb = document.createElement("tr");
            cols.forEach(c => {
                const td = document.createElement("td");
                td.textContent = formatValueByKey(c, r[c]);
                trb.appendChild(td);
            });
            tableBody.appendChild(trb);
        });
    }

    function buildChart(rows) {
        const ctx = document.getElementById("resultChart");
        if (chartInstance) { chartInstance.destroy(); chartInstance = null; }

        const safeRows = Array.isArray(rows) ? rows : [];
        if (!safeRows.length) {
            chartHint.textContent = "Tidak ada data untuk chart.";
            return;
        }

        const keys = Object.keys(safeRows[0] || {});
        const dateKey = keys.find(isDateLikeKey);
        const numericKeys = keys.filter(k => safeRows.some(r => parseNumberMaybe(r[k]) !== null));

        if (!numericKeys.length) {
            chartHint.textContent = "Tidak ada kolom angka untuk chart.";
            return;
        }

        if (dateKey) {
            const yKey = numericKeys.find(k => k !== dateKey) || numericKeys[0];
            const labels = safeRows.map(r => String(r[dateKey]));
            const data = safeRows.map(r => parseNumberMaybe(r[yKey]) ?? 0);

            chartHint.textContent = `Line chart: ${humanizeKey(yKey)} vs ${humanizeKey(dateKey)}`;
            chartInstance = new Chart(ctx, {
                type: "line",
                data: {
                    labels,
                    datasets: [{
                        label: humanizeKey(yKey),
                        data,
                        borderColor: "#2563eb",
                        backgroundColor: "rgba(37,99,235,0.15)",
                        fill: true,
                        tension: 0.35
                    }]
                },
                options: { responsive: true, maintainAspectRatio: false }
            });
            return;
        }

        const yKey = numericKeys[0];
        const labelKey = keys.find(k => k !== yKey) || null;
        const labels = safeRows.slice(0, 20).map((r, i) => labelKey ? String(r[labelKey]) : `#${i+1}`);
        const data = safeRows.slice(0, 20).map(r => parseNumberMaybe(r[yKey]) ?? 0);

        chartHint.textContent = `Bar chart: ${humanizeKey(yKey)}` + (labelKey ? ` by ${humanizeKey(labelKey)}` : "");
        chartInstance = new Chart(ctx, {
            type: "bar",
            data: {
                labels,
                datasets: [{
                    label: humanizeKey(yKey),
                    data,
                    backgroundColor: "#2563eb"
                }]
            },
            options: { responsive: true, maintainAspectRatio: false }
        });
    }

    function pickBestNumericKey(keys) {
        const prefer = [
            "revenue","pendapatan","omzet","sales","total","grand_total","amount",
            "nilai","subtotal","total_price","total_harga","total_penjualan","total_pembayaran"
        ];
        const lowered = keys.map(k => [k, String(k).toLowerCase()]);
        for (const p of prefer) {
            const hit = lowered.find(([orig, low]) => low === p || low.includes(p));
            if (hit) return hit[0];
        }
        return null;
    }

    function extractTimeSeries(rows) {
        const safeRows = Array.isArray(rows) ? rows : [];
        if (!safeRows.length) return null;

        const keys = Object.keys(safeRows[0] || {});
        const dateKey = keys.find(isDateLikeKey);
        if (!dateKey) return null;

        const numericKeys = keys.filter(k => safeRows.some(r => parseNumberMaybe(r[k]) !== null));
        if (!numericKeys.length) return null;

        const bestY = pickBestNumericKey(numericKeys) || (numericKeys.find(k => k !== dateKey) || numericKeys[0]);

        const points = safeRows
            .map(r => ({ x: String(r[dateKey]), y: parseNumberMaybe(r[bestY]) }))
            .filter(p => p.x && typeof p.y === "number" && Number.isFinite(p.y));

        if (points.length < 5) return null;
        return { dateKey, yKey: bestY, points };
    }

    function linearRegressionForecast(points, daysAhead = 7) {
        const n = points.length;
        const xs = Array.from({length:n}, (_,i)=>i);
        const ys = points.map(p=>p.y);

        const sum = (arr) => arr.reduce((a,b)=>a+b,0);
        const xbar = sum(xs)/n;
        const ybar = sum(ys)/n;

        let num = 0, den = 0;
        for (let i=0;i<n;i++){
            num += (xs[i]-xbar)*(ys[i]-ybar);
            den += (xs[i]-xbar)*(xs[i]-xbar);
        }
        const b = den === 0 ? 0 : num/den;
        const a = ybar - b*xbar;

        let rss = 0;
        for (let i=0;i<n;i++){
            const yhat = a + b*xs[i];
            rss += (ys[i]-yhat)*(ys[i]-yhat);
        }
        const sigma = Math.sqrt(rss / Math.max(1, (n-2)));

        const forecast = [];
        for (let j=1;j<=daysAhead;j++){
            const x = (n-1)+j;
            const pred = a + b*x;
            const low = Math.max(0, pred - 1.6*sigma);
            const high = Math.max(0, pred + 1.6*sigma);
            forecast.push({ pred, low, high });
        }

        return { forecast };
    }

    function computeTrendLabel(lastN) {
        if (!lastN || lastN.length < 2) return { label:"Stabil", badge:"Stabil", kind:"stable" };
        const first = lastN[0];
        const last = lastN[lastN.length-1];
        const diff = last - first;
        const pct = (first === 0) ? 0 : (diff / first) * 100;
        if (pct > 6) return { label:`Naik ${pct.toFixed(0)}%`, badge:"Naik", kind:"up" };
        if (pct < -6) return { label:`Turun ${Math.abs(pct).toFixed(0)}%`, badge:"Turun", kind:"down" };
        return { label:"Stabil", badge:"Stabil", kind:"stable" };
    }

    function setBadge(el, kind, text) {
        el.textContent = text;
        el.style.borderRadius = "999px";
        el.style.padding = "8px 12px";
        el.style.fontSize = "12px";
        el.style.fontWeight = "700";
        el.style.border = "1px solid #e5e7eb";

        if (kind === "up") {
            el.style.background = "#ecfdf5";
            el.style.color = "#047857";
        } else if (kind === "down") {
            el.style.background = "#fef2f2";
            el.style.color = "#b91c1c";
        } else if (kind === "warn") {
            el.style.background = "#fffbeb";
            el.style.color = "#b45309";
        } else {
            el.style.background = "#ffffff";
            el.style.color = "#334155";
        }
    }

    function renderForecast(ts) {
        const ctx = document.getElementById("forecastChart");
        if (forecastChartInstance) { forecastChartInstance.destroy(); forecastChartInstance = null; }

        if (!ts) {
            forecastHint.textContent = "Forecast butuh data tren, misalnya pertanyaan per hari.";
            forecastConfidence.textContent = "-";
            forecastTotal7d.textContent = "-";
            forecastRange.textContent = "-";
            forecastTrend.textContent = "-";
            kpiConfidence.textContent = "-";
            return null;
        }

        const points = ts.points;
        const ys = points.map(p=>p.y);
        const recent = ys.slice(Math.max(0, ys.length-7));
        const trend = computeTrendLabel(recent);

        const n = points.length;
        let conf = "medium";
        if (n >= 30) conf = "high";
        if (n < 14) conf = "low";

        setBadge(forecastConfidence, conf === "high" ? "up" : (conf === "low" ? "warn" : "stable"), "Confidence: " + conf.toUpperCase());
        kpiConfidence.textContent = conf.toUpperCase();

        const model = linearRegressionForecast(points, 7);
        const total7 = model.forecast.reduce((a,b)=>a+(b.pred||0),0);
        const low7 = model.forecast.reduce((a,b)=>a+(b.low||0),0);
        const high7 = model.forecast.reduce((a,b)=>a+(b.high||0),0);

        const forecastIsMoney = isCurrencyKey(ts.yKey);

        forecastTotal7d.textContent = forecastIsMoney ? formatRupiah(total7) : formatNumberID(total7, 0);
        forecastRange.textContent = forecastIsMoney
            ? `${formatRupiah(low7)} – ${formatRupiah(high7)}`
            : `${formatNumberID(low7, 0)} – ${formatNumberID(high7, 0)}`;
        forecastTrend.textContent = trend.label;

        const labelsHist = points.map(p=>p.x);
        const labelsFut = model.forecast.map((_,i)=>`D+${i+1}`);
        const labels = [...labelsHist, ...labelsFut];
        const dataHist = points.map(p=>p.y);
        const dataFut = model.forecast.map(f=>Math.max(0, f.pred));

        forecastHint.textContent = `Forecast dibuat dari tren ${humanizeKey(ts.yKey)}.`;

        forecastChartInstance = new Chart(ctx, {
            type: "line",
            data: {
                labels,
                datasets: [
                    { label: `Historical (${humanizeKey(ts.yKey)})`, data: [...dataHist, ...Array(7).fill(null)], borderColor: "#2563eb", tension: 0.35 },
                    { label: `Forecast (${humanizeKey(ts.yKey)})`, data: [...Array(dataHist.length).fill(null), ...dataFut], borderColor: "#7c3aed", borderDash: [6,6], tension: 0.35 },
                ]
            },
            options: { responsive: true, maintainAspectRatio: false }
        });

        return { trend, conf, total7, low7, high7, forecastIsMoney };
    }

    function countKeywordHits(rows, keywords) {
        const text = JSON.stringify(rows || []).toLowerCase();
        return keywords.reduce((acc, k) => acc + (text.includes(k.toLowerCase()) ? 1 : 0), 0);
    }

    function renderRisks(rows, ts, forecastMeta) {
        const risks = [];
        const safeRows = Array.isArray(rows) ? rows : [];

        if (!safeRows.length) risks.push("Tidak ada data yang kembali. Cek pertanyaan, periode, atau modul yang dipilih.");
        if (safeRows.length > 0 && safeRows.length < 5) risks.push("Data masih sedikit. Insight tetap ada, tapi confidence lebih rendah.");
        if (forecastMeta?.trend?.kind === "down") risks.push("Tren terbaru menurun. Pertimbangkan reaktivasi pelanggan lama dan promo jangka pendek.");
        if (countKeywordHits(safeRows, ["belum bayar", "unpaid", "partial", "piutang"]) > 0) risks.push("Ada indikasi order atau transaksi yang belum lunas.");
        if (countKeywordHits(safeRows, ["pending", "in progress", "belum diambil"]) > 0) risks.push("Ada indikasi bottleneck operasional atau order tertunda.");

        riskList.innerHTML = risks.length
            ? risks.slice(0, 6).map(r => `<div class="ai-soft ai-text">${r}</div>`).join('')
            : '<div class="ai-text" style="color:#64748b;">-</div>';
    }

    function buildPromoActions(ts, forecastMeta) {
        const trendKind = forecastMeta?.trend?.kind || "stable";

        const actions = [
            {
                title: "Reaktivasi pelanggan lama",
                why: trendKind === "down" ? "Tren menurun, jadi channel tercepat adalah pelanggan yang sudah pernah order." : "Repeat order biasanya paling cepat dikonversi.",
                steps: ["Ambil pelanggan 30–60 hari tidak order", "Kirim WA personal + promo ringan", "Follow-up H+1 ke yang respon"],
                script: `Halo Kak 👋\nMau info promo minggu ini ya 😊\n✅ Diskon repeat order\n✅ Bonus finishing tertentu untuk order minimal tertentu\n\nKalau Kakak kirim file hari ini, kami bantu proses lebih cepat.\nMau saya bantu cek kebutuhan cetaknya?`
            },
            {
                title: "Bundling upsell",
                why: "Naikkan nilai transaksi rata-rata tanpa harus cari pelanggan baru.",
                steps: ["Buat paket Basic / Standard / Premium", "Tawarkan finishing / laminasi / cutting", "Tampilkan paket di kasir, WA, dan sosial media"],
                script: `Halo Kak 😊\nKalau cetak hari ini, ada paket bundling biar lebih hemat:\n⭐ Standard: Cetak + Finishing\n🔥 Premium: Cetak + Finishing + Bonus layanan tertentu\n\nKalau mau, saya bantu pilihkan paket yang paling cocok ya.`
            }
        ];

        bestWAScript = (trendKind === "down") ? actions[0].script : actions[1].script;
        return actions;
    }

    function renderPlaybook(rows, ts, forecastMeta) {
        const actions = buildPromoActions(ts, forecastMeta);
        playbookArea.innerHTML = actions.map(a => `
            <div class="ai-soft">
                <div class="ai-text" style="font-weight:700;">${a.title}</div>
                <div class="small-note" style="margin-top:4px;">${a.why}</div>
                <ul class="small-note" style="margin-top:8px;padding-left:18px;">
                    ${a.steps.map(s => `<li>${s}</li>`).join('')}
                </ul>
            </div>
        `).join('');
    }

    function renderOpportunityBoard(rows) {
        const safeRows = Array.isArray(rows) ? rows : [];
        const keys = safeRows.length ? Object.keys(safeRows[0]) : [];
        const numericKeys = keys.filter(k => safeRows.some(r => parseNumberMaybe(r[k]) !== null));
        const labelKey = keys.find(k => !numericKeys.includes(k));
        const mainValueKey = pickBestNumericKey(numericKeys) || numericKeys[0];

        if (!labelKey || !mainValueKey) {
            opportunityArea.innerHTML = '<div class="ai-soft ai-text">Belum ada peluang yang cukup jelas terbaca dari hasil ini.</div>';
            return;
        }

        const ranked = safeRows
            .map(r => ({
                label: String(r[labelKey] ?? "-"),
                value: parseNumberMaybe(r[mainValueKey]) ?? 0
            }))
            .filter(x => x.label !== "-" && x.value > 0)
            .sort((a,b) => b.value - a.value)
            .slice(0, 3);

        opportunityArea.innerHTML = ranked.length
            ? ranked.map((r, i) => `<div class="ai-soft ai-text">Top ${i+1}: ${beautifyText(r.label)} dengan nilai ${isCurrencyKey(mainValueKey) ? formatRupiah(r.value) : formatNumberID(r.value, 0)}.</div>`).join('')
            : '<div class="ai-soft ai-text">Belum ada peluang yang cukup jelas terbaca dari hasil ini.</div>';
    }

    function renderMonitoring() {
        const items = [
            "Pantau repeat order customer 30 hari terakhir",
            "Pantau order belum bayar atau pembayaran sebagian",
            "Pantau bottleneck produksi dan finishing",
            "Pantau bahan cepat habis atau stok rendah",
            "Pantau promo mana yang paling cepat menghasilkan transaksi"
        ];

        monitoringArea.innerHTML = items.map(t => `<div class="ai-soft ai-text">${t}</div>`).join('');
    }

    function generateSummaryFromRows(rows) {
        const safeRows = Array.isArray(rows) ? rows : [];
        if (!safeRows.length) return "Belum ada data yang cukup untuk diringkas.";

        if (safeRows.length === 1) {
            const keys = Object.keys(safeRows[0] || {});
            if (keys.length === 1) {
                const key = keys[0];
                return `${humanizeKey(key)} saat ini adalah ${formatValueByKey(key, safeRows[0][key])}.`;
            }
        }

        return `Data berhasil dibaca. Terdapat ${formatNumberID(safeRows.length, 0)} baris hasil yang bisa digunakan untuk melihat pola, tren, dan peluang.`;
    }

    function renderExecutiveSummary(rows, ts, forecastMeta, description) {
        const trend = forecastMeta?.trend || { badge:"Stabil", kind:"stable", label:"Stabil" };
        setBadge(trendBadge, trend.kind === "down" ? "warn" : trend.kind, trend.badge);

        execLine1.textContent = description || generateSummaryFromRows(rows);
        execLine2.textContent = ts
            ? `Tren terbaru ${humanizeKey(ts.yKey)} terlihat ${trend.label.toLowerCase()}.`
            : `Tren belum terbaca. Untuk forecast, coba pertanyaan seperti “penjualan per hari”.`;

        execLine3.textContent = (forecastMeta?.total7)
            ? `Prediksi 7 hari ke depan sekitar ${forecastMeta.forecastIsMoney ? formatRupiah(forecastMeta.total7) : formatNumberID(forecastMeta.total7, 0)}.`
            : `Rekomendasi cepat: jalankan 1 campaign WA dan 1 bundling upsell minggu ini.`;
    }

    async function runAnalysis({ silent = false, forcePrompt = null } = {}) {
        const rawQuestion = (questionEl.value || "").trim();
        if (!forcePrompt && !rawQuestion) {
            alert("Isi pertanyaan dulu.");
            return;
        }

        hideError();

        const question = forcePrompt || buildPrompt(rawQuestion);
        latestPrompt = question;

        btn.disabled = true;
        btn.style.opacity = "0.7";
        if (!silent) statusText.textContent = "Memproses...";

        const t0 = performance.now();

        try {
            const csrf = document.querySelector('meta[name="csrf-token"]')?.getAttribute("content");

            const res = await fetch("/ai/sales", {
                method: "POST",
                headers: {
                    "Content-Type": "application/json",
                    "Accept": "application/json",
                    ...(csrf ? {"X-CSRF-TOKEN": csrf} : {})
                },
                body: JSON.stringify({ question })
            });

            const data = await res.json();

            if (!res.ok || data.ok === false) {
                showError(data.message || "Terjadi kesalahan.", data.hint || "");
                statusText.textContent = data.message || "Gagal";
                return;
            }

            latestJson = data;

            const rows = Array.isArray(data.data) ? data.data : [];
            const cols = rows.length ? Object.keys(rows[0] || {}).length : 0;

            kpiRows.textContent = rows.length ? formatNumberID(rows.length, 0) : "0";
            kpiCols.textContent = cols ? formatNumberID(cols, 0) : "0";
            kpiFreshness.textContent = "LIVE";

            let totalText = "-";
            if (rows.length === 1) {
                const keys = Object.keys(rows[0] || {});
                if (keys.length === 1) {
                    totalText = formatValueByKey(keys[0], rows[0][keys[0]]);
                }
            }
            kpiTotal.textContent = totalText;

            const t1 = performance.now();
            kpiMs.textContent = Math.round(t1 - t0) + " ms";

            const niceDescription = beautifyText(data.description || "");
            answerText.textContent = niceDescription || generateSummaryFromRows(rows);

            renderTable(rows);
            buildChart(rows);

            const ts = extractTimeSeries(rows);
            const forecastMeta = renderForecast(ts);
            renderExecutiveSummary(rows, ts, forecastMeta, niceDescription);
            renderRisks(rows, ts, forecastMeta);
            renderPlaybook(rows, ts, forecastMeta);
            renderOpportunityBoard(rows);
            renderMonitoring();

            execArea.classList.remove("hidden");
            resultArea.classList.remove("hidden");

            lastUpdatedText.textContent = "Terakhir dianalisa: " + new Date().toLocaleString("id-ID");
            if (!silent) statusText.textContent = "Selesai";

            restartAutoRefresh();
        } catch (err) {
            console.error(err);
            showError("Gagal membaca response AI.", "Periksa endpoint /ai/sales dan log Laravel.");
            statusText.textContent = "Gagal";
        } finally {
            btn.disabled = false;
            btn.style.opacity = "1";
        }
    }

    btn.addEventListener("click", () => runAnalysis());
    autoRefreshEl.addEventListener("change", restartAutoRefresh);
});
</script>
@endsection