<?php
declare(strict_types=1);

// Read only the isolated A-original HTTP logs; never print message/SQL/params.
$root = '/tmp/zhct-http-ai-macos.zjaU8h/runtime/api/log/';
$target = '/api/analysis.Analysis/daily';
$out = [];
foreach (['20261002_error.log', '20261002_info.log', '20261002_sql.log'] as $file) {
    $path = $root . $file;
    if (!is_file($path)) continue;
    foreach (file($path, FILE_IGNORE_NEW_LINES) ?: [] as $line) {
        $row = json_decode($line, true);
        if (!is_array($row)) continue;
        $url = (string)($row['url'] ?? '');
        if (parse_url($url, PHP_URL_PATH) !== $target) continue;
        $message = is_string($row['messages'] ?? null)
            ? $row['messages'] : json_encode($row['messages'] ?? []);
        $sqlstate = null;
        $stateContext = null;
        if (preg_match('/SQLSTATE\[([A-Z0-9]+)\]/i', $message, $match)) {
            $sqlstate = strtoupper($match[1]);
            $position = strpos($message, $match[0]);
            $context = substr($message, (int)$position, 190);
            $context = preg_replace("/'(?:''|[^'])*'/", '?', $context);
            $context = preg_replace('/\b[0-9]+(?:\.[0-9]+)?\b/', '#', $context);
            $context = preg_replace('/CDXPAR[A-Z0-9]+/', '[synthetic-marker]', $context);
            $stateContext = preg_replace('/\s+/', ' ', $context);
        }
        $nativeCode = null;
        if (preg_match('/General error:\s*([0-9]{3,6})/i', $message, $match)) {
            $nativeCode = $match[1];
        }
        $sql = (string)($row['error_sql'] ?? '');
        $sql = preg_replace("/'(?:''|[^'])*'/", '?', $sql);
        $sql = preg_replace('/\b[0-9]+(?:\.[0-9]+)?\b/', '#', $sql);
        $sql = preg_replace('/\s+/', ' ', $sql);
        $sqlShape = $sql !== '' ? substr($sql, 0, 550) : null;
        preg_match_all('/\b(?:YOSHOP|YDY)_[A-Z0-9_]+\b/i', $message, $tables);
        $tableNames = array_values(array_unique(array_map('strtoupper', $tables[0] ?? [])));
        $column = null;
        if (preg_match('/(?:unknown column|invalid identifier|列名无效|无效列)\s*[`"\']?([A-Z_][A-Z0-9_]*)/i',
            $message, $match)) {
            $column = strtoupper($match[1]);
        }
        $out[] = [
            'file_kind' => substr($file, 9, -4),
            'time' => (string)($row['time'] ?? ''),
            'log_type' => (string)($row['log_type'] ?? ''),
            'runtime_seconds' => is_numeric($row['runtime'] ?? null)
                ? round((float)$row['runtime'], 3) : null,
            'sqlstate' => $sqlstate,
            'sqlstate_context_redacted' => $stateContext,
            'native_error_code' => $nativeCode,
            'sql_shape_literals_redacted' => $sqlShape,
            'tables_mentioned' => $tableNames,
            'column_mentioned' => $column,
            'contains_group_by' => stripos($message, 'group by') !== false,
            'contains_order_by' => stripos($message, 'order by') !== false,
            'contains_sql_error' => stripos($message, 'sql') !== false,
            'contains_missing_store_user_id' =>
                strpos($message, 'store_user_id') !== false,
            'contains_undefined_index' =>
                stripos($message, 'Undefined index') !== false,
            'source_is_common_store_user' =>
                strpos((string)($row['file'] ?? ''),
                    '/app/common/service/store/User.php') !== false,
            'source_file_basename' => basename((string)($row['file'] ?? '')),
            'source_line' => is_numeric($row['line'] ?? null)
                ? (int)$row['line'] : null,
        ];
    }
}
echo json_encode(['status' => 'sanitized-a-daily-log-summary',
    'matching_entries' => count($out), 'last_entries' => array_slice($out, -12)],
    JSON_UNESCAPED_SLASHES), PHP_EOL;
