<?php

namespace Core\App\Services;

use Core\App\Models\GeminiSettingModel;
use Core\System\Language;

class GeminiService
{
    /**
     * =====================================================
     * List available Gemini models (Settings page)
     * =====================================================
     */
    public static function listModels(): array
    {
        $config = (new GeminiSettingModel())->get();

        if (!$config || empty($config['api_key'])) {
            throw new \Exception(__('ai.gemini.api_key_missing'));
        }

        $url = "https://generativelanguage.googleapis.com/v1beta/models?key=" . urlencode($config['api_key']);

        $ch = curl_init();
        curl_setopt_array($ch, [
            CURLOPT_URL => $url,
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_TIMEOUT => 20,
        ]);

        $response = curl_exec($ch);

        if ($response === false) {
            throw new \Exception(curl_error($ch));
        }

        curl_close($ch);

        $json = json_decode($response, true);

        if (!isset($json['models'])) {
            throw new \Exception(__('ai.gemini.invalid_response'));
        }

        $models = [];

        foreach ($json['models'] as $model) {
            if (
                isset($model['name'], $model['supportedGenerationMethods']) &&
                in_array('generateContent', $model['supportedGenerationMethods'], true)
            ) {
                $models[] = $model['name'];
            }
        }

        return $models;
    }

    /**
     * =====================================================
     * Generate product descriptions (EXISTING – DO NOT TOUCH)
     * =====================================================
     */
    public static function generateProductDescription(string $title): array
    {
        $config = (new GeminiSettingModel())->get();

        if (
            !$config ||
            empty($config['api_key']) ||
            !(int)$config['is_active'] ||
            empty($config['model'])
        ) {
            throw new \Exception(__('ai.gemini.not_configured'));
        }

        $lang    = Language::code();
        $dialect = $config['dialect'] ?? 'fusha';

        if ($lang === 'ar') {
            $languagePrompt = match ($dialect) {
                'algerian' => 'اكتب باللهجة الجزائرية',
                'moroccan' => 'اكتب باللهجة المغربية',
                'egyptian' => 'اكتب باللهجة المصرية',
                'saudi'    => 'اكتب باللهجة السعودية',
                default    => 'اكتب باللغة العربية الفصحى',
            };
        } else {
            $languagePrompt = __('ai.prompt.write_language') . " {$lang}";
        }

        $prompt = trim("
{$languagePrompt}

" . __('ai.prompt.role_writer', 'You are a content writer for an online store.') . "

" . __('ai.prompt.rules', 'Rules:') . "
- " . __('ai.prompt.no_titles', 'Do not write titles or introductions.') . "
- " . __('ai.prompt.no_formatting', 'Do not use formatting or markdown.') . "
- " . __('ai.prompt.human_style', 'Write in a natural human e-commerce style.') . "
- " . __('ai.prompt.seo_friendly', 'Optimize for SEO naturally.') . "

" . __('ai.prompt.task', 'Task:') . "
1) " . __('ai.prompt.short_desc', 'Write ONE short sentence suitable as a short description.') . "
2) " . __('ai.prompt.full_desc', 'Write ONE short paragraph (2–4 sentences) suitable as a product description.') . "

" . __('ai.prompt.product_title', 'Product name:') . "
{$title}

" . __('ai.prompt.output_format', 'Return strictly in this format:') . "
SHORT: ...
FULL: ...
");

        $payload = json_encode([
            'contents' => [[
                'parts' => [[ 'text' => $prompt ]]
            ]]
        ], JSON_UNESCAPED_UNICODE);

        $url = "https://generativelanguage.googleapis.com/v1beta/{$config['model']}:generateContent?key=" . urlencode($config['api_key']);

        $ch = curl_init();
        curl_setopt_array($ch, [
            CURLOPT_URL => $url,
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_POST => true,
            CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
            CURLOPT_POSTFIELDS => $payload,
            CURLOPT_TIMEOUT => 30,
        ]);

        $response = curl_exec($ch);

        if ($response === false) {
            throw new \Exception(curl_error($ch));
        }

        curl_close($ch);

        $json = json_decode($response, true);
        $text = $json['candidates'][0]['content']['parts'][0]['text'] ?? '';

        if (!$text) {
            throw new \Exception(__('ai.gemini.empty_response'));
        }

        preg_match('/SHORT:\s*(.+)/u', $text, $shortMatch);
        preg_match('/FULL:\s*(.+)/us', $text, $fullMatch);

        return [
            'short' => trim($shortMatch[1] ?? ''),
            'full'  => trim($fullMatch[1] ?? ''),
        ];
    }

    /**
     * =====================================================
     * Low-level Gemini call (USED ONLY BY SOCIAL AI)
     * =====================================================
     */
    private static function callGemini(string $prompt, array $config): ?string
    {
        $payload = [
            'contents' => [[
                'parts' => [[ 'text' => $prompt ]]
            ]],
            'generationConfig' => [
                'temperature' => 0.7,
                'topK' => 40,
                'topP' => 0.9,
                'maxOutputTokens' => 512,
            ],
        ];

        $url = "https://generativelanguage.googleapis.com/v1beta/{$config['model']}:generateContent?key=" . urlencode($config['api_key']);

        $ch = curl_init();
        curl_setopt_array($ch, [
            CURLOPT_URL => $url,
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_POST => true,
            CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
            CURLOPT_POSTFIELDS => json_encode($payload, JSON_UNESCAPED_UNICODE),
            CURLOPT_TIMEOUT => 30,
        ]);

        $response = curl_exec($ch);
        curl_close($ch);

        if (!$response) {
            return null;
        }

        $json = json_decode($response, true);

        if (!isset($json['candidates'])) {
            return null;
        }

        foreach ($json['candidates'] as $candidate) {
            if (!empty($candidate['content']['parts'])) {
                foreach ($candidate['content']['parts'] as $part) {
                    if (!empty($part['text'])) {
                        return trim($part['text']);
                    }
                }
            }
        }

        return null;
    }

    /**
     * =====================================================
     * Generate social media post (NEW – ISOLATED)
     * =====================================================
     */
public static function generateSocialPost(array $context): array
{
    $config = (new GeminiSettingModel())->get();

    if (
        !$config ||
        empty($config['api_key']) ||
        !(int)$config['is_active'] ||
        empty($config['model'])
    ) {
        throw new \Exception(__('ai.gemini.not_configured'));
    }

    /* =========================
       Platform-specific behavior
       ========================= */
    switch (strtolower($context['platform'])) {

        case 'facebook':
            $platformRules = "
- اكتب فقرة تسويقية من 3 إلى 5 جمل
- أسلوب إقناعي مناسب للبيع
- استخدم 2 إلى 4 إيموجي داخل النص
- أضف 4 إلى 6 هاشتاجات في النهاية
";
            break;

        case 'instagram':
            $platformRules = "
- اكتب فقرة جذابة من 2 إلى 4 جمل
- استخدم إيموجي بشكل واضح داخل النص
- أضف 6 إلى 10 هاشتاجات في النهاية
";
            break;

        case 'tiktok':
            $platformRules = "
- اكتب Hook قوي جدًا من سطر واحد أو سطرين كحد أقصى
- أسلوب سريع ومباشر
- استخدم إيموجي
- أضف فقط هاشتاجات في النهاية
";
            break;

        case 'whatsapp':
            $platformRules = "
- اكتب نصًا بشريًا مباشرًا من 2 إلى 3 جمل
- بدون هاشتاجات أو بحد أقصى 1
- استخدم إيموجي خفيفة
- ركز على الإقناع السريع
";
            break;

        case 'telegram':
            $platformRules = "
- اكتب نصًا واضحًا من 3 إلى 4 جمل
- أسلوب معلوماتي + تسويقي
- استخدم إيموجي خفيفة
- أضف 2 إلى 3 هاشتاجات فقط
";
            break;

        case 'twitter':
        case 'x':
            $platformRules = "
- اكتب جملة أو جملتين فقط
- لا تتجاوز 240 حرفًا
- استخدم إيموجي واحدة أو اثنتين
- أضف 1 أو 2 هاشتاج فقط
";
            break;

        default:
            $platformRules = "
- اكتب نصًا تسويقيًا واضحًا ومختصرًا
- استخدم إيموجي بشكل معتدل
";
    }

    /* =========================
       Final selling prompt
       ========================= */
    $prompt = trim("
أنت كاتب تسويقي محترف تكتب منشورات تُباع بها المنتجات فعليًا.

اكتب منشورًا جاهزًا للنشر على منصة:
{$context['platform']}

اسم المنتج:
{$context['title']}

وصف المنتج:
{$context['description']}

التعليمات الخاصة بالمنصة:
{$platformRules}

قواعد عامة:
- لا تكتب عنوانًا منفصلًا
- لا تكرر النص
- لا تشرح ما تفعل
- أعد النص النهائي فقط كما سيُنشر
");

    /* =========================
       Call Gemini (direct – stable)
       ========================= */
    $payload = json_encode([
        'contents' => [[
            'parts' => [[ 'text' => $prompt ]]
        ]]
    ], JSON_UNESCAPED_UNICODE);

    $url = "https://generativelanguage.googleapis.com/v1beta/{$config['model']}:generateContent?key="
         . urlencode($config['api_key']);

    $ch = curl_init();
    curl_setopt_array($ch, [
        CURLOPT_URL => $url,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_POST => true,
        CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
        CURLOPT_POSTFIELDS => $payload,
        CURLOPT_TIMEOUT => 30,
    ]);

    $response = curl_exec($ch);

    if ($response === false) {
        throw new \Exception(curl_error($ch));
    }

    curl_close($ch);

    $json = json_decode($response, true);
    $text = $json['candidates'][0]['content']['parts'][0]['text'] ?? '';

    if (!$text || !trim($text)) {
        throw new \Exception('AI returned empty content');
    }

    return [
        // العنوان نأخذه كما هو من المنتج (قرارك الصحيح)
        'title' => $context['title'],
        'body'  => trim($text),
    ];
}

}
