<?php

declare(strict_types=1);

$root = getenv('POC_TARGET_ROOT');
$url = getenv('POC_BASE_URL');
$dialect = getenv('POC_DIALECT');
if (!$root || !$url || !in_array($dialect, ['mysql', 'dm'], true)) exit(2);
$main = (require $root . '/config/database.php')['connections']['mysql'];
$dsn = $dialect === 'dm'
    ? 'dm:host=' . $main['hostname'] . ';port=' . $main['hostport'] . ';schema=' . $main['database']
    : 'mysql:host=' . $main['hostname'] . ';port=' . $main['hostport'] . ';dbname=' . $main['database'] . ';charset=utf8mb4';
$pdo = new PDO($dsn, $main['username'], $main['password'], [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]);
$table = $dialect === 'dm' ? 'YOSHOP_ACTIVITY' : 'yoshop_activity';
$sql = "SELECT ID,TITLE FROM $table WHERE STORE_ID=10001 AND STATUS=1 ORDER BY CREATE_TIME DESC,ID DESC "
    . ($dialect === 'dm' ? 'FETCH FIRST 3 ROWS ONLY' : 'LIMIT 3');
$rows = $pdo->query($sql)->fetchAll(PDO::FETCH_ASSOC);
$expected = array_map(static function (array $row): array {
    $row = array_change_key_case($row, CASE_LOWER);
    return ['id' => (int)$row['id'], 'title' => (string)$row['title']];
}, $rows);
if (!$expected) {
    echo json_encode(['dialect' => $dialect, 'status' => 'fixture_missing']) . PHP_EOL;
    exit(3);
}
$base = rtrim($url, '/');
$listBody = file_get_contents($base . '/api/activity/list?storeId=10001&pagesize=3');
$list = is_string($listBody) ? json_decode($listBody, true) : null;
if (!is_array($list) || (int)($list['status'] ?? 0) !== 200) {
    throw new RuntimeException('Activity list HTTP request failed');
}
$actual = array_map(static function (array $row): array {
    return ['id' => (int)($row['id'] ?? 0), 'title' => (string)($row['title'] ?? '')];
}, (array)($list['data']['list']['data'] ?? []));
if ($actual !== $expected) throw new RuntimeException('Activity list differs from database');
$id = $expected[0]['id'];
$detailBody = file_get_contents($base . '/api/activity/detail?storeId=10001&id=' . $id);
$detail = is_string($detailBody) ? json_decode($detailBody, true) : null;
if (!is_array($detail) || (int)($detail['status'] ?? 0) !== 200
    || (int)($detail['data']['id'] ?? 0) !== $id
    || (string)($detail['data']['title'] ?? '') !== $expected[0]['title']) {
    throw new RuntimeException('Activity detail differs from database');
}
echo json_encode(['dialect' => $dialect, 'status' => 'passed',
    'list_rows' => count($actual), 'list_and_detail_match_database' => true]) . PHP_EOL;
