<?php

namespace App\Services;

use Illuminate\Support\Facades\Http;

class MarketInsightService
{
    public function getInsights(): array
    {
        $geo = strtoupper((string) env('AI_MARKET_GEO', 'ID'));

        $google = $this->fetchGoogleTrends($geo);
        $meta = $this->fetchMetaSignals();

        $signals = $google['signals'] ?? [];
        $recommendations = $this->buildRecommendations($signals);
        $summary = $this->buildSummary($google);

        return [
            'geo' => $geo,
            'google' => $google,
            'meta' => $meta,
            'summary' => $summary,
            'recommendations' => $recommendations,
            'updated_at' => now()->format('d M Y H:i'),
        ];
    }

    private function fetchGoogleTrends(string $geo): array
    {
        $url = 'https://trends.google.com/trending/rss?geo=' . urlencode($geo);

        try {
            $response = Http::connectTimeout(8)
                ->timeout(15)
                ->retry(0, 0)
                ->get($url);

            if (!$response->successful()) {
                return [
                    'source' => 'Google Trends',
                    'status' => 'error',
                    'message' => 'Tidak bisa mengambil data tren Google saat ini.',
                    'raw_topics' => [],
                    'signals' => $this->fallbackSeasonalSignals(),
                ];
            }

            $xml = @simplexml_load_string($response->body());

            if (!$xml || !isset($xml->channel->item)) {
                return [
                    'source' => 'Google Trends',
                    'status' => 'empty',
                    'message' => 'Data tren Google tidak tersedia.',
                    'raw_topics' => [],
                    'signals' => $this->fallbackSeasonalSignals(),
                ];
            }

            $rawTopics = [];
            foreach ($xml->channel->item as $item) {
                $rawTopics[] = [
                    'title' => trim((string) ($item->title ?? '')),
                    'link' => trim((string) ($item->link ?? '')),
                    'pubDate' => trim((string) ($item->pubDate ?? '')),
                ];

                if (count($rawTopics) >= 18) {
                    break;
                }
            }

            $signals = [];
            foreach ($rawTopics as $topic) {
                $signal = $this->mapTopicToSignal($topic);
                if (!$signal) {
                    continue;
                }

                $key = strtolower((string) ($signal['title'] ?? ''));
                if (!isset($signals[$key])) {
                    $signals[$key] = $signal;
                }
            }

            if (empty($signals)) {
                return [
                    'source' => 'Google Trends',
                    'status' => 'filtered',
                    'message' => 'Tren publik hari ini didominasi topik umum yang tidak cukup nyambung dengan bisnis percetakan, jadi sistem menampilkan sinyal pasar yang lebih relevan untuk owner.',
                    'raw_topics' => $rawTopics,
                    'signals' => $this->fallbackSeasonalSignals(),
                ];
            }

            return [
                'source' => 'Google Trends',
                'status' => 'ok',
                'message' => 'Hanya tren yang relevan ke bisnis percetakan yang ditampilkan agar owner tidak terganggu topik umum yang tidak berguna.',
                'raw_topics' => $rawTopics,
                'signals' => array_values(array_slice($signals, 0, 6)),
            ];
        } catch (\Throwable $e) {
            return [
                'source' => 'Google Trends',
                'status' => 'error',
                'message' => 'Tidak bisa mengambil data tren Google saat ini, jadi sistem memakai sinyal pasar fallback yang lebih relevan untuk bisnis percetakan.',
                'raw_topics' => [],
                'signals' => $this->fallbackSeasonalSignals(),
            ];
        }
    }

    private function mapTopicToSignal(array $topic): ?array
    {
        $title = strtolower((string) ($topic['title'] ?? ''));
        $link = (string) ($topic['link'] ?? '');

        $catalog = [
            [
                'title' => 'Momentum wisuda dan kelulusan',
                'type' => 'Momentum musiman',
                'keywords' => ['wisuda', 'graduation', 'kelulusan', 'pelepasan', 'yudisium'],
                'reason' => 'Topik wisuda biasanya mendorong kebutuhan banner, backdrop, stiker, foto print, dan merchandise acara.',
                'products' => ['Banner wisuda', 'Backdrop', 'Stiker nama', 'Cetak foto', 'Kartu ucapan'],
                'strategy' => 'Dorong paket wisuda cepat jadi, fokus ke promo komunitas sekolah, kampus, dan keluarga.',
            ],
            [
                'title' => 'Momentum sekolah, kampus, dan PPDB',
                'type' => 'Pendidikan',
                'keywords' => ['sekolah', 'kampus', 'ppdb', 'snpmb', 'snbt', 'snbp', 'mahasiswa', 'ujian'],
                'reason' => 'Topik pendidikan biasanya relevan untuk map, brosur, banner sekolah, print dokumen, dan media informasi.',
                'products' => ['Brosur sekolah', 'Banner PPDB', 'Map dokumen', 'Print tugas', 'Poster informasi'],
                'strategy' => 'Siapkan promo print dokumen, brosur sekolah, dan paket materi promosi untuk institusi pendidikan.',
            ],
            [
                'title' => 'Momentum UMKM dan promosi usaha',
                'type' => 'Usaha lokal',
                'keywords' => ['umkm', 'usaha', 'jualan', 'promo', 'diskon', 'bisnis', 'brand', 'branding', 'toko'],
                'reason' => 'Topik usaha dan promo biasanya nyambung dengan kebutuhan banner toko, brosur, stiker logo, dan kartu nama.',
                'products' => ['Banner toko', 'Brosur promo', 'Stiker logo', 'Kartu nama', 'Standing banner'],
                'strategy' => 'Dorong bundling branding usaha kecil: banner, stiker, kartu nama, dan brosur dalam satu paket.',
            ],
            [
                'title' => 'Momentum event, turnamen, dan komunitas',
                'type' => 'Event',
                'keywords' => ['event', 'konser', 'festival', 'turnamen', 'kompetisi', 'komunitas', 'seminar', 'workshop'],
                'reason' => 'Topik event biasanya mendorong kebutuhan backdrop, tiket, gelang event, poster, dan media promosi acara.',
                'products' => ['Backdrop event', 'Poster acara', 'Tiket', 'Gelang event', 'X-banner'],
                'strategy' => 'Fokus ke paket event cepat produksi untuk panitia: backdrop, poster, tiket, dan media branding acara.',
            ],
            [
                'title' => 'Momentum Ramadan dan Lebaran',
                'type' => 'Musiman',
                'keywords' => ['ramadan', 'lebaran', 'idul fitri', 'mudik', 'bukber', 'takjil'],
                'reason' => 'Topik Ramadan dan Lebaran relevan untuk banner promo, poster menu, spanduk toko, dan materi promosi musiman.',
                'products' => ['Spanduk promo', 'Poster menu', 'Banner toko', 'Stiker kemasan', 'Voucher promo'],
                'strategy' => 'Dorong promo musiman untuk toko, kuliner, dan UMKM dengan desain cepat dan harga bundling.',
            ],
            [
                'title' => 'Momentum politik dan kampanye lokal',
                'type' => 'Kampanye',
                'keywords' => ['pemilu', 'pilkada', 'caleg', 'debat', 'kampanye'],
                'reason' => 'Topik politik biasanya berhubungan dengan kebutuhan spanduk, banner, kaos kampanye, dan stiker.',
                'products' => ['Spanduk kampanye', 'Banner', 'Stiker', 'Poster', 'Brosur'],
                'strategy' => 'Jika pasar lokal sedang ramai kegiatan politik, siapkan paket kampanye dengan produksi cepat dan volume besar.',
            ],
        ];

        foreach ($catalog as $item) {
            foreach ($item['keywords'] as $keyword) {
                if (str_contains($title, strtolower($keyword))) {
                    return [
                        'title' => $item['title'],
                        'type' => $item['type'],
                        'reason' => $item['reason'],
                        'products' => $item['products'],
                        'strategy' => $item['strategy'],
                        'source_title' => (string) ($topic['title'] ?? ''),
                        'link' => $link,
                    ];
                }
            }
        }

        return null;
    }

    private function fallbackSeasonalSignals(): array
    {
        $month = (int) now()->format('n');

        $map = [
            1 => [
                [
                    'title' => 'Awal tahun: branding dan materi promosi usaha',
                    'type' => 'Seasonal fallback',
                    'reason' => 'Awal tahun biasanya banyak usaha menyiapkan banner toko, brosur, dan materi promo baru.',
                    'products' => ['Banner toko', 'Brosur', 'Stiker branding', 'Kartu nama'],
                    'strategy' => 'Tawarkan paket branding awal tahun untuk UMKM dan toko baru.',
                    'source_title' => 'Kalender momentum bisnis awal tahun',
                    'link' => '',
                ],
            ],
            2 => [
                [
                    'title' => 'Musim event komunitas dan promosi lokal',
                    'type' => 'Seasonal fallback',
                    'reason' => 'Bulan ini biasanya cocok untuk event komunitas, gathering, dan promosi usaha lokal.',
                    'products' => ['Poster event', 'Backdrop', 'X-banner', 'Flyer'],
                    'strategy' => 'Tawarkan paket promosi komunitas dan event dengan pengerjaan cepat.',
                    'source_title' => 'Kalender momentum event lokal',
                    'link' => '',
                ],
            ],
            3 => [
                [
                    'title' => 'Persiapan Ramadan dan promo usaha musiman',
                    'type' => 'Seasonal fallback',
                    'reason' => 'Menjelang Ramadan, banyak toko, kuliner, dan UMKM mulai menyiapkan banner promo dan materi kampanye penjualan.',
                    'products' => ['Banner promo', 'Poster menu', 'Spanduk toko', 'Stiker kemasan'],
                    'strategy' => 'Dorong promo paket Ramadan untuk toko dan kuliner lokal.',
                    'source_title' => 'Kalender momentum Ramadan',
                    'link' => '',
                ],
            ],
            4 => [
                [
                    'title' => 'Momentum Ramadan, Lebaran, dan mudik',
                    'type' => 'Seasonal fallback',
                    'reason' => 'Periode ini kuat untuk promosi toko, parcel, kuliner, dan kebutuhan materi cetak musiman.',
                    'products' => ['Banner promo', 'Voucher', 'Poster', 'Stiker parcel'],
                    'strategy' => 'Dorong promo cepat untuk usaha kuliner, toko oleh-oleh, dan UMKM.',
                    'source_title' => 'Kalender momentum Lebaran',
                    'link' => '',
                ],
            ],
            5 => [
                [
                    'title' => 'Kelulusan, wisuda, dan promosi sekolah',
                    'type' => 'Seasonal fallback',
                    'reason' => 'Periode kelulusan biasanya meningkatkan kebutuhan backdrop, banner, dan cetak foto.',
                    'products' => ['Backdrop wisuda', 'Banner sekolah', 'Cetak foto', 'Stiker nama'],
                    'strategy' => 'Target sekolah, kampus, dan keluarga dengan paket wisuda instan.',
                    'source_title' => 'Kalender momentum kelulusan',
                    'link' => '',
                ],
            ],
            6 => [
                [
                    'title' => 'PPDB, sekolah baru, dan dokumen pendidikan',
                    'type' => 'Seasonal fallback',
                    'reason' => 'Periode masuk sekolah sangat relevan untuk banner PPDB, brosur, dan cetak dokumen.',
                    'products' => ['Banner PPDB', 'Brosur sekolah', 'Map dokumen', 'Poster'],
                    'strategy' => 'Dorong promo institusi pendidikan dan layanan print dokumen cepat.',
                    'source_title' => 'Kalender momentum PPDB',
                    'link' => '',
                ],
            ],
            7 => [
                [
                    'title' => 'Usaha baru semester dua dan promosi toko',
                    'type' => 'Seasonal fallback',
                    'reason' => 'Pertengahan tahun sering dipakai usaha untuk memperbarui materi promosi dan branding toko.',
                    'products' => ['Banner toko', 'Stiker logo', 'Kartu nama', 'Flyer promo'],
                    'strategy' => 'Tawarkan refresh branding untuk toko dan UMKM lokal.',
                    'source_title' => 'Kalender momentum promosi usaha',
                    'link' => '',
                ],
            ],
            8 => [
                [
                    'title' => 'Event Agustusan dan kegiatan komunitas',
                    'type' => 'Seasonal fallback',
                    'reason' => 'Bulan kemerdekaan biasanya ramai event RT, sekolah, turnamen, dan lomba.',
                    'products' => ['Spanduk lomba', 'Banner acara', 'Poster', 'Piagam'],
                    'strategy' => 'Dorong paket event Agustusan untuk komunitas, sekolah, dan panitia lokal.',
                    'source_title' => 'Kalender momentum Agustusan',
                    'link' => '',
                ],
            ],
            9 => [
                [
                    'title' => 'Promo UMKM dan aktivasi penjualan lokal',
                    'type' => 'Seasonal fallback',
                    'reason' => 'Menjelang akhir tahun, banyak usaha mulai menggenjot promo dan aktivasi penjualan.',
                    'products' => ['Banner promo', 'Brosur', 'Stiker promo', 'Standing banner'],
                    'strategy' => 'Tawarkan paket promo toko dan UMKM yang fokus ke traffic cepat.',
                    'source_title' => 'Kalender momentum promo usaha',
                    'link' => '',
                ],
            ],
            10 => [
                [
                    'title' => 'Pameran, expo, dan event komunitas',
                    'type' => 'Seasonal fallback',
                    'reason' => 'Bulan ini sering cocok untuk event, expo, dan promosi komunitas atau bisnis.',
                    'products' => ['Backdrop', 'Booth banner', 'Flyer', 'Poster'],
                    'strategy' => 'Dorong paket event dan expo untuk komunitas, sekolah, dan bisnis.',
                    'source_title' => 'Kalender momentum expo',
                    'link' => '',
                ],
            ],
            11 => [
                [
                    'title' => 'Event akhir tahun dan kebutuhan promosi besar',
                    'type' => 'Seasonal fallback',
                    'reason' => 'Menjelang akhir tahun biasanya banyak acara kantor, sekolah, dan promosi bisnis.',
                    'products' => ['Backdrop', 'Banner promo', 'Poster acara', 'Souvenir print'],
                    'strategy' => 'Tawarkan paket akhir tahun untuk acara perusahaan, komunitas, dan sekolah.',
                    'source_title' => 'Kalender momentum akhir tahun',
                    'link' => '',
                ],
            ],
            12 => [
                [
                    'title' => 'Natal, tahun baru, dan promo penutup tahun',
                    'type' => 'Seasonal fallback',
                    'reason' => 'Periode akhir tahun sangat kuat untuk promosi toko, event, dan materi branding penutup tahun.',
                    'products' => ['Banner promo', 'Poster event', 'Voucher', 'Stiker kemasan'],
                    'strategy' => 'Dorong promo closing year dan event celebration dengan pengerjaan cepat.',
                    'source_title' => 'Kalender momentum akhir tahun',
                    'link' => '',
                ],
            ],
        ];

        $signals = $map[$month] ?? [];
        $signals[] = [
            'title' => 'Branding usaha lokal yang cepat jadi',
            'type' => 'Fallback bisnis',
            'reason' => 'Saat tren publik tidak relevan, owner tetap bisa mendorong produk yang paling umum dibutuhkan pasar lokal.',
            'products' => ['Banner toko', 'Brosur', 'Stiker logo', 'Kartu nama'],
            'strategy' => 'Fokus ke paket branding UMKM yang mudah dijual dan cepat diproduksi.',
            'source_title' => 'Sinyal fallback bisnis percetakan',
            'link' => '',
        ];

        return array_slice($signals, 0, 4);
    }

    private function buildRecommendations(array $signals): array
    {
        if (empty($signals)) {
            return [
                'Hari ini belum ada tren pasar yang benar-benar relevan. Fokuskan promosi ke paket yang paling cepat jadi dan margin-nya sehat.',
                'Dorong paket branding usaha lokal: banner toko, brosur, stiker logo, dan kartu nama.',
                'Gunakan data order internal untuk menentukan produk yang paling sering dibeli, lalu jadikan promo harian.',
            ];
        }

        $recommendations = [];

        foreach ($signals as $signal) {
            $title = (string) ($signal['title'] ?? '');
            $strategy = (string) ($signal['strategy'] ?? '');
            $products = $signal['products'] ?? [];

            if ($title !== '') {
                $recommendations[] = $title . ': ' . $strategy;
            }

            if (is_array($products) && !empty($products)) {
                $recommendations[] = 'Produk yang bisa didorong sekarang: ' . implode(', ', array_slice($products, 0, 4)) . '.';
            }
        }

        $recommendations[] = 'Cocokkan sinyal pasar ini dengan data order internal agar promo yang dijalankan tidak hanya ramai, tapi juga benar-benar laku.';
        $recommendations[] = 'Pakai CTA yang jelas di WhatsApp, status, dan feed: harga cepat, deadline jelas, dan contoh hasil print nyata.';

        return array_values(array_unique($recommendations));
    }

    private function buildSummary(array $google): string
    {
        $status = (string) ($google['status'] ?? '');
        $signals = $google['signals'] ?? [];

        if ($status === 'ok' && !empty($signals)) {
            return 'Sistem hanya menampilkan tren yang relevan untuk bisnis percetakan, lalu menerjemahkannya menjadi peluang produk dan strategi marketing yang lebih praktis untuk owner.';
        }

        if ($status === 'filtered') {
            return 'Tren publik hari ini kebanyakan topik umum, jadi sistem menggantinya dengan sinyal pasar yang lebih masuk akal untuk bisnis percetakan dan promosi usaha lokal.';
        }

        return 'Saat data tren publik tidak stabil, sistem tetap menampilkan sinyal fallback yang lebih aman dipakai owner untuk menentukan arah promosi.';
    }

    private function fetchMetaSignals(): array
    {
        $token = (string) env('META_GRAPH_ACCESS_TOKEN', '');
        $pageId = (string) env('META_PAGE_ID', '');

        if ($token === '' || $pageId === '') {
            return [
                'source' => 'Meta',
                'status' => 'disabled',
                'message' => 'Meta belum aktif. Isi META_GRAPH_ACCESS_TOKEN dan META_PAGE_ID jika ingin membaca sinyal tambahan dari Meta.',
                'topics' => [],
            ];
        }

        try {
            $response = Http::connectTimeout(8)
                ->timeout(15)
                ->retry(0, 0)
                ->withToken($token)
                ->get("https://graph.facebook.com/v23.0/{$pageId}", [
                    'fields' => 'name',
                ]);

            if (!$response->successful()) {
                return [
                    'source' => 'Meta',
                    'status' => 'error',
                    'message' => 'Gagal terhubung ke Meta API.',
                    'topics' => [],
                ];
            }

            return [
                'source' => 'Meta',
                'status' => 'ok',
                'message' => 'Koneksi Meta aktif, tetapi insight khusus tren masih perlu endpoint dan izin tambahan.',
                'topics' => [],
            ];
        } catch (\Throwable $e) {
            return [
                'source' => 'Meta',
                'status' => 'error',
                'message' => 'Gagal terhubung ke Meta API.',
                'topics' => [],
            ];
        }
    }
}
