<?php
/**
 * WordPress API 控制器 - AdSense 文章生成专用
 * 直接加载 WordPress 并批量创建文章
 */

// 安全令牌
define('API_TOKEN', 'AdSense2024SecretToken');

// 加载 WordPress
$wp_load_paths = [
    __DIR__ . '/wp-load.php',
    dirname(__DIR__) . '/wp-load.php',
];

foreach ($wp_load_paths as $path) {
    if (file_exists($path)) {
        require_once($path);
        break;
    }
}

if (!defined('ABSPATH')) {
    die(json_encode(['status' => 'error', 'message' => 'WordPress not loaded']));
}

// 设置 headers
header('Content-Type: application/json; charset=UTF-8');

// 认证
$headers = getallheaders();
$auth = isset($headers['Authorization']) ? $headers['Authorization'] : '';
$token = str_replace('Bearer ', '', $auth);

if ($token !== API_TOKEN) {
    http_response_code(401);
    die(json_encode(['status' => 'error', 'message' => 'Unauthorized']));
}

// 获取请求数据
$input = file_get_contents('php://input');
$data = json_decode($input, true);

$command = isset($data['command']) ? $data['command'] : '';
$payload = isset($data['payload']) ? $data['payload'] : [];

// 执行命令
switch ($command) {
    case 'create_articles':
        $categories = $payload['categories'] ?? [];
        $articles_per_category = $payload['articles_per_category'] ?? 8;
        
        $total_created = 0;
        $base_date = strtotime('-60 days');
        $results = [];
        
        foreach ($categories as $cat_name) {
            // 创建分类
            $cat_id = wp_create_category($cat_name);
            
            for ($i = 1; $i <= $articles_per_category; $i++) {
                $title = "Complete Guide to $cat_name: Everything You Need to Know (Part $i)";
                
                $content = "<h2>Introduction to $cat_name</h2>
<p>Welcome to our comprehensive guide on $cat_name. This detailed article provides essential information.</p>

<h2>Key Information</h2>
<p>Understanding $cat_name is crucial for success. Our expert team has researched extensively.</p>

<h3>Important Points</h3>
<ul>
<li>First essential concept about $cat_name</li>
<li>Second important element to understand</li>
<li>Third critical factor for success</li>
<li>Fourth vital component</li>
<li>Fifth key consideration</li>
</ul>

<h2>Detailed Analysis</h2>
<p>This section provides detailed information about $cat_name.</p>

<h2>Practical Recommendations</h2>
<ol>
<li>Start with thorough research</li>
<li>Consult with qualified professionals</li>
<li>Keep detailed records</li>
<li>Stay informed about changes</li>
<li>Plan for the long term</li>
</ol>

<h2>FAQ</h2>
<h3>What is most important?</h3>
<p>Understanding the fundamentals thoroughly.</p>

<h3>How long does it take?</h3>
<p>Timeline varies from weeks to months.</p>

<h2>Conclusion</h2>
<p>Understanding $cat_name is essential for success.</p>" . str_repeat("<p>Additional detailed information about $cat_name to ensure sufficient content length.</p>", 10);
                
                $days_offset = rand(0, 60);
                $hours_offset = rand(0, 23);
                $post_date = date('Y-m-d H:i:s', $base_date + ($days_offset * 86400) + ($hours_offset * 3600));
                
                $post_id = wp_insert_post([
                    'post_title' => $title,
                    'post_content' => $content,
                    'post_status' => 'publish',
                    'post_type' => 'post',
                    'post_date' => $post_date,
                    'post_category' => [$cat_id]
                ]);
                
                if ($post_id && !is_wp_error($post_id)) {
                    $total_created++;
                    $results[] = [
                        'id' => $post_id,
                        'title' => $title,
                        'category' => $cat_name
                    ];
                }
            }
        }
        
        echo json_encode([
            'status' => 'success',
            'message' => "Created $total_created articles",
            'data' => [
                'total' => $total_created,
                'articles' => $results
            ]
        ]);
        break;
        
    case 'get_stats':
        $post_count = wp_count_posts('post')->publish;
        $page_count = wp_count_posts('page')->publish;
        
        echo json_encode([
            'status' => 'success',
            'data' => [
                'site_name' => get_bloginfo('name'),
                'posts' => $post_count,
                'pages' => $page_count
            ]
        ]);
        break;
        
    default:
        echo json_encode(['status' => 'error', 'message' => 'Unknown command']);
}
?>
