<?php
declare(strict_types=1);

/**
 * @return array{name:string,text:string,reply_name:string,reply_text:string,followup_text:string,followup_reply:string}
 */
function comment_dialog(
    string $name,
    string $text,
    string $seller,
    string $reply,
    string $followupText = '',
    string $followupReply = ''
): array {
    $replyText = trim($reply);
    if ($replyText !== '' && !str_contains($replyText, '@')) {
        $replyText = '@' . $name . ' ' . $replyText;
    }
    $fuReply = trim($followupReply);
    if ($fuReply !== '' && !str_contains($fuReply, '@')) {
        $fuReply = '@' . $name . ' ' . $fuReply;
    }
    return [
        'name' => $name,
        'text' => $text,
        'reply_name' => $seller,
        'reply_text' => $replyText,
        'followup_text' => trim($followupText),
        'followup_reply' => $fuReply,
    ];
}

/**
 * @return list<array{name:string,text:string,reply_name:string,reply_text:string,followup_text:string,followup_reply:string}>
 */
function generate_local_comments(string $title, string $category, string $description, int $count = 3, string $sellerName = 'Satıcı'): array
{
    $title = trim($title);
    $description = trim($description);
    $hay = mb_strtolower($title . ' ' . $description . ' ' . $category);
    $short = $title !== '' ? $title : 'ürün';
    $seller = trim($sellerName) !== '' ? trim($sellerName) : 'Satıcı';

    $isTech = (bool) preg_match('/iphone|samsung|xiaomi|huawei|oppo|telefon|telefonu|laptop|notebook|tablet|airpods|kulakl[ıi]k|bilgisayar|monitör|monitor|klavye|mouse|playstation|xbox|nintendo|tv|televizyon|kamera|drone|şarj|sarj|powerbank|ssd|hdd|gpu|ekran|akıllı|akilli|watch|saat|macbook|ipad|android|ios/ui', $hay);
    $isHardware = !$isTech && (bool) preg_match('/kap[ıi]|kolu|menteşe|vida|raf|dolap|mobilya|lamba|priz|musluk|vana|hortum|anahtar|kilit|pencere|perde|halı|masa|sandalye|yatak/ui', $hay);
    $isOil = (bool) preg_match('/zeytin|yağ/ui', $hay) || $category === 'zeytinyagi';
    $isHoney = (bool) preg_match('/bal|reçel|pekmez/ui', $hay) || $category === 'bal-recel';
    $isSpice = (bool) preg_match('/baharat|kekik|sumak|nane|kimyon/ui', $hay) || $category === 'baharat';
    $isNut = (bool) preg_match('/fındık|ceviz|badem|kuruyemiş/ui', $hay) || $category === 'kuruyemis';
    $isFood = !$isTech && !$isHardware && ($isOil || $isHoney || $isSpice || $isNut || in_array($category, ['bal-recel', 'zeytinyagi', 'baharat', 'kuruyemis', 'cay-bitki', 'sut-urun'], true));

    // Tek soru-cevap
    $singles = [
        comment_dialog('Murat', $short . ' stokta var mı, hemen alabilir miyim?', $seller, 'evet stokta, siparişiniz sonrası aynı gün hazırlıyoruz.'),
        comment_dialog(
            'Elif Hanım',
            'Aldım, çok memnun kaldım. Teşekkürler.',
            $seller,
            $isFood ? 'teşekkür ederiz, afiyet olsun.' : ($isTech ? 'teşekkür ederiz, hayırlı olsun, güzel kullanımlar.' : 'teşekkür ederiz, hayırlı olsun.')
        ),
    ];

    // İki tur: soru → cevap → devam sorusu → cevap (insancıl, ürünle ilgili)
    $doubles = [
        comment_dialog(
            'Selin',
            'Kargo ne zaman çıkar acaba?',
            $seller,
            'genelde aynı gün veya ertesi iş günü kargoya veriyoruz.',
            'Peki kargo ücreti var mı, yoksa ücretsiz mi?',
            'şu an ücretsiz kargo ile gönderiyoruz, ekstra ücret yok.'
        ),
        comment_dialog(
            'Canan',
            'Ödeme nasıl oluyor, kredi kartı geçiyor mu?',
            $seller,
            'ödeme havale / EFT ile; kart ile ödeme almıyoruz.',
            'Siparişten sonra IBAN bilgisi nasıl geliyor?',
            'sipariş sonrası ekranda ve bilgilendirmede IBAN net görünüyor.'
        ),
    ];

    if ($isTech) {
        $singles = array_merge($singles, [
            comment_dialog('Zeynep', 'Kutu içeriği tam mı geliyor (şarj, kılıf vs.)?', $seller, 'ilandaki aksesuar listesiyle birlikte gönderiyoruz.'),
            comment_dialog('Caner', 'Renk / model fotoğraftakiyle aynı mı?', $seller, 'evet, seçtiğiniz model ve renk birebir gönderilir.'),
        ]);
        $doubles = array_merge($doubles, [
            comment_dialog(
                'Hasan Ege',
                $short . ' orijinal / sıfır mı?',
                $seller,
                'evet, ilanda yazdığımız şekilde orijinal ve belirtilen durumda.',
                'Peki faturası / kutusu da geliyor mu?',
                'kutusuyla gönderiyoruz; fatura durumunu ilandan veya yazarak netleştirebilirsiniz.'
            ),
            comment_dialog(
                'Burak',
                'Pil sağlığı ve garanti durumu nasıl?',
                $seller,
                'pil ve garanti bilgisini ilanda paylaşıyoruz; sipariş öncesi de sorabilirsiniz.',
                'Teslimde sorun çıkarsa ne yapıyorsunuz?',
                'kargo hasarı veya uyumsuzluk olursa önce yazın, çözüm için yardımcı oluyoruz.'
            ),
            comment_dialog(
                'Ayşe',
                'Kargo güvenli paketleniyor mu, elektronik için?',
                $seller,
                'evet, darbeye dayanıklı şekilde ekstra korumalı paketliyoruz.',
                'Kaç günde elime ulaşır yaklaşık?',
                'kargoya verdikten sonra genelde 1–3 iş günü içinde ulaşıyor.'
            ),
        ]);
    } elseif ($isHardware) {
        $singles = array_merge($singles, [
            comment_dialog('Fatma', 'Ambalajı sağlam geliyor mu?', $seller, 'evet, ezilmeye karşı özenle paketliyoruz.'),
            comment_dialog('Zeynep', 'Rengi fotoğraftaki gibi mi geliyor?', $seller, 'fotoğrafla aynı; ışığa göre çok hafif ton farkı olabilir.'),
        ]);
        $doubles = array_merge($doubles, [
            comment_dialog(
                'Hasan Ege',
                $short . ' ölçüleri tam mı yazıldığı gibi?',
                $seller,
                'evet, ilandaki ölçülerle aynı gönderiyoruz.',
                'Montaj için vida seti ürünle birlikte geliyor mu?',
                'evet, vida / montaj seti paketin içinde oluyor.'
            ),
            comment_dialog(
                'Burak',
                'Montajı zor mu, tek başıma yapabilir miyim?',
                $seller,
                'çoğu kişi tek başına rahat kuruyor; basit bir işlem.',
                'Kurulum videosu veya şema var mı?',
                'gerekirse sipariş sonrası kısa anlatım / şema paylaşabiliyoruz.'
            ),
        ]);
    } elseif ($isOil) {
        $singles = array_merge($singles, [
            comment_dialog('Fatma', 'Ambalajı sağlam geliyor mu?', $seller, 'cam şişe için ekstra korumalı paketliyoruz.'),
        ]);
        $doubles = array_merge($doubles, [
            comment_dialog(
                'Ayşe Doğal',
                'Soğuk sıkım mı gerçekten?',
                $seller,
                'evet, erken hasat soğuk sıkım olarak hazırlıyoruz.',
                'Asit oranı düşük mü, yemeklik mi?',
                'sızma kalitesinde, düşük asitli; günlük kullanım için uygundur.'
            ),
            comment_dialog(
                'Mehmet Köy',
                'Cam şişede mi geliyor?',
                $seller,
                'evet cam şişede, kargo için ekstra sargılı.',
                'Saklama öneriniz nedir, buzdolabına koyayım mı?',
                'serin ve karanlık yer yeterli; buzdolabı şart değil.'
            ),
            comment_dialog(
                'Zeynep',
                'Tadı çok acı / yakıcı mı?',
                $seller,
                'erken hasatta hafif yakıcılık olabilir, bu doğallığın işareti.',
                'Salata ve kahvaltı için uygun mu?',
                'evet, özellikle salata ve kahvaltıda çok tercih ediliyor.'
            ),
        ]);
    } elseif ($isHoney) {
        $singles = array_merge($singles, [
            comment_dialog('Fatma', 'Kavanoz sağlam geliyor mu?', $seller, 'evet, kırılmaya karşı özenle paketliyoruz.'),
        ]);
        $doubles = array_merge($doubles, [
            comment_dialog(
                'Ayşe Doğal',
                'Kristalize oluyor mu zamanla?',
                $seller,
                'doğal baldır; zamanla kristalize olabilir, bu normaldir.',
                'Kristalize olursa nasıl yumuşatabilirim?',
                'ılık su banyosunda kavanozu ısıtarak eski kıvamına gelebilir.'
            ),
            comment_dialog(
                'Mehmet Köy',
                'Şekersiz / katkısız mı emin miyiz?',
                $seller,
                'evet, katkısız köy üretimi; şeker eklemiyoruz.',
                'Çocuklara kahvaltıda verebilir miyiz?',
                '1 yaş üstü için kahvaltıda az miktarda tercih edilebilir.'
            ),
        ]);
    } elseif ($isFood) {
        $singles = array_merge($singles, [
            comment_dialog('Fatma', 'Ambalajı sağlam geliyor mu?', $seller, 'evet, özenle paketliyoruz.'),
            comment_dialog('Hasan Ege', 'Gramajı tam geliyor mu?', $seller, 'evet, tartılı net gramaj gönderiyoruz.'),
        ]);
        $doubles = array_merge($doubles, [
            comment_dialog(
                'Ayşe Doğal',
                'Gerçekten doğal / köy ürünü mü?',
                $seller,
                'evet, kendi üretimimiz veya güvendiğimiz yerel tedarikten.',
                'Son kullanma / tazelik durumu nasıl?',
                'taze partiden gönderiyoruz; tarih bilgisi pakette yer alır.'
            ),
            comment_dialog(
                'Zeynep',
                $short . ' tadı yoğun mu, bayatlık olur mu?',
                $seller,
                'taze gönderiyoruz; yoğun ve doğal aroması var.',
                'Nasıl saklamamı önerirsiniz?',
                'serin, kuru ve kapalı yerde saklamanız yeterli.'
            ),
            comment_dialog(
                'Murat',
                'Siparişten ne kadar sonra kargoya veriliyor?',
                $seller,
                'genelde aynı gün veya ertesi gün çıkıyor.',
                'Şehir dışına da sorunsuz gidiyor mu?',
                'evet, Türkiye geneline kargo ile gönderiyoruz.'
            ),
        ]);
    } else {
        $singles = array_merge($singles, [
            comment_dialog('Mehmet Köy', 'Fotoğraftakiyle aynı mı geliyor?', $seller, 'evet, fotoğraftaki ürün gönderilir.'),
            comment_dialog('Fatma', 'Ambalajı sağlam geliyor mu?', $seller, 'evet, özenle paketliyoruz.'),
        ]);
        $doubles = array_merge($doubles, [
            comment_dialog(
                'Ayşe Doğal',
                $short . ' için biraz daha detay verebilir misiniz?',
                $seller,
                'tabii — kullanım / içerik konusunda sormak istediğinizi yazın.',
                'Stok net mi, sipariş verirsem kesin çıkar mı?',
                'evet stokta; sipariş sonrası hemen hazırlığa alıyoruz.'
            ),
            comment_dialog(
                'Selin',
                'Ürün elime kaç günde ulaşır yaklaşık?',
                $seller,
                'kargoya verdikten sonra genelde 1–3 iş günü sürüyor.',
                'Hasarlı gelirse ne yapmalıyım?',
                'fotoğrafla yazmanız yeterli; hızlıca çözüm üretiyoruz.'
            ),
        ]);
    }

    shuffle($singles);
    shuffle($doubles);

    $count = max(1, min(5, $count));
    $doubleCount = $count >= 2 ? (int) ceil($count / 2) : ($count === 1 && random_int(0, 1) === 1 ? 1 : 0);
    $doubleCount = min($doubleCount, count($doubles), $count);
    $singleCount = $count - $doubleCount;

    $out = array_slice($doubles, 0, $doubleCount);
    $out = array_merge($out, array_slice($singles, 0, $singleCount));
    shuffle($out);
    return $out;
}

/** Kota / rate-limit hatalarında sıradaki anahtara geç. */
function gemini_should_try_next_key(int $httpCode, string $body): bool
{
    if (in_array($httpCode, [429, 503], true)) {
        return true;
    }
    $lower = mb_strtolower($body);
    foreach ([
        'resource_exhausted',
        'quota',
        'rate limit',
        'rate_limit',
        'too many requests',
        'exceeded',
        'limit: 0',
    ] as $needle) {
        if (str_contains($lower, $needle)) {
            return true;
        }
    }
    // Geçersiz / yasaklı anahtar → sonraki dene
    if (in_array($httpCode, [401, 403], true)) {
        return true;
    }
    return false;
}

/**
 * @return array{ok:bool, code:int, body:string}
 */
function gemini_http_post(string $url, string $payload): array
{
    if (function_exists('curl_init')) {
        $ch = curl_init($url);
        curl_setopt_array($ch, [
            CURLOPT_POST => true,
            CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
            CURLOPT_POSTFIELDS => $payload,
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_TIMEOUT => 25,
        ]);
        $raw = curl_exec($ch);
        $code = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
        curl_close($ch);
        if ($raw === false) {
            return ['ok' => false, 'code' => 0, 'body' => ''];
        }
        return ['ok' => $code > 0 && $code < 400, 'code' => $code, 'body' => (string) $raw];
    }

    $ctx = stream_context_create([
        'http' => [
            'method' => 'POST',
            'header' => "Content-Type: application/json\r\n",
            'content' => $payload,
            'timeout' => 25,
            'ignore_errors' => true,
        ],
    ]);
    $raw = @file_get_contents($url, false, $ctx);
    if ($raw === false) {
        return ['ok' => false, 'code' => 0, 'body' => ''];
    }
    $code = 200;
    if (isset($http_response_header[0]) && preg_match('/\s(\d{3})\s/', (string) $http_response_header[0], $m)) {
        $code = (int) $m[1];
    }
    return ['ok' => $code < 400, 'code' => $code, 'body' => (string) $raw];
}

function generate_gemini_comments(string $title, string $category, string $description, int $count = 3): array|string
{
    $keys = gemini_api_keys();
    if ($keys === []) {
        return 'no_key';
    }

    $count = max(1, min(5, $count));
    $cats = categories();
    $catLabel = $cats[$category] ?? $category;
    $prompt = "Türkçe, gerçekçi müşteri–satıcı diyalogları üret. Ürün: \"{$title}\". Kategori: {$catLabel}. Açıklama: {$description}. "
        . "Tam {$count} adet kayıt. SADECE JSON dizi döndür, başka metin yazma: "
        . "[{\"name\":\"Müşteri\",\"text\":\"soru\",\"reply_name\":\"Satıcı\",\"reply_text\":\"@Müşteri cevap\","
        . "\"followup_text\":\"opsiyonel 2. soru\",\"followup_reply\":\"@Müşteri 2. cevap\"}]. "
        . "Kurallar: "
        . "1) En az yarısında followup_text ve followup_reply DOLU olsun (aynı müşterinin devam sorusu + satıcı cevabı). "
        . "2) Devam sorusu ilk cevaba doğal bağlansın (kargo→ücret, orijinal→kutu, soğuk sıkım→asit gibi). "
        . "3) ÜRÜNE ÖZEL, kısa, samimi, insan gibi yaz. Saçma / alakasız / şaka cevap YOK. "
        . "4) Yiyecek değilse ASLA 'afiyet olsun' deme. "
        . "5) reply_text ve followup_reply mutlaka @isim ile başlasın. "
        . "6) Tekrarlayan kalıp cevap yok; her diyalog farklı olsun.";

    $payload = json_encode([
        'contents' => [[
            'parts' => [['text' => $prompt]],
        ]],
        'generationConfig' => [
            'temperature' => 0.75,
            'maxOutputTokens' => 1400,
        ],
    ], JSON_UNESCAPED_UNICODE);

    if ($payload === false) {
        return 'encode_error';
    }

    $lastError = 'http_error';
    $models = ['gemini-flash-latest', 'gemini-2.0-flash-lite', 'gemini-2.0-flash'];
    foreach ($keys as $apiKey) {
        $text = '';
        foreach ($models as $model) {
            $url = 'https://generativelanguage.googleapis.com/v1beta/models/'
                . rawurlencode($model)
                . ':generateContent?key=' . rawurlencode($apiKey);
            $res = gemini_http_post($url, $payload);

            if (!$res['ok']) {
                $lastError = 'http_error';
                if ($res['code'] === 404) {
                    continue;
                }
                if (gemini_should_try_next_key($res['code'], $res['body'])) {
                    continue;
                }
                continue;
            }

            $json = json_decode($res['body'], true);
            if (is_array($json) && isset($json['error']) && gemini_should_try_next_key($res['code'], $res['body'])) {
                $lastError = 'http_error';
                continue;
            }

            $text = (string) ($json['candidates'][0]['content']['parts'][0]['text'] ?? '');
            if ($text !== '') {
                break;
            }
        }
        if ($text === '') {
            $lastError = 'empty';
            continue;
        }

        if (preg_match('/\[[\s\S]*\]/u', $text, $m)) {
            $text = $m[0];
        }
        $parsed = json_decode($text, true);
        if (!is_array($parsed)) {
            $lastError = 'parse_error';
            continue;
        }

        $out = [];
        foreach ($parsed as $row) {
            if (!is_array($row)) {
                continue;
            }
            $name = trim((string) ($row['name'] ?? ''));
            $cText = trim((string) ($row['text'] ?? ''));
            $rName = trim((string) ($row['reply_name'] ?? 'Satıcı'));
            $rText = trim((string) ($row['reply_text'] ?? ''));
            $fuText = trim((string) ($row['followup_text'] ?? ''));
            $fuReply = trim((string) ($row['followup_reply'] ?? ''));
            if ($cText === '') {
                continue;
            }
            if ($rText !== '' && $name !== '' && !str_contains($rText, '@')) {
                $rText = '@' . $name . ' ' . $rText;
            }
            if ($fuReply !== '' && $name !== '' && !str_contains($fuReply, '@')) {
                $fuReply = '@' . $name . ' ' . $fuReply;
            }
            if ($fuText === '' || $fuReply === '') {
                $fuText = '';
                $fuReply = '';
            }
            $out[] = [
                'name' => $name !== '' ? $name : 'Misafir',
                'text' => $cText,
                'reply_name' => $rName !== '' ? $rName : 'Satıcı',
                'reply_text' => $rText,
                'followup_text' => $fuText,
                'followup_reply' => $fuReply,
            ];
        }

        if ($out) {
            return $out;
        }
        $lastError = 'empty';
    }

    return $lastError;
}

function generate_product_comments(string $title, string $category, string $description, int $count = 3, string $sellerName = 'Satıcı', string $sellerUsername = ''): array
{
    $handle = trim($sellerUsername) !== ''
        ? (str_starts_with(trim($sellerUsername), '@') ? trim($sellerUsername) : '@' . ltrim(trim($sellerUsername), '@'))
        : seller_handle(null, $sellerName !== '' ? $sellerName : 'Satıcı');

    $ai = generate_gemini_comments($title, $category, $description, $count);
    if (is_array($ai) && $ai) {
        foreach ($ai as &$row) {
            $row['reply_name'] = $handle;
            $row['followup_text'] = trim((string) ($row['followup_text'] ?? ''));
            $row['followup_reply'] = trim((string) ($row['followup_reply'] ?? ''));
        }
        unset($row);
        return ['source' => 'gemini', 'comments' => $ai];
    }
    $local = generate_local_comments($title, $category, $description, $count, $handle);
    foreach ($local as &$row) {
        $row['reply_name'] = $handle;
    }
    unset($row);
    return [
        'source' => 'local',
        'comments' => $local,
        'ai_note' => is_string($ai) ? $ai : '',
    ];
}
