<?php
declare(strict_types=1);
/**
 * 自新手村公開 API 同步店家主檔至 fate.spa_store_snapshots（不含 Google 評論陣列、不含技師）。
 *
 * CLI：php admin/sync_spa_stores.php [--force]（或根目錄 sync_spa_stores.php 相容轉發）
 * 網頁：admin/sync_spa_stores.php?token=與 FATE_SYNC_HTTP_TOKEN 相同（須先設定 token；空字串僅允許 CLI）
 * 後台：請使用 /admin/sync.php 觸發同步（以會員表 admin 帳號登入）
 */
require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . 'config' . DIRECTORY_SEPARATOR . 'app.php';
require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . 'includes' . DIRECTORY_SEPARATOR . 'spa_store_sync.php';
require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . 'config' . DIRECTORY_SEPARATOR . 'pdo.php';

$isCli = PHP_SAPI_NAME() === 'cli';

if (!isset($pdo) || !$pdo instanceof PDO) {
    if ($isCli) {
        fwrite(STDERR, "無法取得 fate PDO（請確認 config/db.php 與 fate 資料庫）。\n");
        exit(1);
    }
    header('Content-Type: text/plain; charset=UTF-8', true, 500);
    echo 'fate 資料庫未就緒。';
    exit;
}

$force = $isCli && in_array('--force', $argv ?? [], true);
if (!$isCli) {
    if (FATE_SYNC_HTTP_TOKEN === '') {
        header('Content-Type: text/plain; charset=UTF-8', true, 403);
        echo '已停用網頁觸發：請設定環境變數 FATE_SYNC_HTTP_TOKEN，或使用 CLI 或 /admin/ 執行。';
        exit;
    }
    $tok = isset($_GET['token']) ? (string) $_GET['token'] : '';
    if (!hash_equals(FATE_SYNC_HTTP_TOKEN, $tok)) {
        header('Content-Type: text/plain; charset=UTF-8', true, 403);
        echo 'token 不正確。';
        exit;
    }
    $force = isset($_GET['force']) && ($_GET['force'] === '1' || $_GET['force'] === 'true');
}

$result = fate_run_spa_store_sync($pdo, $force, $isCli);
$stats = $result['stats'];
$totalCatalog = $result['catalog_total'];

$outJson = json_encode(
    array_merge(
        ['ok' => $result['ok']],
        $stats,
        ['catalog_total' => $totalCatalog],
        ['diagnostics' => $result['diagnostics'] ?? []]
    ),
    JSON_UNESCAPED_UNICODE
);

if ($isCli) {
    echo ($outJson !== false ? $outJson : '{"ok":false}') . "\n";
    exit(!empty($result['ok']) ? 0 : 1);
}

header('Content-Type: application/json; charset=UTF-8');
echo $outJson !== false ? $outJson : '{"ok":false}';
