<?php
/**
 * Offline (API'siz) besin & alerjen tahmin motoru.
 * Ürün adı/açıklamasındaki anahtar kelimelere göre kalori, makro ve alerjen bilgisi üretir.
 * Yeni yönetmeliğe uygun: kalori, protein, karbonhidrat, yağ, şeker, alerjen, kafein, uyarılar.
 */
class NutritionAI
{
    /**
     * Bilgi tabanı: her giriş -> [kalori, protein, karbonhidrat, yağ, şeker, alerjenler[], kafein_mg, etiketler[]]
     * Değerler tipik bir porsiyon için yaklaşık ortalamalardır.
     */
    private static array $kb = [
        // --- Kahveler ---
        'espresso'    => [5, 0.3, 0.8, 0.1, 0, [], 63, ['Kafein içerir']],
        'americano'   => [15, 1, 2, 0.2, 0, [], 150, ['Kafein içerir']],
        'latte'       => [190, 10, 18, 8, 17, ['Süt'], 128, ['Kafein içerir', 'Süt ürünü']],
        'cappuccino'  => [120, 8, 12, 5, 11, ['Süt'], 128, ['Kafein içerir', 'Süt ürünü']],
        'mocha'       => [290, 11, 40, 11, 33, ['Süt'], 152, ['Kafein içerir', 'Süt ürünü']],
        'macchiato'   => [110, 7, 10, 4, 9, ['Süt'], 128, ['Kafein içerir']],
        'flat white'  => [170, 11, 15, 8, 13, ['Süt'], 130, ['Kafein içerir']],
        'filtre kahve'=> [10, 0.5, 1, 0.1, 0, [], 145, ['Kafein içerir']],
        'türk kahve'  => [10, 0.4, 1.5, 0.1, 0, [], 60, ['Kafein içerir']],
        'cortado'     => [90, 6, 8, 4, 7, ['Süt'], 128, ['Kafein içerir']],
        'affogato'    => [230, 6, 26, 12, 24, ['Süt'], 63, ['Kafein içerir', 'Süt ürünü']],
        'egypt latte' => [260, 9, 34, 10, 30, ['Süt'], 130, ['Kafein içerir', 'Süt ürünü']],
        // --- Soğuk / buzlu ---
        'iced'        => [160, 6, 22, 5, 20, ['Süt'], 130, ['Kafein içerir', 'Soğuk servis']],
        'frozen'      => [300, 5, 55, 8, 48, ['Süt'], 90, ['Şeker içerir', 'Soğuk servis']],
        'frappe'      => [320, 6, 52, 10, 45, ['Süt'], 100, ['Kafein içerir', 'Şeker içerir']],
        'cold brew'   => [15, 0.5, 2, 0.1, 0, [], 200, ['Yüksek kafein']],
        'milkshake'   => [400, 9, 60, 14, 52, ['Süt'], 5, ['Süt ürünü', 'Yüksek şeker']],
        'smoothie'    => [220, 4, 45, 2, 38, [], 0, ['Meyve bazlı']],
        // --- Çay & bitki ---
        'çay'         => [2, 0, 0.5, 0, 0, [], 47, ['Kafein içerir']],
        'yeşil çay'   => [2, 0, 0.4, 0, 0, [], 28, ['Kafein içerir']],
        'bitki çayı'  => [2, 0, 0.5, 0, 0, [], 0, []],
        'matcha'      => [80, 3, 12, 2, 8, ['Süt'], 70, ['Kafein içerir']],
        'sahlep'      => [230, 6, 40, 6, 28, ['Süt'], 0, ['Süt ürünü']],
        'sıcak çikolata'=>[300, 9, 43, 11, 37, ['Süt'], 25, ['Süt ürünü', 'Şeker içerir']],
        // --- Soft / meşrubat ---
        'kola'        => [140, 0, 39, 0, 39, [], 34, ['Yüksek şeker', 'Kafein içerir']],
        'cola'        => [140, 0, 39, 0, 39, [], 34, ['Yüksek şeker', 'Kafein içerir']],
        'gazoz'       => [120, 0, 32, 0, 32, [], 0, ['Şeker içerir']],
        'soda'        => [0, 0, 0, 0, 0, [], 0, []],
        'limonata'    => [180, 0.3, 46, 0, 42, [], 0, ['Şeker içerir']],
        'meyve suyu'  => [120, 0.5, 28, 0.2, 24, [], 0, ['Meyve bazlı']],
        'ayran'       => [90, 5, 7, 4, 6, ['Süt'], 0, ['Süt ürünü']],
        'su'          => [0, 0, 0, 0, 0, [], 0, []],
        'ice tea'     => [90, 0, 23, 0, 22, [], 25, ['Şeker içerir']],
        'enerji içeceği'=>[160, 0, 39, 0, 38, [], 160, ['Yüksek kafein', 'Yüksek şeker']],
        // --- Tatlılar ---
        'cheesecake'  => [400, 7, 38, 25, 30, ['Süt', 'Gluten', 'Yumurta'], 0, ['Yüksek yağ', 'Şeker içerir']],
        'brownie'     => [430, 6, 50, 24, 38, ['Süt', 'Gluten', 'Yumurta', 'Fındık'], 15, ['Yüksek şeker']],
        'tiramisu'    => [420, 7, 45, 23, 35, ['Süt', 'Gluten', 'Yumurta'], 30, ['Kafein içerir', 'Alkol olabilir']],
        'sufle'       => [380, 6, 44, 20, 34, ['Süt', 'Gluten', 'Yumurta'], 20, ['Yüksek şeker']],
        'magnolia'    => [300, 5, 44, 12, 34, ['Süt', 'Gluten'], 0, ['Şeker içerir']],
        'kurabiye'    => [160, 2, 20, 8, 10, ['Süt', 'Gluten', 'Yumurta'], 0, ['Şeker içerir']],
        'kek'         => [340, 5, 48, 15, 30, ['Süt', 'Gluten', 'Yumurta'], 0, ['Şeker içerir']],
        'pasta'       => [380, 5, 50, 18, 36, ['Süt', 'Gluten', 'Yumurta'], 0, ['Şeker içerir']],
        'waffle'      => [450, 8, 58, 20, 30, ['Süt', 'Gluten', 'Yumurta'], 5, ['Yüksek şeker']],
        'dondurma'    => [210, 4, 24, 11, 21, ['Süt'], 0, ['Süt ürünü']],
        'baklava'     => [330, 5, 40, 17, 25, ['Gluten', 'Fındık'], 0, ['Yüksek şeker']],
        'san sebastian'=>[420, 8, 32, 28, 26, ['Süt', 'Yumurta', 'Gluten'], 0, ['Yüksek yağ']],
        'cookie'      => [200, 3, 26, 9, 15, ['Süt', 'Gluten', 'Yumurta'], 5, ['Şeker içerir']],
        // --- Yiyecekler / sandviç ---
        'tost'        => [350, 15, 34, 16, 3, ['Gluten', 'Süt'], 0, []],
        'sandviç'     => [380, 16, 40, 16, 4, ['Gluten', 'Süt'], 0, []],
        'sandwich'    => [380, 16, 40, 16, 4, ['Gluten', 'Süt'], 0, []],
        'bagel'       => [300, 11, 48, 6, 5, ['Gluten', 'Susam'], 0, []],
        'kruvasan'    => [270, 6, 31, 14, 6, ['Gluten', 'Süt', 'Yumurta'], 0, []],
        'poğaça'      => [280, 6, 32, 14, 3, ['Gluten', 'Süt', 'Yumurta'], 0, []],
        'simit'       => [270, 8, 46, 6, 2, ['Gluten', 'Susam'], 0, []],
        'salata'      => [180, 6, 14, 10, 6, [], 0, ['Sağlıklı seçim']],
        'wrap'        => [400, 18, 42, 16, 5, ['Gluten', 'Süt'], 0, []],
        'burger'      => [550, 26, 42, 30, 8, ['Gluten', 'Süt', 'Susam'], 0, ['Yüksek yağ']],
        // --- Protein / bar ---
        'protein bar' => [200, 20, 22, 7, 12, ['Süt', 'Fındık', 'Soya'], 0, ['Yüksek protein']],
        'protein'     => [180, 22, 12, 4, 6, ['Süt', 'Soya'], 0, ['Yüksek protein']],
        'meyve'       => [80, 1, 20, 0.3, 16, [], 0, ['Sağlıklı seçim']],
        'granola'     => [220, 6, 30, 8, 12, ['Gluten', 'Fındık'], 0, []],
    ];

    /** Standart alerjen etiketleri (yönetmelik). */
    public static array $allergenList = [
        'Gluten', 'Süt', 'Yumurta', 'Fındık', 'Yer fıstığı', 'Soya',
        'Susam', 'Balık', 'Kabuklu deniz ürünü', 'Hardal', 'Kereviz',
        'Sülfit', 'Lüpen', 'Yumuşakça',
    ];

    /**
     * Ürün adı + açıklamadan besin & alerjen tahmini üretir.
     * @return array{calories:int, protein:float, carbs:float, fat:float, sugar:float, allergens:string, caffeine:int, notes:string, description:string, confidence:string}
     */
    public static function analyze(string $name, string $description = ''): array
    {
        $nameHay = mb_strtolower($name, 'UTF-8');
        $fullHay = mb_strtolower($name . ' ' . $description, 'UTF-8');
        $haystack = $fullHay;

        // Önce ürün ADINDAKİ eşleşmeleri topla (öncelikli).
        $nameMatches = [];
        $descMatches = [];
        foreach (self::$kb as $keyword => $data) {
            if (mb_strpos($nameHay, $keyword) !== false) {
                $nameMatches[$keyword] = $data;
            } elseif (mb_strpos($fullHay, $keyword) !== false) {
                $descMatches[$keyword] = $data;
            }
        }
        // Adda eşleşme varsa yalnızca onları kullan; yoksa açıklamaya düş.
        $matched = !empty($nameMatches) ? $nameMatches : $descMatches;

        // "sütsüz" / "şekersiz" gibi olumsuzlamalar
        $sugarFree = preg_match('/şekersiz|sugar\s?free|light|diyet/u', $haystack);
        $milkFree  = preg_match('/sütsüz|vegan|bitkisel süt|badem süt|yulaf süt|soya süt/u', $haystack);

        if (empty($matched)) {
            // Genel varsayılan (içecek gibi)
            $best = [120, 3, 20, 3, 15, [], 0, ['Tahmini değer']];
            $confidence = 'düşük';
        } else {
            // En uzun anahtar kelime = en spesifik eşleşme öncelikli
            uksort($matched, fn($a, $b) => mb_strlen($b) <=> mb_strlen($a));
            $best = reset($matched);
            $confidence = count($matched) >= 2 ? 'yüksek' : 'orta';

            // Ek anahtar kelimeler makroları hafifçe etkilesin
            if (isset($matched['iced']) && count($matched) > 1) {
                $best[6] = max($best[6], 120); // kafein
            }
        }

        [$cal, $pro, $carb, $fat, $sugar, $allergens, $caffeine, $notes] = $best;

        if ($sugarFree) {
            $sugar = round($sugar * 0.1, 1);
            $cal = (int) round($cal * 0.7);
            $carb = round($carb * 0.6, 1);
            $notes[] = 'Şekersiz/light';
        }
        if ($milkFree) {
            $allergens = array_values(array_filter($allergens, fn($a) => $a !== 'Süt'));
            $notes = array_values(array_filter($notes, fn($n) => $n !== 'Süt ürünü'));
            $notes[] = 'Bitkisel süt seçeneği';
        }

        $allergens = array_values(array_unique($allergens));
        $notes = array_values(array_unique($notes));

        return [
            'calories'    => (int) $cal,
            'protein'     => (float) $pro,
            'carbs'       => (float) $carb,
            'fat'         => (float) $fat,
            'sugar'       => (float) $sugar,
            'allergens'   => implode(', ', $allergens),
            'caffeine'    => (int) $caffeine,
            'notes'       => implode(', ', $notes),
            'description' => self::autoDescription($name, $allergens, $cal, $caffeine),
            'confidence'  => $confidence,
        ];
    }

    /** Otomatik kısa açıklama üretir. */
    private static function autoDescription(string $name, array $allergens, int $cal, int $caffeine): string
    {
        $name = trim($name);
        $parts = [];
        $parts[] = mb_convert_case(mb_substr($name, 0, 1, 'UTF-8'), MB_CASE_UPPER, 'UTF-8')
            . mb_substr($name, 1, null, 'UTF-8') . ' — özenle hazırlanır.';
        if ($cal > 0) {
            $parts[] = "Yaklaşık {$cal} kcal.";
        }
        if ($caffeine > 0) {
            $parts[] = "Kafein içerir (~{$caffeine} mg).";
        }
        if (!empty($allergens)) {
            $parts[] = 'Alerjen: ' . implode(', ', $allergens) . '.';
        }
        return implode(' ', $parts);
    }
}
