<?php
/**
 * AI Auto Writer - Tự động suy nghĩ và viết bài hoàn chỉnh từ title
 * 
 * Chức năng này cho phép AI Agent:
 * - Tự động phân tích title
 * - Tự động suy nghĩ outline, cấu trúc bài viết
 * - Tự động chia nhỏ sections
 * - Tự động viết mở bài, các section chi tiết, và kết bài
 * - Viết content dài, chi tiết
 * 
 * @package AI_Auto_Tool
 * @since 1.0.0
 */

if (!defined('ABSPATH')) {
    exit;
}

class AIAutotool_AI_Auto_Writer {
    
    /**
     * Instance
     */
    private static $instance = null;
    
    /**
     * AI Agent
     */
    private $agent;
    
    /**
     * Current stream instance (for aithink events)
     */
    private $current_stream = null;
    
    /**
     * Get singleton instance
     */
    public static function get_instance() {
        if (null === self::$instance) {
            self::$instance = new self();
        }
        return self::$instance;
    }
    
    /**
     * Constructor
     */
    private function __construct() {
        // Get AI Agent instance
        $this->agent = AIAutotool_AI_Agent::get_instance();
    }
    
    /**
     * Main method: Tự động viết bài hoàn chỉnh từ title với streaming
     * 
     * @param string $title Tiêu đề bài viết
     * @param AIAutoTool_SSE_Stream $stream SSE stream instance
     * @param array $options Tùy chọn (language, industry, min_sections, etc.)
     * @return array Kết quả với full article content
     */
    public function write_article_from_title_with_stream($title, $stream, $options = array()) {
        if (function_exists('set_time_limit')) {
            @set_time_limit(300);
        }
        @ini_set('max_execution_time', '300');
        @ini_set('hard_timeout', '30');
        @ini_set('default_socket_timeout', '300');

        $start_time = microtime(true);
        
        // Store stream for use in generate calls
        $this->current_stream = $stream;
        
        // Default options
        $defaults = array(
            'language' => 'vi',              // Ngôn ngữ: vi, en
            'industry' => 'auto',            // Auto detect hoặc chỉ định ngành
            'min_sections' => 5,             // Số section tối thiểu
            'max_sections' => 10,            // Số section tối đa
            'words_per_section' => 300,      // Số từ mỗi section (tối thiểu)
            'include_intro' => true,         // Có mở bài không
            'include_conclusion' => true,    // Có kết bài không
            'detailed_level' => 'high',      // low, medium, high
            'max_retries' => 1,
            'retry_delay' => 0,
            'debug' => false,                // Debug mode
        );
        
        $options = array_merge($defaults, $options);
        
        $result = array(
            'success' => false,
            'title' => $title,
            'outline' => array(),
            'sections' => array(),
            'full_content' => '',
            'word_count' => 0,
            'execution_time' => 0,
            'debug_info' => array(),
        );
        
        try {
            // Step 1: Phân tích title và tự động suy nghĩ outline với retry
            $max_retries = isset($options['max_retries']) ? max(1, (int) $options['max_retries']) : 1;
            $retry_delay = isset($options['retry_delay']) ? max(0, (int) $options['retry_delay']) : 2;
            $retry_count = 0;
            $outline_result = null;
            
            while ($retry_count < $max_retries) {
                if ($retry_count > 0) {
                    $stream->send_status("Đang thử lại tạo outline (lần {$retry_count}/{$max_retries})...");
                    $this->log_debug($options, "Retrying outline creation (attempt {$retry_count}/{$max_retries})...");
                    if ($retry_delay > 0) {
                        sleep($retry_delay);
                    }
                } else {
                    $stream->send_status("Đang phân tích tiêu đề và tạo outline...");
                    $this->log_debug($options, "Step 1: Analyzing title and creating outline...");
                }
                
                $outline_result = $this->analyze_and_create_outline($title, $options);
                
                if ($outline_result['success']) {
                    break; // Thành công, thoát khỏi vòng lặp
                }
                
                $retry_count++;
            }
            
            if (!$outline_result || !$outline_result['success']) {
                throw new Exception("Failed to create outline after {$max_retries} attempts: " . ($outline_result['error'] ?? 'Unknown error'));
            }
            
            $result['outline'] = $outline_result['outline'];
            $result['debug_info']['outline_creation'] = $outline_result['debug'];
            $this->log_debug($options, "Outline created with " . count($outline_result['outline']['sections']) . " sections");
            
            // Stream outline JSON to frontend
            $stream->send('outline', array(
                'outline' => $outline_result['outline'],
                'title' => $title,
                'sections_count' => count($outline_result['outline']['sections']),
                'timestamp' => current_time('mysql')
            ));
            
            // Stream outline info (text format for status display)
            $outline_info = "Đã tạo outline với " . count($outline_result['outline']['sections']) . " phần:\n";
            foreach ($outline_result['outline']['sections'] as $index => $section) {
                $outline_info .= ($index + 1) . ". " . $section['title'] . "\n";
            }

            $this->stream_status_chunked($stream, "Analysis: " . $outline_result['outline']['analysis']);
            $this->stream_status_chunked($stream, "Detected industry: " . $outline_result['outline']['detected_industry']);
            $this->stream_status_chunked($stream, "Target audience: " . $outline_result['outline']['target_audience']);
            $this->stream_status_chunked($stream, "Tone: " . $outline_result['outline']['tone']);
            $this->stream_status_chunked($stream, $outline_info);
            
            // Step 2: Viết mở bài (Introduction)
            if ($options['include_intro']) {
                $stream->send_status("Đang viết mở bài...");
                $this->log_debug($options, "Step 2: Writing introduction...");
                $intro_result = $this->write_introduction($title, $outline_result['outline'], $options);
                
                if ($intro_result['success']) {
                    $result['sections']['introduction'] = $intro_result['content'];
                    $this->log_debug($options, "Introduction written: " . strlen($intro_result['content']) . " chars");
                    
                    // Stream introduction content
                    $stream->send('content_chunk', array(
                        'type' => 'introduction',
                        'content' => $intro_result['content'],
                        'title' => $title
                    ));
                    $stream->send_status($intro_result['content']);
                } else {
                    $intro_error = isset($intro_result['error']) ? $intro_result['error'] : 'Unknown introduction error';
                    throw new Exception("Failed to write introduction: " . $intro_error);
                }
            }
            
            // Step 3: Viết từng section chi tiết (mỗi 2 section 1 lần)
            $stream->send_status("Bắt đầu viết " . count($outline_result['outline']['sections']) . " phần nội dung...");
            $this->log_debug($options, "Step 3: Writing detailed sections...");
            $sections_content = array();
            $total_sections = count($outline_result['outline']['sections']);
            
            // Lặp qua sections, mỗi lần xử lý 2 sections
            for ($index = 0; $index < $total_sections; $index += 2) {
                // Lấy section đầu tiên trong batch
                $section1 = $outline_result['outline']['sections'][$index];
                $section_number1 = $index + 1;
                
                // Kiểm tra xem có section thứ 2 không
                $has_section2 = ($index + 1 < $total_sections);
                $section2 = $has_section2 ? $outline_result['outline']['sections'][$index + 1] : null;
                $section_number2 = $has_section2 ? $index + 2 : null;
                
                // Thông báo đang viết batch
                if ($has_section2) {
                    $stream->send_status("Đang viết phần {$section_number1}-{$section_number2}/{$total_sections}: {$section1['title']} & {$section2['title']}");
                    $this->log_debug($options, "Writing sections {$section_number1} and {$section_number2}: {$section1['title']} & {$section2['title']}");
                } else {
                    $stream->send_status("Đang viết phần {$section_number1}/{$total_sections}: {$section1['title']}");
                    $this->log_debug($options, "Writing section {$section_number1}: {$section1['title']}");
                }
                
                // Viết section 1
                $section_result1 = $this->write_section($section1, $title, $outline_result['outline'], $options);
                if (empty($section_result1['success'])) {
                    $section_error = isset($section_result1['error']) ? $section_result1['error'] : 'Unknown section error';
                    $stream->send_status("Section {$section_number1} failed, retrying once...");
                    $this->log_debug($options, "Section {$section_number1} failed, retrying once: {$section_error}");
                    $section_result1 = $this->write_section($section1, $title, $outline_result['outline'], $options);
                }
                
                if ($section_result1['success']) {
                    // Tìm và chèn hình ảnh cho section 1
                    $section_content_with_image = $this->find_and_insert_image_for_section(
                        $section_result1['content'],
                        $section1['title'],
                        $options,
                        $stream
                    );
                    
                    $sections_content[] = array(
                        'title' => $section1['title'],
                        'content' => $section_content_with_image,
                        'word_count' => str_word_count(strip_tags($section_content_with_image))
                    );
                    $this->log_debug($options, "Section {$section_number1} written: " . 
                        str_word_count(strip_tags($section_content_with_image)) . " words");
                    
                    // Stream section 1 content
                    $stream->send('content_chunk', array(
                        'type' => 'section',
                        'section_number' => $section_number1,
                        'title' => $section1['title'],
                        'content' => $section_content_with_image
                    ));

                    $stream->send_status($section_content_with_image);
                    $stream->send_status("✓ Đã hoàn thành phần {$section_number1}: {$section1['title']}");
                } else {
                    $section_error = isset($section_result1['error']) ? $section_result1['error'] : 'Unknown section error';
                    throw new Exception("Failed to write section {$section_number1}/{$total_sections} ({$section1['title']}): " . $section_error);
                }
                
                // Viết section 2 nếu có
                if ($has_section2 && $section2) {
                    $section_result2 = $this->write_section($section2, $title, $outline_result['outline'], $options);
                    if (empty($section_result2['success'])) {
                        $section_error = isset($section_result2['error']) ? $section_result2['error'] : 'Unknown section error';
                        $stream->send_status("Section {$section_number2} failed, retrying once...");
                        $this->log_debug($options, "Section {$section_number2} failed, retrying once: {$section_error}");
                        $section_result2 = $this->write_section($section2, $title, $outline_result['outline'], $options);
                    }
                    
                    if ($section_result2['success']) {
                        // Tìm và chèn hình ảnh cho section 2
                        $section_content_with_image = $this->find_and_insert_image_for_section(
                            $section_result2['content'],
                            $section2['title'],
                            $options,
                            $stream
                        );
                        
                        $sections_content[] = array(
                            'title' => $section2['title'],
                            'content' => $section_content_with_image,
                            'word_count' => str_word_count(strip_tags($section_content_with_image))
                        );
                        $this->log_debug($options, "Section {$section_number2} written: " . 
                            str_word_count(strip_tags($section_content_with_image)) . " words");
                        
                        // Stream section 2 content
                        $stream->send('content_chunk', array(
                            'type' => 'section',
                            'section_number' => $section_number2,
                            'title' => $section2['title'],
                            'content' => $section_content_with_image
                        ));

                        $stream->send_status($section_content_with_image);
                        $stream->send_status("✓ Đã hoàn thành phần {$section_number2}: {$section2['title']}");
                    } else {
                        $section_error = isset($section_result2['error']) ? $section_result2['error'] : 'Unknown section error';
                        throw new Exception("Failed to write section {$section_number2}/{$total_sections} ({$section2['title']}): " . $section_error);
                    }
                }
            }
            
            $result['sections']['main_sections'] = $sections_content;
            $completed_sections = count($sections_content);
            $minimum_completed_sections = min($total_sections, max(1, (int) $options['min_sections']));
            if ($completed_sections < $minimum_completed_sections) {
                throw new Exception("Incomplete article: wrote {$completed_sections}/{$total_sections} sections, required at least {$minimum_completed_sections}.");
            }
            
            // Step 4: Viết kết bài (Conclusion)
            if ($options['include_conclusion']) {
                $stream->send_status("Đang viết kết bài...");
                $this->log_debug($options, "Step 4: Writing conclusion...");
                $conclusion_result = $this->write_conclusion($title, $outline_result['outline'], $sections_content, $options);
                
                if ($conclusion_result['success']) {
                    $result['sections']['conclusion'] = $conclusion_result['content'];
                    $this->log_debug($options, "Conclusion written: " . strlen($conclusion_result['content']) . " chars");
                    
                    // Stream conclusion content
                    $stream->send('content_chunk', array(
                        'type' => 'conclusion',
                        'content' => $conclusion_result['content']
                    ));
                    $stream->send_status($conclusion_result['content']);
                    $stream->send_status("✓ Đã hoàn thành kết bài");
                } else {
                    $conclusion_error = isset($conclusion_result['error']) ? $conclusion_result['error'] : 'Unknown conclusion error';
                    throw new Exception("Failed to write conclusion: " . $conclusion_error);
                }
            }
            
            // Step 5: Compile full article
            $stream->send_status("Đang tổng hợp bài viết hoàn chỉnh...");
            $this->log_debug($options, "Step 5: Compiling full article...");
            $result['full_content'] = $this->compile_full_article($title, $result['sections'], $options);
            $result['word_count'] = str_word_count(strip_tags($result['full_content']));
            
            $result['success'] = true;
            
        } catch (Exception $e) {
            $result['error'] = $e->getMessage();
            $this->log_debug($options, "Error: " . $e->getMessage());
            if (empty($options['suppress_internal_errors'])) {
                $stream->send_error($e->getMessage());
            } else {
                $stream->send_status("Provider hiện tại thất bại, đang thử provider khác...");
            }
        }
        
        $result['execution_time'] = microtime(true) - $start_time;
        
        return $result;
    }
    
    /**
     * Main method: Tự động viết bài hoàn chỉnh từ title
     * 
     * @param string $title Tiêu đề bài viết
     * @param array $options Tùy chọn (language, industry, min_sections, etc.)
     * @return array Kết quả với full article content
     */
    public function write_article_from_title($title, $options = array()) {
        $start_time = microtime(true);
        
        // Default options
        $defaults = array(
            'language' => 'vi',              // Ngôn ngữ: vi, en
            'industry' => 'auto',            // Auto detect hoặc chỉ định ngành
            'min_sections' => 5,             // Số section tối thiểu
            'max_sections' => 10,            // Số section tối đa
            'words_per_section' => 300,      // Số từ mỗi section (tối thiểu)
            'include_intro' => true,         // Có mở bài không
            'include_conclusion' => true,    // Có kết bài không
            'detailed_level' => 'high',      // low, medium, high
            'debug' => false,                // Debug mode
        );
        
        $options = array_merge($defaults, $options);
        
        $result = array(
            'success' => false,
            'title' => $title,
            'outline' => array(),
            'sections' => array(),
            'full_content' => '',
            'word_count' => 0,
            'execution_time' => 0,
            'debug_info' => array(),
        );
        
        try {
            // Step 1: Phân tích title và tự động suy nghĩ outline với retry
            $max_retries = isset($options['max_retries']) ? max(1, (int) $options['max_retries']) : 1;
            $retry_delay = isset($options['retry_delay']) ? max(0, (int) $options['retry_delay']) : 0;
            $retry_count = 0;
            $outline_result = null;
            
            while ($retry_count < $max_retries) {
                if ($retry_count > 0) {
                    $this->log_debug($options, "Retrying outline creation (attempt {$retry_count}/{$max_retries})...");
                    if ($retry_delay > 0) {
                        sleep($retry_delay);
                    }
                } else {
                    $this->log_debug($options, "Step 1: Analyzing title and creating outline...");
                }
                
                $outline_result = $this->analyze_and_create_outline($title, $options);
                
                if ($outline_result['success']) {
                    break; // Thành công, thoát khỏi vòng lặp
                }
                
                $retry_count++;
            }
            
            if (!$outline_result || !$outline_result['success']) {
                throw new Exception("Failed to create outline after {$max_retries} attempts: " . ($outline_result['error'] ?? 'Unknown error'));
            }
            
            $result['outline'] = $outline_result['outline'];
            $result['debug_info']['outline_creation'] = $outline_result['debug'];
            $this->log_debug($options, "Outline created with " . count($outline_result['outline']['sections']) . " sections");
            
            // Step 2: Viết mở bài (Introduction)
            if ($options['include_intro']) {
                $this->log_debug($options, "Step 2: Writing introduction...");
                $intro_result = $this->write_introduction($title, $outline_result['outline'], $options);
                
                if ($intro_result['success']) {
                    $result['sections']['introduction'] = $intro_result['content'];
                    $this->log_debug($options, "Introduction written: " . strlen($intro_result['content']) . " chars");
                }
            }
            
            // Step 3: Viết từng section chi tiết
            $this->log_debug($options, "Step 3: Writing detailed sections...");
            $sections_content = array();
            
            foreach ($outline_result['outline']['sections'] as $index => $section) {
                $section_number = $index + 1;
                $this->log_debug($options, "Writing section {$section_number}: {$section['title']}");
                
                $section_result = $this->write_section($section, $title, $outline_result['outline'], $options);
                
                if ($section_result['success']) {
                    $sections_content[] = array(
                        'title' => $section['title'],
                        'content' => $section_result['content'],
                        'word_count' => str_word_count(strip_tags($section_result['content']))
                    );
                    $this->log_debug($options, "Section {$section_number} written: " . 
                        str_word_count(strip_tags($section_result['content'])) . " words");
                }
            }
            
            $result['sections']['main_sections'] = $sections_content;
            
            // Step 4: Viết kết bài (Conclusion)
            if ($options['include_conclusion']) {
                $this->log_debug($options, "Step 4: Writing conclusion...");
                $conclusion_result = $this->write_conclusion($title, $outline_result['outline'], $sections_content, $options);
                
                if ($conclusion_result['success']) {
                    $result['sections']['conclusion'] = $conclusion_result['content'];
                    $this->log_debug($options, "Conclusion written: " . strlen($conclusion_result['content']) . " chars");
                }
            }
            
            // Step 5: Compile full article
            $this->log_debug($options, "Step 5: Compiling full article...");
            $result['full_content'] = $this->compile_full_article($title, $result['sections'], $options);
            $result['word_count'] = str_word_count(strip_tags($result['full_content']));
            
            $result['success'] = true;
            
        } catch (Exception $e) {
            $result['error'] = $e->getMessage();
            $this->log_debug($options, "Error: " . $e->getMessage());
        }
        
        $result['execution_time'] = microtime(true) - $start_time;
        
        return $result;
    }
    
    /**
     * Step 1: Phân tích title và tạo outline chi tiết
     */
    private function analyze_and_create_outline($title, $options) {
        $language = $options['language'];
        $industry = $options['industry'];
        $min_sections = $options['min_sections'];
        $max_sections = $options['max_sections'];
        $target_audience = !empty($options['target_audience']) ? $options['target_audience'] : 'Tự động xác định từ tiêu đề';
        $tone = !empty($options['tone']) ? $options['tone'] : 'Tự động chọn theo chủ đề';
        
        // Thêm random element theo thời gian để mỗi lần query cho output khác nhau
        $timestamp = current_time('mysql');
        $random_seed = wp_rand(1000, 9999);
        
        // Tạo prompt để AI tự suy nghĩ outline
        $prompt = "Bạn là một chuyên gia viết bài chuyên nghiệp. Hãy phân tích tiêu đề sau và tạo outline chi tiết cho bài viết:
        
[Session ID: {$timestamp}-{$random_seed}]

TIÊU ĐỀ: \"{$title}\"

YÊU CẦU:
1. Phân tích ý nghĩa và mục đích của tiêu đề này
2. Tự động suy nghĩ xem cần viết những gì để bài viết hoàn chỉnh
3. Chia bài viết thành {$min_sections}-{$max_sections} phần (sections) logic
4. Mỗi section cần có:
   - Tiêu đề section rõ ràng, hấp dẫn (tối đa 15 từ)
   - Mô tả ngắn gọn nội dung sẽ viết (tối đa 2 câu)
   - Các điểm chính cần đề cập (tối đa 5 điểm, mỗi điểm tối đa 10 từ)
   - Số từ ước tính cho section đó

5. Đảm bảo outline có:
   - Mở bài (Introduction): Giới thiệu chủ đề, lý do quan trọng
   - Các section chính: Chi tiết, đi sâu vào từng khía cạnh
   - Kết bài (Conclusion): Tổng kết, nhấn mạnh key takeaways

NGÔN NGỮ: {$language}
" . ($industry !== 'auto' ? "NGÀNH: {$industry}" : "NGÀNH: Tự động xác định từ tiêu đề") . "
ĐỐI TƯỢNG ĐỘC GIẢ: {$target_audience}
GIỌNG VĂN: {$tone}

Hãy suy nghĩ kỹ và trả về outline dưới dạng JSON với format sau:
{
    \"analysis\": \"Phân tích về tiêu đề và mục đích bài viết\",
    \"detected_industry\": \"Ngành được xác định\",
    \"target_audience\": \"Đối tượng độc giả mục tiêu\",
    \"tone\": \"Tone của bài viết (formal, casual, professional, etc.)\",
    \"sections\": [
        {
            \"title\": \"Tiêu đề section\",
            \"description\": \"Mô tả nội dung\",
            \"key_points\": [\"Điểm 1\", \"Điểm 2\", \"Điểm 3\"],
            \"estimated_words\": 300
        }
    ]
}

QUAN TRỌNG:
- CHỈ TRẢ VỀ JSON, KHÔNG CÓ TEXT PHỤ THÊM
- Đảm bảo JSON hoàn chỉnh, đóng tất cả các dấu ngoặc
- Giữ nội dung ngắn gọn, súc tích để tránh vượt quá giới hạn output
- Mỗi key_point chỉ nên là 1 cụm từ ngắn gọn (3-8 từ), không phải câu dài";

        $generate_options = array(
            'use_case' => 'reasoning',
            'max_tokens' => 8000,  // Tăng max_tokens để đảm bảo đủ cho outline chi tiết
            'timeout' => 60,
            'connect_timeout' => 12,
            'low_speed_time' => 45,
        );
        
        // Support provider/model from options
        if (isset($options['provider'])) {
            $generate_options['provider'] = $options['provider'];
        }
        if (isset($options['model'])) {
            $generate_options['model'] = $options['model'];
        }
        
        $generate_result = $this->agent->generate($prompt, $generate_options);
        
        if (!$generate_result['success']) {
            return array(
                'success' => false,
                'error' => $generate_result['error']
            );
        }
        
        // Parse JSON response
        $content = $generate_result['content'];
        
        // Debug logging for outline
        if (defined('WP_DEBUG') && WP_DEBUG) {
            $provider = isset($generate_result['provider']) ? $generate_result['provider'] : 'unknown';
            $model = isset($generate_result['model']) ? $generate_result['model'] : 'unknown';
            
            error_log("=== AUTO WRITER DEBUG - OUTLINE ===");
            error_log("Provider: {$provider}");
            error_log("Model: {$model}");
            error_log("Content : " . $content);
            error_log("===================================");
        }
        
        $outline = $this->parse_json_response($content);
        
        if (!$outline || !isset($outline['sections'])) {
            $this->log_debug($options, "Failed to parse JSON. Raw response: " . substr($content, 0, 500));
            
            return array(
                'success' => false,
                'error' => 'Failed to parse outline JSON',
                'raw_response' => $content,  // Include raw response for debugging
                'provider' => $generate_result['provider'] ?? 'unknown',
                'model' => $generate_result['model'] ?? 'unknown'
            );
        }
        
        return array(
            'success' => true,
            'outline' => $outline,
            'debug' => array(
                'prompt' => $prompt,
                'raw_response' => $content,
                'provider' => $generate_result['provider'],
                'model' => $generate_result['model'],
            )
        );
    }
    
    /**
     * Step 2: Viết mở bài (Introduction)
     */
    private function write_introduction($title, $outline, $options) {
        $language = $options['language'];
        $tone = isset($outline['tone']) ? $outline['tone'] : 'professional';
        $analysis = isset($outline['analysis']) ? $outline['analysis'] : '';
        
        $prompt = "Bạn là một chuyên gia viết content. Hãy viết phần MỞ BÀI (Introduction) cho bài viết sau:

TIÊU ĐỀ: \"{$title}\"

BỐI CẢNH:
- Phân tích: {$analysis}
- Tone: {$tone}
- Đối tượng độc giả: " . (isset($outline['target_audience']) ? $outline['target_audience'] : 'General audience') . "

YÊU CẦU MỞ BÀI:
1. Hook: Câu mở đầu thu hút, lôi cuốn người đọc (có thể là câu hỏi, thống kê, hoặc tuyên bố gây shock)
2. Giới thiệu chủ đề: Giới thiệu ngắn gọn về chủ đề bài viết
3. Tầm quan trọng: Giải thích tại sao chủ đề này quan trọng, liên quan đến người đọc
4. Tổng quan nội dung: Nêu ngắn gọn những gì người đọc sẽ học được từ bài viết này
5. Độ dài: 200-300 từ
6. Ngôn ngữ: {$language}

Hãy viết mở bài hấp dẫn, chuyên nghiệp. CHỈ TRẢ VỀ NỘI DUNG MỞ BÀI, KHÔNG CÓ TIÊU ĐỀ HOẶC TEXT PHỤ THÊM. output markdown";

        $generate_options = array(
            'use_case' => 'general',
            'timeout' => 60,
            'connect_timeout' => 12,
            'low_speed_time' => 45,
        );
        
        // Support provider/model from options
        if (isset($options['provider'])) {
            $generate_options['provider'] = $options['provider'];
        }
        if (isset($options['model'])) {
            $generate_options['model'] = $options['model'];
        }
        
        $generate_result = $this->agent->generate($prompt, $generate_options);
        
        if (!$generate_result['success']) {
            return array(
                'success' => false,
                'error' => $generate_result['error']
            );
        }
        
        $content = trim($generate_result['content']);
        
        // Debug logging for introduction
        if (defined('WP_DEBUG') && WP_DEBUG) {
            $provider = isset($generate_result['provider']) ? $generate_result['provider'] : 'unknown';
            $model = isset($generate_result['model']) ? $generate_result['model'] : 'unknown';
            $content_preview = substr($content, 0, 300);
            error_log("=== AUTO WRITER DEBUG - INTRODUCTION ===");
            error_log("Provider: {$provider}");
            error_log("Model: {$model}");
            error_log("Content Preview: " . $content);
            error_log("========================================");
        }
        
        return array(
            'success' => true,
            'content' => $this->markdown_to_html($content)
        );
    }
    
    /**
     * Step 3: Viết từng section chi tiết
     */
    private function write_section($section, $title, $outline, $options) {
        $language = $options['language'];
        $words_per_section = $options['words_per_section'];
        $detailed_level = $options['detailed_level'];
        
        // Xác định số từ cho section
        $target_words = isset($section['estimated_words']) ? $section['estimated_words'] : $words_per_section;
        
        // Tăng số từ dựa trên detailed_level
        if ($detailed_level === 'high') {
            $target_words = max($target_words, 500);
        } elseif ($detailed_level === 'medium') {
            $target_words = max($target_words, 300);
        }
        
        $key_points = isset($section['key_points']) ? implode("\n   - ", $section['key_points']) : '';
        
        $prompt = "Bạn là một chuyên gia viết content chi tiết và chuyên sâu. Hãy viết phần NỘI DUNG CHI TIẾT cho section sau:

BÀI VIẾT TỔNG THỂ: \"{$title}\"

SECTION HIỆN TẠI:
- Tiêu đề section: \"{$section['title']}\"
- Mô tả: {$section['description']}
- Các điểm cần đề cập:
   - {$key_points}

YÊU CẦU:
1. Độ dài: Tối thiểu {$target_words} từ, viết chi tiết và đầy đủ
2. Cấu trúc:
   - Câu mở đầu: Giới thiệu về nội dung section này
   - Nội dung chính: Triển khai chi tiết từng điểm, có ví dụ cụ thể, số liệu (nếu có)
   - Sub-sections: Nếu cần, chia nhỏ thành các phần nhỏ hơn với heading h3, h4
   - Câu chuyển tiếp: Kết nối với section tiếp theo (nếu có)
3. Phong cách:
   - Viết chi tiết, đi sâu vào từng khía cạnh
   - Sử dụng ví dụ thực tế, case study nếu phù hợp
   - Giải thích rõ ràng, dễ hiểu
   - Tránh lặp lại thông tin
4. Format: Sử dụng HTML tags (h3, h4, p, ul, ol, strong, em) để format nội dung
5. Ngôn ngữ: {$language}

QUAN TRỌNG: 
- Hãy viết DÀI và CHI TIẾT, không viết ngắn gọn
- Cung cấp giá trị thực sự cho người đọc
- BẮT ĐẦU nội dung section bằng __STARTSECTION__ và KẾT THÚC bằng __ENDSECTION__
- CHỈ TRẢ VỀ NỘI DUNG SECTION, KHÔNG CÓ TIÊU ĐỀ SECTION (đã có sẵn) HOẶC TEXT PHỤ THÊM, output markdown
- Format output: __STARTSECTION__[nội dung section]__ENDSECTION__";

        $generate_options = array(
            'use_case' => 'long_context',
            'timeout' => 90,
            'connect_timeout' => 12,
            'low_speed_time' => 60,
        );
        
        // Support provider/model from options  
        if (isset($options['provider'])) {
            $generate_options['provider'] = $options['provider'];
        }
        if (isset($options['model'])) {
            $generate_options['model'] = $options['model'];
        }
        
        $generate_result = $this->agent->generate($prompt, $generate_options);
        
        if (!$generate_result['success']) {
            return array(
                'success' => false,
                'error' => $generate_result['error']
            );
        }
        
        $content = trim($generate_result['content']);
        
        // Extract content between __STARTSECTION__ and __ENDSECTION__
        $extracted_content = $this->extract_section_content($content);
        
        // Debug logging for section
        if (defined('WP_DEBUG') && WP_DEBUG) {
            $provider = isset($generate_result['provider']) ? $generate_result['provider'] : 'unknown';
            $model = isset($generate_result['model']) ? $generate_result['model'] : 'unknown';
            $section_title = isset($section['title']) ? $section['title'] : 'unknown';
            $content_preview = substr($extracted_content, 0, 300);
            error_log("=== AUTO WRITER DEBUG - SECTION ===");
            error_log("Section: {$section_title}");
            error_log("Provider: {$provider}");
            error_log("Model: {$model}");
            error_log("Raw Content: " . substr($content, 0, 500));
            error_log("Extracted Content Preview: " . $content_preview);
            error_log("===================================");
        }
        
        return array(
            'success' => true,
            'content' => $this->markdown_to_html($extracted_content)
        );
    }
    
    /**
     * Step 4: Viết kết bài (Conclusion)
     */
    private function write_conclusion($title, $outline, $sections_content, $options) {
        $language = $options['language'];
        
        // Tạo tóm tắt các section để AI nắm được nội dung đã viết
        $sections_summary = array();
        foreach ($sections_content as $section) {
            $sections_summary[] = "- " . $section['title'];
        }
        $sections_list = implode("\n", $sections_summary);
        
        $prompt = "Bạn là một chuyên gia viết content. Hãy viết phần KẾT BÀI (Conclusion) cho bài viết sau:

TIÊU ĐỀ: \"{$title}\"

CÁC PHẦN ĐÃ VIẾT:
{$sections_list}

YÊU CẦU KẾT BÀI:
1. Tóm tắt lại các điểm chính: Nhắc lại ngắn gọn những gì đã bàn luận trong bài
2. Key Takeaways: Liệt kê 3-5 điểm chính người đọc cần nhớ
3. Call-to-Action: Khuyến khích người đọc hành động (áp dụng kiến thức, tìm hiểu thêm, chia sẻ, etc.)
4. Câu kết thúc mạnh mẽ: Để lại ấn tượng cuối cùng cho người đọc
5. Độ dài: 200-250 từ
6. Ngôn ngữ: {$language}
7. tuyệt đối chỉ viết text, không thêm các từ kết bài, kết luận, tóm lại... 
8. output markdown

Hãy viết kết bài súc tích, mạnh mẽ, để lại ấn tượng. CHỈ TRẢ VỀ NỘI DUNG KẾT BÀI, KHÔNG CÓ TIÊU ĐỀ HOẶC TEXT PHỤ THÊM.";

        $generate_options = array(
            'use_case' => 'general',
            'timeout' => 60,
            'connect_timeout' => 12,
            'low_speed_time' => 45,
        );
        
        // Support provider/model from options
        if (isset($options['provider'])) {
            $generate_options['provider'] = $options['provider'];
        }
        if (isset($options['model'])) {
            $generate_options['model'] = $options['model'];
        }
        
        $generate_result = $this->agent->generate($prompt, $generate_options);
        
        if (!$generate_result['success']) {
            return array(
                'success' => false,
                'error' => $generate_result['error']
            );
        }
        
        $content = trim($generate_result['content']);
        
        // Debug logging for conclusion
        if (defined('WP_DEBUG') && WP_DEBUG) {
            $provider = isset($generate_result['provider']) ? $generate_result['provider'] : 'unknown';
            $model = isset($generate_result['model']) ? $generate_result['model'] : 'unknown';
            $content_preview = substr($content, 0, 300);
            error_log("=== AUTO WRITER DEBUG - CONCLUSION ===");
            error_log("Provider: {$provider}");
            error_log("Model: {$model}");
            error_log("Content Preview: " . $content);
            error_log("======================================");
        }
        
        return array(
            'success' => true,
            'content' => $this->markdown_to_html($content)
        );
    }
    
    /**
     * Step 5: Compile full article from all sections
     */
    private function compile_full_article($title, $sections, $options) {
        $html = '';
        
        // Title
        $html .= "<h1>{$title}</h1>\n\n";
        
        // Introduction
        if (isset($sections['introduction'])) {
            $html .= "<div class=\"introduction\">\n";
            $html .= $sections['introduction'];
            $html .= "\n</div>\n\n";
        }
        
        // Main sections
        if (isset($sections['main_sections'])) {
            foreach ($sections['main_sections'] as $index => $section) {
                $section_number = $index + 1;
                $html .= "<section class=\"section-{$section_number}\">\n";
                $html .= "<h2>{$section['title']}</h2>\n";
                $html .= $section['content'];
                $html .= "\n</section>\n\n";
            }
        }
        
        // Conclusion
        if (isset($sections['conclusion'])) {
            $html .= "<div class=\"conclusion\">\n";
            $html .= "<h2>" . ($options['language'] === 'vi' ? 'Kết luận' : 'Conclusion') . "</h2>\n";
            $html .= $sections['conclusion'];
            $html .= "\n</div>\n";
        }
        
        return $html;
    }
    
    /**
     * Parse JSON response from AI
     */
    private function parse_json_response($content) {
        // Remove markdown code blocks if present
        $content = preg_replace('/```json\s*/i', '', $content);
        $content = preg_replace('/```\s*$/i', '', $content);
        $content = trim($content);
        
        // Try to find JSON in the response
        if (preg_match('/\{[\s\S]*\}/', $content, $matches)) {
            $json_str = $matches[0];
            $data = json_decode($json_str, true);
            
            if (json_last_error() === JSON_ERROR_NONE) {
                return $data;
            }
        }
        
        // Fallback: direct decode
        $data = json_decode($content, true);
        if (json_last_error() === JSON_ERROR_NONE) {
            return $data;
        }
        
        // Nếu JSON bị cắt, thử fix bằng cách đóng các thẻ còn thiếu
        if (json_last_error() !== JSON_ERROR_NONE) {
            $fixed_content = $this->try_fix_truncated_json($content);
            if ($fixed_content !== $content) {
                $data = json_decode($fixed_content, true);
                if (json_last_error() === JSON_ERROR_NONE) {
                    return $data;
                }
            }
        }
        
        return null;
    }
    
    /**
     * Try to fix truncated JSON by closing open brackets/braces
     */
    private function try_fix_truncated_json($content) {
        $fixed = trim($content);
        
        // Nếu content rỗng, không thể fix
        if (empty($fixed)) {
            return $content;
        }
        
        // Kiểm tra xem có đang ở giữa một string không (string chưa đóng)
        // Tìm số lượng dấu ngoặc kép không được escape
        $in_string = false;
        $escape_next = false;
        $open_braces = 0;
        $close_braces = 0;
        $open_brackets = 0;
        $close_brackets = 0;
        
        for ($i = 0; $i < strlen($fixed); $i++) {
            $char = $fixed[$i];
            
            if ($escape_next) {
                $escape_next = false;
                continue;
            }
            
            if ($char === '\\') {
                $escape_next = true;
                continue;
            }
            
            if ($char === '"') {
                $in_string = !$in_string;
                continue;
            }
            
            if (!$in_string) {
                if ($char === '{') $open_braces++;
                if ($char === '}') $close_braces++;
                if ($char === '[') $open_brackets++;
                if ($char === ']') $close_brackets++;
            }
        }
        
        // Nếu đang ở giữa một string, đóng string trước
        if ($in_string) {
            // Tìm vị trí bắt đầu của string cuối cùng
            $last_quote_pos = strrpos($fixed, '"');
            if ($last_quote_pos !== false) {
                // Kiểm tra xem có phải là escape không
                $before_quote = substr($fixed, 0, $last_quote_pos);
                $escape_count = 0;
                for ($j = $last_quote_pos - 1; $j >= 0 && $fixed[$j] === '\\'; $j--) {
                    $escape_count++;
                }
                // Nếu số lượng \ là lẻ, thì đây là escape, không phải string mới
                // Nếu là chẵn hoặc 0, thì đây là string mới chưa đóng
                if ($escape_count % 2 === 0) {
                    // Đóng string
                    $fixed .= '"';
                }
            } else {
                // Không tìm thấy dấu ngoặc kép, có thể bị cắt hoàn toàn
                // Thử thêm dấu ngoặc kép để đóng string
                $fixed .= '"';
            }
        }
        
        // Đóng các brackets còn thiếu (phải đóng trước braces)
        if ($open_brackets > $close_brackets) {
            $missing_brackets = $open_brackets - $close_brackets;
            // Thêm dấu phẩy nếu cần (nếu ký tự cuối không phải là dấu phẩy hoặc dấu ngoặc)
            $last_char = substr(trim($fixed), -1);
            if (!in_array($last_char, array(',', '[', '{', ']', '}'))) {
                // Có thể cần thêm dấu phẩy, nhưng để đơn giản, chỉ đóng brackets
            }
            for ($i = 0; $i < $missing_brackets; $i++) {
                $fixed .= ']';
            }
        }
        
        // Đóng các braces còn thiếu
        if ($open_braces > $close_braces) {
            $missing_braces = $open_braces - $close_braces;
            for ($i = 0; $i < $missing_braces; $i++) {
                $fixed .= '}';
            }
        }
        
        return $fixed;
    }
    
    /**
     * Extract content between __STARTSECTION__ and __ENDSECTION__ markers
     * 
     * @param string $content Raw content from AI
     * @return string Extracted content, or original content if markers not found
     */
    private function extract_section_content($content) {
        // First, try to find content between markers (case-insensitive, with optional whitespace)
        if (preg_match('/__STARTSECTION__\s*(.*?)\s*__ENDSECTION__/is', $content, $matches)) {
            $extracted = trim($matches[1]);
            // Remove any remaining markers that might be inside the extracted content
            $extracted = preg_replace('/__STARTSECTION__/i', '', $extracted);
            $extracted = preg_replace('/__ENDSECTION__/i', '', $extracted);
            return $extracted;
        }
        
        // If no complete pair found, remove all markers from content
        $cleaned = preg_replace('/__STARTSECTION__/i', '', $content);
        $cleaned = preg_replace('/__ENDSECTION__/i', '', $cleaned);
        
        return trim($cleaned);
    }
    
    /**
     * Convert markdown to HTML
     */
    private function markdown_to_html($content) {
        // Check if content already appears to be HTML
        if (preg_match('/<[^>]+>/', $content)) {
            return $content; // Already HTML, return as-is
        }
        
        // Load Parsedown if not already loaded
        if (!class_exists('Parsedown')) {
            $parsedown_path = plugin_dir_path(dirname(dirname(__FILE__))) . 'lib/Parsedown.php';
            if (file_exists($parsedown_path)) {
                require_once $parsedown_path;
            }
        }
        
        // Convert markdown to HTML
        if (class_exists('Parsedown')) {
            $parsedown = new Parsedown();
            return $parsedown->text($content);
        }
        
        // Fallback: simple markdown conversion
        return $this->simple_markdown_to_html($content);
    }
    
    /**
     * Simple markdown to HTML fallback
     */
    private function simple_markdown_to_html($text) {
        // Convert headers
        $text = preg_replace('/^#### (.*$)/m', '<h4>$1</h4>', $text);
        $text = preg_replace('/^### (.*$)/m', '<h3>$1</h3>', $text);
        $text = preg_replace('/^## (.*$)/m', '<h2>$1</h2>', $text);
        $text = preg_replace('/^# (.*$)/m', '<h1>$1</h1>', $text);
        
        // Convert bold
        $text = preg_replace('/\*\*(.*?)\*\*/', '<strong>$1</strong>', $text);
        $text = preg_replace('/__(.*?)__/', '<strong>$1</strong>', $text);
        
        // Convert italic
        $text = preg_replace('/\*(.*?)\*/', '<em>$1</em>', $text);
        $text = preg_replace('/_(.*?)_/', '<em>$1</em>', $text);
        
        // Convert links
        $text = preg_replace('/\[([^\]]+)\]\(([^)]+)\)/', '<a href="$2">$1</a>', $text);
        
        // Convert unordered lists
        $text = preg_replace('/^\* (.*)$/m', '<li>$1</li>', $text);
        $text = preg_replace('/^- (.*)$/m', '<li>$1</li>', $text);
        $text = preg_replace('/(<li>.*<\/li>\n)+/', '<ul>$0</ul>', $text);
        
        // Convert line breaks
        $text = nl2br($text);
        
        return $text;
    }
    
    /**
     * Tìm và chèn hình ảnh phù hợp cho section
     * 
     * @param string $content Nội dung section (HTML)
     * @param string $section_title Tiêu đề section
     * @param array $options Options
     * @param AIAutoTool_SSE_Stream|null $stream Stream instance (optional)
     * @return string Content với hình ảnh đã chèn
     */
    private function find_and_insert_image_for_section($content, $section_title, $options, $stream = null) {
        // Kiểm tra xem có BardGenContent không
        if (!class_exists('BardGenContent')) {
            $bard_file = plugin_dir_path(dirname(dirname(__FILE__))) . 'lib/bard.php';
            if (file_exists($bard_file)) {
                require_once $bard_file;
            }
        }
        
        if (!class_exists('BardGenContent')) {
            $this->log_debug($options, "BardGenContent class not found, skipping image search");
            return $content;
        }
        
        try {
            if ($stream) {
                $stream->send_status("Đang tìm hình ảnh cho section: {$section_title}...");
            }
            
            // Lấy nội dung section để tạo query tốt hơn
            $section_content_plain = strip_tags($content);
            $section_content_plain = mb_substr($section_content_plain, 0, 500, 'UTF-8');
            
            // Tạo query tìm kiếm hình ảnh
            $image_search_query = $section_title;
            
            // Nếu có nội dung section, dùng AI để tạo query tốt hơn
            if (!empty($section_content_plain) && strlen($section_content_plain) > 20) {
                $language = $options['language'];
                $lang_instruction = $language === 'vi' 
                    ? "Bạn là một chuyên gia tạo từ khóa tìm kiếm hình ảnh. "
                    : "You are an expert at creating image search keywords. ";
                
                $query_prompt = $lang_instruction;
                $query_prompt .= ($language === 'vi' 
                    ? "Tạo một từ khóa tìm kiếm hình ảnh ngắn gọn (3-5 từ) phù hợp với section sau:\n\n"
                    : "Create a short (3-5 words) image search keyword suitable for the following section:\n\n");
                $query_prompt .= ($language === 'vi' ? "Tiêu đề section: " : "Section title: ") . "{$section_title}\n";
                $query_prompt .= ($language === 'vi' ? "Nội dung section: " : "Section content: ") . mb_substr($section_content_plain, 0, 300, 'UTF-8') . "\n\n";
                $query_prompt .= ($language === 'vi' 
                    ? "Yêu cầu:\n- Chỉ trả về từ khóa tìm kiếm, không có giải thích\n- Từ khóa phải phù hợp để tìm hình ảnh minh họa\n- Tối đa 5 từ\n\nChỉ trả về từ khóa tìm kiếm:"
                    : "Requirements:\n- Return only the search keyword, no explanation\n- Keyword must be suitable for finding illustrative images\n- Maximum 5 words\n\nReturn only the search keyword:");
                
                $query_options = array(
                    'max_tokens' => 50,
                    'temperature' => 0.7,
                    'use_case' => 'fast'
                );
                
                // Support provider/model from options
                if (isset($options['provider'])) {
                    $query_options['provider'] = $options['provider'];
                }
                if (isset($options['model'])) {
                    $query_options['model'] = $options['model'];
                }
                
                $query_result = $this->agent->generate($query_prompt, $query_options);
                
                if ($query_result['success']) {
                    $generated_query = trim($query_result['content']);
                    $generated_query = strip_tags($generated_query);
                    $generated_query = preg_replace('/["\']/', '', $generated_query);
                    if (!empty($generated_query) && strlen($generated_query) > 3) {
                        $image_search_query = $generated_query;
                    }
                }
            }
            
            // Tìm hình ảnh
            $bard = new BardGenContent();
            $image_results = $bard->searchimg($image_search_query);
            
            // Xử lý kết quả tìm kiếm
            $image_array = null;
            if (is_array($image_results) && !empty($image_results)) {
                $image_array = $image_results;
            } elseif (is_object($image_results) && isset($image_results->result) && is_array($image_results->result) && !empty($image_results->result)) {
                $image_array = $image_results->result;
            } elseif (isset($image_results['result']) && is_array($image_results['result']) && !empty($image_results['result'])) {
                $image_array = $image_results['result'];
            }
            
            if ($image_array && !empty($image_array)) {
                $selected_image = $image_array[0];
                
                // Tạo HTML cho hình ảnh
                $image_html = '<p><img src="' . esc_url($selected_image) . '" alt="' . esc_attr($section_title) . '" class="aligncenter size-medium" style="max-width: 100%; height: auto;" /></p>';
                
                // Tìm vị trí tốt nhất để chèn hình ảnh
                $insert_position = 0;
                
                // Ưu tiên 1: Chèn sau thẻ h2 hoặc h3 đầu tiên (nếu có)
                if (preg_match('/<h[23][^>]*>.*?<\/h[23]>/is', $content, $matches, PREG_OFFSET_CAPTURE)) {
                    $insert_position = $matches[0][1] + strlen($matches[0][0]);
                }
                // Ưu tiên 2: Chèn sau đoạn văn đầu tiên (nếu có)
                elseif (preg_match('/<p[^>]*>.*?<\/p>/is', $content, $matches, PREG_OFFSET_CAPTURE)) {
                    $insert_position = $matches[0][1] + strlen($matches[0][0]);
                }
                // Ưu tiên 3: Chèn sau thẻ div đầu tiên (nếu có)
                elseif (preg_match('/<div[^>]*>/i', $content, $matches, PREG_OFFSET_CAPTURE)) {
                    $insert_position = $matches[0][1] + strlen($matches[0][0]);
                }
                // Fallback: Chèn vào đầu content
                else {
                    $insert_position = 0;
                }
                
                // Chèn hình ảnh vào vị trí tìm được
                $content = substr_replace($content, "\n" . $image_html . "\n", $insert_position, 0);
                
                if ($stream) {
                    $stream->send_status("✓ Đã tìm và chèn hình ảnh cho section: {$section_title}");
                }
                $this->log_debug($options, "Image found and inserted for section: {$section_title}");
            } else {
                // Fallback: thử tìm với tiêu đề section
                if ($image_search_query !== $section_title) {
                    $image_results = $bard->searchimg($section_title);
                    
                    $image_array = null;
                    if (is_array($image_results) && !empty($image_results)) {
                        $image_array = $image_results;
                    } elseif (is_object($image_results) && isset($image_results->result) && is_array($image_results->result) && !empty($image_results->result)) {
                        $image_array = $image_results->result;
                    } elseif (isset($image_results['result']) && is_array($image_results['result']) && !empty($image_results['result'])) {
                        $image_array = $image_results['result'];
                    }
                    
                    if ($image_array && !empty($image_array)) {
                        $selected_image = $image_array[0];
                        $image_html = '<p><img src="' . esc_url($selected_image) . '" alt="' . esc_attr($section_title) . '" class="aligncenter size-medium" style="max-width: 100%; height: auto;" /></p>';
                        
                        // Tìm vị trí tốt nhất để chèn hình ảnh
                        $insert_position = 0;
                        
                        // Ưu tiên 1: Chèn sau thẻ h2 hoặc h3 đầu tiên (nếu có)
                        if (preg_match('/<h[23][^>]*>.*?<\/h[23]>/is', $content, $matches, PREG_OFFSET_CAPTURE)) {
                            $insert_position = $matches[0][1] + strlen($matches[0][0]);
                        }
                        // Ưu tiên 2: Chèn sau đoạn văn đầu tiên (nếu có)
                        elseif (preg_match('/<p[^>]*>.*?<\/p>/is', $content, $matches, PREG_OFFSET_CAPTURE)) {
                            $insert_position = $matches[0][1] + strlen($matches[0][0]);
                        }
                        // Ưu tiên 3: Chèn sau thẻ div đầu tiên (nếu có)
                        elseif (preg_match('/<div[^>]*>/i', $content, $matches, PREG_OFFSET_CAPTURE)) {
                            $insert_position = $matches[0][1] + strlen($matches[0][0]);
                        }
                        // Fallback: Chèn vào đầu content
                        else {
                            $insert_position = 0;
                        }
                        
                        $content = substr_replace($content, "\n" . $image_html . "\n", $insert_position, 0);
                        
                        if ($stream) {
                            $stream->send_status("✓ Đã tìm và chèn hình ảnh cho section: {$section_title}");
                        }
                        $this->log_debug($options, "Image found and inserted for section (fallback): {$section_title}");
                    } else {
                        if ($stream) {
                            $stream->send_status("⚠ Không tìm thấy hình ảnh phù hợp cho section: {$section_title}");
                        }
                        $this->log_debug($options, "No image found for section: {$section_title}");
                    }
                } else {
                    if ($stream) {
                        $stream->send_status("⚠ Không tìm thấy hình ảnh phù hợp cho section: {$section_title}");
                    }
                    $this->log_debug($options, "No image found for section: {$section_title}");
                }
            }
            
        } catch (Exception $e) {
            $this->log_debug($options, "Error finding image for section {$section_title}: " . $e->getMessage());
            if ($stream) {
                $stream->send_status("⚠ Lỗi khi tìm hình ảnh cho section: {$section_title}");
            }
        }
        
        return $content;
    }
    
    /**
     * Stream status message in chunks of 10 characters
     * 
     * @param AIAutoTool_SSE_Stream $stream SSE stream instance
     * @param string $message Message to stream
     * @param int $chunk_size Number of characters per chunk (default: 10)
     */
    private function stream_status_chunked($stream, $message, $chunk_size = 10) {
        $message_length = mb_strlen($message, 'UTF-8');
        $accumulated = '';
        $message_id = 'chunk_' . uniqid(); // Unique ID for this message stream
        
        for ($i = 0; $i < $message_length; $i += $chunk_size) {
            $chunk = mb_substr($message, $i, $chunk_size, 'UTF-8');
            $accumulated .= $chunk;
            
            // Send with special prefix and message ID so JavaScript can update existing item
            $stream->send('status_chunk', array(
                'message' => $accumulated,
                'message_id' => $message_id,
                'is_complete' => ($i + $chunk_size >= $message_length),
                'timestamp' => current_time('mysql')
            ));
            
            usleep(30000); // Small delay for streaming effect (30ms)
        }
    }
    
    /**
     * Log debug message
     */
    private function log_debug($options, $message) {
        if (isset($options['debug']) && $options['debug']) {
            error_log("[AI Auto Writer] " . $message);
        }
    }
}

// Initialize
function aiautotool_ai_auto_writer() {
    return AIAutotool_AI_Auto_Writer::get_instance();
}
