<?php
declare(strict_types=1);

require_once dirname(__DIR__) . '/core/bootstrap.php';
require_admin();
require_admin_access('automation.php');

header('Cache-Control: no-store, private, max-age=0');

if (!request_is_post()) {
    json_response(['ok' => false, 'message' => 'Geçersiz istek.'], 405);
}

verify_csrf();

$id = (int) ($_POST['id'] ?? 0);
$step = (int) ($_POST['step'] ?? 1);
$total = (int) ($_POST['total'] ?? 1);

if ($id < 1 || $step < 1 || $total < 1 || $total > 255) {
    json_response(['ok' => false, 'message' => 'Otomasyon çalışma bilgileri geçersiz.'], 422);
}

try {
    $stmt = db()->prepare('SELECT * FROM content_automations WHERE id=? LIMIT 1');
    $stmt->execute([$id]);
    $automation = $stmt->fetch();
    if (!$automation) {
        json_response(['ok' => false, 'message' => 'Otomasyon bulunamadı.'], 404);
    }

    $topicCount = count(automation_topics($automation));
    $allowedTotal = $topicCount;
    if ($total !== $allowedTotal || $step > $total) {
        json_response(['ok' => false, 'message' => 'Otomasyon adedi sayfadaki kayıtla uyuşmuyor. Sayfayı yenileyin.'], 409);
    }

    @set_time_limit(95);
    ignore_user_abort(true);
    if (session_status() === PHP_SESSION_ACTIVE) {
        session_write_close();
    }

    $result = run_content_automation_step($automation, $step, $total);
    json_response([
        'ok' => true,
        'message' => $result['finished']
            ? $result['total'] . ' makale başarıyla oluşturuldu.'
            : $result['progress'] . '/' . $result['total'] . ' makale oluşturuldu.',
        'result' => $result,
    ]);
} catch (Throwable $e) {
    if ($e instanceof GeminiArticleException && !empty($automation)) {
        try {
            $result = record_content_automation_step_failure($automation, $step, $total, $e->getMessage());
            json_response([
                'ok' => true,
                'message' => 'Bu konu atlandı, diğer konulara devam ediliyor.',
                'result' => $result,
            ]);
        } catch (Throwable $recordError) {
            $e = $recordError;
        }
    }

    try {
        db()->prepare('UPDATE content_automations SET last_run_at=NOW(),last_result=?,next_run_at=NULL,updated_at=NOW() WHERE id=?')
            ->execute(['Hata: ' . mb_substr($e->getMessage(), 0, 900), $id]);
    } catch (Throwable) {
    }

    json_response([
        'ok' => false,
        'message' => $e->getMessage(),
    ], 500);
}
