<?php

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;
use App\Models\BlogPost;
use App\Models\BlogCategory;
use App\Models\AdSenseZone;
use App\Models\AppSetting;
use Illuminate\Http\Request;
use Illuminate\Support\Str;
use Illuminate\Support\Facades\Http;
use Illuminate\View\View;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\JsonResponse;

class BlogController extends Controller
{
    public function index(): View
    {
        $posts = BlogPost::with(['user', 'category'])
            ->latest()
            ->paginate(15);

        return view('admin.blog.index', compact('posts'));
    }

    public function create(): View
    {
        $categories = BlogCategory::orderBy('name')->get();
        $adSenseZones = AdSenseZone::where('is_active', true)->get();
        return view('admin.blog.create', compact('categories', 'adSenseZones'));
    }

    public function store(Request $request): RedirectResponse
    {
        $validated = $request->validate([
            'title'               => 'required|string|max:255',
            'category_id'         => 'required|exists:blog_categories,id',
            'excerpt'             => 'nullable|string|max:500',
            'content'             => 'nullable|string',
            'featured_image'      => 'nullable|image|mimes:jpeg,png,jpg,gif,webp|max:2048',
            'overlayed_image_path' => 'nullable|string',
            'meta_title'          => 'nullable|string|max:255',
            'meta_description'    => 'nullable|string|max:500',
            'status'              => 'required|in:draft,published,archived',
            'adsense_zones'       => 'nullable|array',
            'adsense_zones.*'     => 'exists:adsense_zones,id',
        ]);

        // Slug oluştur
        $slug = Str::slug($validated['title']);
        $originalSlug = $slug;
        $count = 1;
        while (BlogPost::where('slug', $slug)->exists()) {
            $slug = $originalSlug . '-' . $count++;
        }

        // Görsel yükleme (önce overlay var mı kontrol et)
        $featuredImage = null;
        if (!empty($validated['overlayed_image_path'])) {
            // Overlay uygulanmış görseli kullan
            $featuredImage = $validated['overlayed_image_path'];
        } elseif ($request->hasFile('featured_image')) {
            $featuredImage = $request->file('featured_image')->store('blog', 'public');
        }

        $post = BlogPost::create([
            'user_id'          => auth()->id(),
            'category_id'      => $validated['category_id'],
            'title'            => $validated['title'],
            'slug'             => $slug,
            'content'          => $validated['content'] ?? null,
            'excerpt'          => $validated['excerpt'],
            'featured_image'   => $featuredImage,
            'meta_title'       => $validated['meta_title'],
            'meta_description' => $validated['meta_description'],
            'status'           => $validated['status'],
            'published_at'     => $validated['status'] === 'published' ? now() : null,
        ]);

        // Attach AdSense zones
        if (!empty($validated['adsense_zones'])) {
            $post->adSenseZones()->attach($validated['adsense_zones']);
        }

        return redirect()->route('admin.blog.index')
            ->with('success', 'Blog yazısı başarıyla oluşturuldu.');
    }

    public function edit(string|int $blog): View
    {
        // Try finding by ID first (for admin links), then by slug
        $blog = is_numeric($blog)
            ? BlogPost::findOrFail((int)$blog)
            : BlogPost::where('slug', $blog)->firstOrFail();
        
        $categories = BlogCategory::orderBy('name')->get();
        $adSenseZones = AdSenseZone::where('is_active', true)->get();
        $blog->load('adSenseZones');
        return view('admin.blog.edit', compact('blog', 'categories', 'adSenseZones'));
    }

    public function update(Request $request, string|int $blog): RedirectResponse
    {
        // Try finding by ID first (for admin links), then by slug
        $blog = is_numeric($blog)
            ? BlogPost::findOrFail((int)$blog)
            : BlogPost::where('slug', $blog)->firstOrFail();
        $validated = $request->validate([
            'title'               => 'required|string|max:255',
            'category_id'         => 'required|exists:blog_categories,id',
            'excerpt'             => 'nullable|string|max:500',
            'content'             => 'nullable|string',
            'featured_image'      => 'nullable|image|mimes:jpeg,png,jpg,gif,webp|max:2048',
            'overlayed_image_path' => 'nullable|string',
            'meta_title'          => 'nullable|string|max:255',
            'meta_description'    => 'nullable|string|max:500',
            'status'              => 'required|in:draft,published,archived',
            'adsense_zones'       => 'nullable|array',
            'adsense_zones.*'     => 'exists:adsense_zones,id',
        ]);

        // Slug güncelle (başlık değiştiyse)
        if ($validated['title'] !== $blog->title) {
            $slug = Str::slug($validated['title']);
            $originalSlug = $slug;
            $count = 1;
            while (BlogPost::where('slug', $slug)->where('id', '!=', $blog->id)->exists()) {
                $slug = $originalSlug . '-' . $count++;
            }
            $validated['slug'] = $slug;
        }

        // Görsel yükleme (önce overlay var mı kontrol et)
        if (!empty($validated['overlayed_image_path'])) {
            // Overlay uygulanmış görseli kullan
            $validated['featured_image'] = $validated['overlayed_image_path'];
        } elseif ($request->hasFile('featured_image')) {
            // Eski görseli sil
            if ($blog->featured_image && !str_starts_with($blog->featured_image, 'http')) {
                \Storage::disk('public')->delete(str_replace('storage/', '', $blog->featured_image));
            }
            $validated['featured_image'] = $request->file('featured_image')->store('blog', 'public');
        } else {
            unset($validated['featured_image']);
        }

        // Content stored as HTML string directly
        if (isset($validated['content'])) {
            $validated['content'] = $validated['content'] ?: null;
        }

        // published_at
        if ($validated['status'] === 'published' && ! $blog->published_at) {
            $validated['published_at'] = now();
        }

        $blog->update($validated);

        // Sync AdSense zones
        $blog->adSenseZones()->sync($validated['adsense_zones'] ?? []);

        return redirect()->route('admin.blog.index')
            ->with('success', 'Blog yazısı başarıyla güncellendi.');
    }

    public function destroy(string|int $blog): RedirectResponse
    {
        // Try finding by ID first (for admin links), then by slug
        $blog = is_numeric($blog)
            ? BlogPost::findOrFail((int)$blog)
            : BlogPost::where('slug', $blog)->firstOrFail();
        $blog->delete();
        return redirect()->route('admin.blog.index')
            ->with('success', 'Blog yazısı silindi.');
    }

    /**
     * Check for duplicate/similar titles
     */
    public function checkDuplicate(Request $request): JsonResponse
    {
        $request->validate([
            'title' => 'required|string',
            'exclude_id' => 'nullable|integer',
        ]);

        $title = $request->input('title');
        $excludeId = $request->input('exclude_id');

        // Find similar titles using LIKE
        $similarPosts = BlogPost::query()
            ->where('title', 'LIKE', '%' . $title . '%')
            ->when($excludeId, fn($q) => $q->where('id', '!=', $excludeId))
            ->get(['id', 'title', 'slug', 'status']);

        // Calculate similarity score
        $duplicates = [];
        foreach ($similarPosts as $post) {
            $similarity = $this->calculateSimilarity($title, $post->title);
            if ($similarity > 60) {
                $duplicates[] = [
                    'id' => $post->id,
                    'title' => $post->title,
                    'slug' => $post->slug,
                    'status' => $post->status,
                    'similarity' => round($similarity, 1),
                ];
            }
        }

        // Sort by similarity
        usort($duplicates, fn($a, $b) => $b['similarity'] <=> $a['similarity']);

        return response()->json([
            'success' => true,
            'has_duplicates' => count($duplicates) > 0,
            'duplicates' => $duplicates,
        ]);
    }

    /**
     * Calculate similarity between two strings (Levenshtein-based)
     */
    protected function calculateSimilarity(string $str1, string $str2): float
    {
        $len1 = mb_strlen($str1);
        $len2 = mb_strlen($str2);

        if ($len1 === 0 || $len2 === 0) {
            return 0;
        }

        // Use similar_text for Turkish character support
        similar_text($str1, $str2, $percent);
        return $percent;
    }

    /**
     * Get publish checklist for a post
     */
    public function publishChecklist(Request $request): JsonResponse
    {
        $request->validate([
            'title' => 'required|string',
            'content' => 'nullable|string',
            'excerpt' => 'nullable|string',
            'meta_title' => 'nullable|string',
            'meta_description' => 'nullable|string',
            'featured_image' => 'nullable|string',
        ]);

        $checklist = [];
        $warnings = [];
        $canPublish = true;

        // Title check
        if (empty($request->title)) {
            $canPublish = false;
            $warnings[] = 'Başlık boş olamaz';
        } elseif (mb_strlen($request->title) < 10) {
            $warnings[] = 'Başlık çok kısa (en az 10 karakter)';
        }

        // Content check
        $content = strip_tags($request->content ?? '');
        $wordCount = str_word_count($content);
        if ($wordCount < 300) {
            $canPublish = false;
            $warnings[] = "İçerik çok kısa ($wordCount kelime, en az 300 kelime gerekli)";
        }

        // Excerpt check
        if (empty($request->excerpt)) {
            $warnings[] = 'Özet girilmedi (önerilir)';
        }

        // Meta tags check
        if (empty($request->meta_title)) {
            $warnings[] = 'Meta başlığı girilmedi (önerilir)';
        }
        if (empty($request->meta_description)) {
            $warnings[] = 'Meta açıklaması girilmedi (önerilir)';
        }

        // Featured image check
        if (empty($request->featured_image)) {
            $warnings[] = 'Öne çıkan görsel seçilmedi (önerilir)';
        }

        // Heading structure check
        $hasH1 = stripos($request->content, '<h1') !== false;
        $hasH2 = stripos($request->content, '<h2') !== false;
        if (!$hasH1) {
            $warnings[] = 'H1 başlığı eksik';
        }
        if (!$hasH2) {
            $warnings[] = 'H2 alt başlıkları eksik';
        }

        return response()->json([
            'success' => true,
            'can_publish' => $canPublish,
            'warnings' => $warnings,
            'checklist' => [
                'title' => !empty($request->title) && mb_strlen($request->title) >= 10,
                'content' => $wordCount >= 300,
                'excerpt' => !empty($request->excerpt),
                'meta_title' => !empty($request->meta_title),
                'meta_description' => !empty($request->meta_description),
                'featured_image' => !empty($request->featured_image),
                'headings' => $hasH1 && $hasH2,
            ],
        ]);
    }

    // ── AI İçerik Oluşturma ──────────────────────────────────────────────
    public function aiGenerate(Request $request): JsonResponse
    {
        $request->validate([
            'topic'       => 'required|string|min:5|max:255',
            'category_id' => 'nullable|exists:blog_categories,id',
        ]);

        $topic = trim($request->topic);
        $categoryId = $request->category_id;
        $apiKey = AppSetting::get('ai_api_key');
        $geminiApiKey = env('GEMINI_API_KEY');

        // Try Gemini API first (free tier available)
        if ($geminiApiKey) {
            try {
                $response = Http::timeout(60)
                    ->post('https://generativelanguage.googleapis.com/v1beta/models/gemini-pro:generateContent', [
                        'contents' => [
                            [
                                'role' => 'user',
                                'parts' => [
                                    [
                                        'text' => "\"{$topic}\" hakkında Türkçe blog yazısı yaz. Yapı:\n\n" .
                                            "1. Giriş (konuyu tanıt)\n" .
                                            "2. Genel Bilgiler (tarihsel süreç)\n" .
                                            "3. Önemli Noktalar (maddeler)\n" .
                                            "4. Sonuç\n\n" .
                                            "HTML formatında yaz. H1, H2, p, ul, li kullan.\n" .
                                            "Ayrıca JSON formatında döndür:\n" .
                                            "{\"content\": \"HTML\", \"excerpt\": \"150 char özet\", \"meta_title\": \"60 char\", \"meta_description\": \"160 char\"}"
                                    ]
                                ]
                            ]
                        ],
                        'generationConfig' => [
                            'temperature' => 0.7,
                            'maxOutputTokens' => 2000,
                        ]
                    ], [
                        'key' => $geminiApiKey
                    ]);

                if ($response->successful()) {
                    $data = $response->json();
                    $aiText = $data['candidates'][0]['content']['parts'][0]['text'] ?? null;

                    if ($aiText) {
                        // Try to extract JSON
                        if (preg_match('/\{[\s\S]*\}/', $aiText, $matches)) {
                            $parsed = json_decode($matches[0], true);
                            if (json_last_error() === JSON_ERROR_NONE && isset($parsed['content'])) {
                                $htmlContent = $parsed['content'];
                                $excerpt = $parsed['excerpt'] ?? "{$topic} konusunda kapsamlı bir rehber.";
                                $metaTitle = $parsed['meta_title'] ?? "{$topic} - Rehber 2026";
                                $metaDesc = $parsed['meta_description'] ?? "{$topic} hakkında merak ettiğiniz bilgiler.";
                            } else {
                                throw new \Exception('JSON parse failed');
                            }
                        } else {
                            throw new \Exception('No JSON found in response');
                        }
                    } else {
                        throw new \Exception('Empty AI response');
                    }
                } else {
                    throw new \Exception('Gemini API error');
                }
            } catch (\Exception $e) {
                // Fallback to OpenAI if Gemini fails
                if ($apiKey) {
                    try {
                        $response = Http::withToken($apiKey)
                            ->timeout(60)
                            ->post('https://api.openai.com/v1/chat/completions', [
                                'model' => 'gpt-3.5-turbo',
                                'messages' => [
                                    [
                                        'role' => 'system',
                                        'content' => 'Sen uzman bir Türk blog yazarısın. Askeri platform hakkında içerik üretiyorsun. HTML formatında, SEO uyumlu içerik oluştur.'
                                    ],
                                    [
                                        'role' => 'user',
                                        'content' => "\"{$topic}\" hakkında kapsamlı bir blog yazısı yaz. Şu yapıyı kullan:\n\n" .
                                            "1. Giriş (konuyu tanıt)\n" .
                                            "2. Genel Bilgiler (tarihsel süreç, temel bilgiler)\n" .
                                            "3. Önemli Noktalar (maddeler halinde)\n" .
                                            "4. Sonuç\n\n" .
                                            "HTML formatında döndür. H1, H2, p, ul, li etiketlerini kullan. " .
                                            "Ayrıca 150 karakterlik özet (excerpt), 60 karakterlik meta başlık ve 160 karakterlik meta açıklama da üret. " .
                                            "Cevabı şu JSON formatında döndür:\n" .
                                            '{"content": "HTML içerik", "excerpt": "özet", "meta_title": "meta başlık", "meta_description": "meta açıklama"}'
                                    ]
                                ],
                                'temperature' => 0.7,
                                'max_tokens' => 2000,
                            ]);

                        if ($response->successful()) {
                            $data = $response->json();
                            $aiResponse = $data['choices'][0]['message']['content'] ?? null;

                            if ($aiResponse) {
                                $parsed = json_decode($aiResponse, true);

                                if (json_last_error() === JSON_ERROR_NONE && isset($parsed['content'])) {
                                    $htmlContent = $parsed['content'];
                                    $excerpt = $parsed['excerpt'] ?? "{$topic} konusunda kapsamlı bir rehber.";
                                    $metaTitle = $parsed['meta_title'] ?? "{$topic} - Kapsamlı Rehber 2026";
                                    $metaDesc = $parsed['meta_description'] ?? "{$topic} hakkında merak ettiğiniz her şey.";
                                } else {
                                    throw new \Exception('OpenAI JSON parse failed');
                                }
                            } else {
                                throw new \Exception('OpenAI response empty');
                            }
                        } else {
                            throw new \Exception('OpenAI API error');
                        }
                    } catch (\Exception $openaiError) {
                        $htmlContent = $this->generateTemplateContent($topic);
                        $excerpt = "{$topic} konusunda kapsamlı bir rehber.";
                        $metaTitle = "{$topic} - Kapsamlı Rehber 2026";
                        $metaDesc = "{$topic} hakkında merak ettiğiniz her şey.";
                    }
                } else {
                    // Use template fallback
                    $htmlContent = $this->generateTemplateContent($topic);
                    $excerpt = "{$topic} konusunda kapsamlı bir rehber.";
                    $metaTitle = "{$topic} - Kapsamlı Rehber 2026";
                    $metaDesc = "{$topic} hakkında merak ettiğiniz her şey.";
                }
            }
        } elseif ($apiKey) {
            // Only OpenAI available
            try {
                $response = Http::withToken($apiKey)
                    ->timeout(60)
                    ->post('https://api.openai.com/v1/chat/completions', [
                        'model' => 'gpt-3.5-turbo',
                        'messages' => [
                            [
                                'role' => 'system',
                                'content' => 'Sen uzman bir Türk blog yazarısın. Askeri platform hakkında içerik üretiyorsun. HTML formatında, SEO uyumlu içerik oluştur.'
                            ],
                            [
                                'role' => 'user',
                                'content' => "\"{$topic}\" hakkında kapsamlı bir blog yazısı yaz. Şu yapıyı kullan:\n\n" .
                                    "1. Giriş (konuyu tanıt)\n" .
                                    "2. Genel Bilgiler (tarihsel süreç, temel bilgiler)\n" .
                                    "3. Önemli Noktalar (maddeler halinde)\n" .
                                    "4. Sonuç\n\n" .
                                    "HTML formatında döndür. H1, H2, p, ul, li etiketlerini kullan. " .
                                    "Ayrıca 150 karakterlik özet (excerpt), 60 karakterlik meta başlık ve 160 karakterlik meta açıklama da üret. " .
                                    "Cevabı şu JSON formatında döndür:\n" .
                                    '{"content": "HTML içerik", "excerpt": "özet", "meta_title": "meta başlık", "meta_description": "meta açıklama"}'
                            ]
                        ],
                        'temperature' => 0.7,
                        'max_tokens' => 2000,
                    ]);

                if ($response->successful()) {
                    $data = $response->json();
                    $aiResponse = $data['choices'][0]['message']['content'] ?? null;

                    if ($aiResponse) {
                        $parsed = json_decode($aiResponse, true);

                        if (json_last_error() === JSON_ERROR_NONE && isset($parsed['content'])) {
                            $htmlContent = $parsed['content'];
                            $excerpt = $parsed['excerpt'] ?? "{$topic} konusunda kapsamlı bir rehber.";
                            $metaTitle = $parsed['meta_title'] ?? "{$topic} - Kapsamlı Rehber 2026";
                            $metaDesc = $parsed['meta_description'] ?? "{$topic} hakkında merak ettiğiniz her şey.";
                        } else {
                            throw new \Exception('JSON parse failed');
                        }
                    } else {
                        throw new \Exception('Empty response');
                    }
                } else {
                    throw new \Exception('OpenAI API error');
                }
            } catch (\Exception $e) {
                $htmlContent = $this->generateTemplateContent($topic);
                $excerpt = "{$topic} konusunda kapsamlı bir rehber.";
                $metaTitle = "{$topic} - Kapsamlı Rehber 2026";
                $metaDesc = "{$topic} hakkında merak ettiğiniz her şey.";
            }
        } else {
            // No API keys, use template
            $htmlContent = $this->generateTemplateContent($topic);
            $excerpt = "{$topic} konusunda kapsamlı bir rehber. Bu yazıda tüm detayları ele aldık.";
            $metaTitle = "{$topic} - Kapsamlı Rehber 2026";
            $metaDesc = "{$topic} hakkında merak ettiğiniz her şey. Güncel bilgiler ve uzman tavsiyeleri.";
        }

        // Session'a AI içeriği kaydet - create sayfasında kullanmak için
        session([
            'ai_topic'       => $topic,
            'ai_content'     => $htmlContent,
            'ai_excerpt'     => $excerpt,
            'ai_meta_title'  => $metaTitle,
            'ai_meta_desc'   => $metaDesc,
            'ai_category_id' => $categoryId,
        ]);

        return response()->json([
            'success'  => true,
            'redirect' => route('admin.blog.create') . '?ai=1',
        ]);
    }

    /**
     * Template tabanlı içerik oluşturma (fallback)
     */
    protected function generateTemplateContent(string $topic): string
    {
        $sections = [
            'giris'    => "Bu yazıda <strong>{$topic}</strong> konusunu detaylı bir şekilde ele alacağız.",
            'tarihce'  => "Konunun tarihsel sürecine bakıldığında, önemli gelişmeler yaşandığı görülmektedir.",
            'detaylar' => "Konuya ilişkin temel bilgiler şu şekilde özetlenebilir:",
            'sonuc'    => "Sonuç olarak, {$topic} hakkında bilinmesi gereken temel noktaları bu yazıda ele aldık.",
        ];

        $htmlContent = "<h1>{$topic}</h1>\n\n";
        $htmlContent .= "<p>{$sections['giris']}</p>\n\n";
        $htmlContent .= "<h2>Genel Bilgiler</h2>\n";
        $htmlContent .= "<p>{$sections['tarihce']}</p>\n\n";
        $htmlContent .= "<h2>Önemli Noktalar</h2>\n";
        $htmlContent .= "<p>{$sections['detaylar']}</p>\n";
        $htmlContent .= "<ul>\n";
        $htmlContent .= "  <li>{$topic} hakkında ilk önemli madde</li>\n";
        $htmlContent .= "  <li>İkinci önemli bilgi ve detaylar</li>\n";
        $htmlContent .= "  <li>Üçüncü kritik nokta ve açıklama</li>\n";
        $htmlContent .= "  <li>Dördüncü madde - ek bilgiler</li>\n";
        $htmlContent .= "</ul>\n\n";
        $htmlContent .= "<h2>Sonuç</h2>\n";
        $htmlContent .= "<p>{$sections['sonuc']}</p>\n";

        return $htmlContent;
    }
}
