<?php
/**
 * SQL 接口：仅 POST，参数 sqlkey、sql。
 * 支持：表单 POST（x-www-form-urlencoded / multipart）或 JSON 请求体（Content-Type: application/json）。
 * PHP 不会把 JSON 填进 $_POST，必须用 raw JSON 时请加正确 Content-Type 或使用下方对「裸 JSON」的兼容解析。
 */
error_reporting(0);
header('Content-Type: application/json; charset=utf-8');
define('SYSTEM_ROOT', dirname(__FILE__) . '/');
define('ROOT', dirname(SYSTEM_ROOT) . '/');
date_default_timezone_set('Asia/Shanghai');
include_once ROOT . 'includes/autoloader.php';
Autoloader::register();
require ROOT . 'config.php';
$DB = new \lib\PdoHelper($dbconfig);

function sql_api_exit($code, $msg, $data = null) {
    $out = ['code' => (int)$code, 'msg' => (string)$msg];
    if ($data !== null) {
        $out['data'] = $data;
    }
    exit(json_encode($out, JSON_UNESCAPED_UNICODE));
}

function sql_api_is_query($sql) {
    $s = trim((string)$sql);
    $s = preg_replace('/\/\*[\s\S]*?\*\//', '', $s);
    $s = preg_replace('/^\s*(--|#)[^\r\n]*/m', '', $s);
    $s = trim($s);
    return $s !== '' && (bool)preg_match('/^(SELECT|SHOW|DESCRIBE|DESC|EXPLAIN|WITH)\b/is', $s);
}

if (($_SERVER['REQUEST_METHOD'] ?? '') !== 'POST') {
    sql_api_exit(-1, '仅允许 POST 请求');
}

$ct = isset($_SERVER['CONTENT_TYPE']) ? strtolower(trim(explode(';', (string)$_SERVER['CONTENT_TYPE'], 2)[0])) : '';
$p = [];
if ($ct === 'application/json' || $ct === 'application/jsonrequest' || $ct === 'text/json') {
    $rawIn = file_get_contents('php://input');
    $j = json_decode($rawIn, true);
    if (!is_array($j)) {
        sql_api_exit(-1, 'JSON 请求体无效，请检查格式与 Content-Type');
    }
    $p = $j;
} else {
    $p = $_POST;
    if (empty($p)) {
        $rawIn = file_get_contents('php://input');
        $t = ltrim((string)$rawIn);
        if ($t !== '' && ($t[0] === '{' || $t[0] === '[')) {
            $j = json_decode($rawIn, true);
            if (is_array($j)) {
                $p = $j;
            }
        }
    }
}

$r = $DB->getRow("SELECT v FROM `pre_config` WHERE k='sqlkey' LIMIT 1");
$sqlSecret = $r ? trim((string)$r['v']) : '';
if ($sqlSecret === '') {
    sql_api_exit(-1, '请先在后台【网站信息配置】设置 SQL 操作密匙（sqlkey）');
}
$got = isset($p['sqlkey']) ? trim((string)$p['sqlkey']) : '';
if ($got === '' || !hash_equals($sqlSecret, $got)) {
    sql_api_exit(-1, 'sqlkey 错误或未提交');
}

if (!isset($p['sql']) || trim((string)$p['sql']) === '') {
    sql_api_exit(-1, '缺少参数 sql');
}
$sql = trim((string)$p['sql']);
$sql = preg_replace('/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/u', '', $sql);

if (sql_api_is_query($sql)) {
    $rows = $DB->getAll($sql);
    if ($rows === false) {
        sql_api_exit(-1, '查询失败：' . $DB->error());
    }
    sql_api_exit(1, 'success', $rows);
}

$n = $DB->exec($sql);
if ($n === false) {
    sql_api_exit(-1, '执行失败：' . $DB->error());
}
$data = ['affected' => (int)$n];
$lid = $DB->lastInsertId();
if ($lid !== false && $lid !== '' && $lid !== '0') {
    $data['lastInsertId'] = $lid;
}
sql_api_exit(1, 'success', $data);
