<?php
/**
 * IKEv2 프로비저닝 관리자 API (쇼핑몰 서버 전용)
 * VPN 관리 서버(183.108.10.158)의 vpn_users.php 에서 HMAC 인증 후 호출
 *
 * 지원 operations:
 *  - list_manual_required : manual_required 상태 큐 목록 반환
 *  - manual_retry         : 수동 재시도 (서버IP 변경 + 만료일 재산정)
 *  - queue_stats          : 큐 현황 요약
 */

if (php_sapi_name() === 'cli') {
    exit(0);
}

header('Content-Type: application/json; charset=utf-8');

// 공유 시크릿 로드 (ikev2_provision.lib.php 와 동일한 시크릿 파일 사용)
$_secretFile = dirname(__DIR__) . '/mylib/ikev2_secret.php';
$_secretArr = is_file($_secretFile) ? @include $_secretFile : array();
$SHARED_SECRET = is_array($_secretArr) && isset($_secretArr['IKEV2_PROVISION_SHARED_SECRET'])
    ? trim((string)$_secretArr['IKEV2_PROVISION_SHARED_SECRET'])
    : '';

if (strlen($SHARED_SECRET) < 32) {
    http_response_code(500);
    echo json_encode(array('ok' => false, 'error' => 'shared_secret_missing'));
    exit;
}

function _prov_api_emit($data) {
    echo json_encode($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
    exit;
}

// HMAC 서명 검증
$rawBody = file_get_contents('php://input');
$sig = isset($_SERVER['HTTP_X_PROV_SIG']) ? trim($_SERVER['HTTP_X_PROV_SIG']) : '';
if ($sig === '' || !hash_equals(hash_hmac('sha256', $rawBody, $SHARED_SECRET), $sig)) {
    http_response_code(403);
    _prov_api_emit(array('ok' => false, 'error' => 'auth_failed'));
}

$req = json_decode($rawBody, true);
if (!is_array($req)) {
    http_response_code(400);
    _prov_api_emit(array('ok' => false, 'error' => 'invalid_json'));
}

$ts = isset($req['ts']) ? (int)$req['ts'] : 0;
if ($ts <= 0 || abs(time() - $ts) > 300) {
    http_response_code(403);
    _prov_api_emit(array('ok' => false, 'error' => 'ts_invalid'));
}

$op = trim((string)($req['op'] ?? ''));

// GNUBoard 공통 로드
$_commonFile = dirname(__DIR__) . '/common.php';
if (!is_file($_commonFile)) {
    _prov_api_emit(array('ok' => false, 'error' => 'common_not_found'));
}
@chdir(dirname(__DIR__));
require_once $_commonFile;
require_once dirname(__DIR__) . '/mylib/ikev2_provision.lib.php';

// ── list_manual_required ────────────────────────────────────────
if ($op === 'list_manual_required') {
    $rows = vpnlink_ikev2_get_manual_required_queues(200);
    _prov_api_emit(array('ok' => true, 'rows' => $rows, 'count' => count($rows)));
}

// ── queue_stats ─────────────────────────────────────────────────
if ($op === 'queue_stats') {
    vpnlink_ikev2_create_tables();
    $res = sql_query("SELECT final_status, COUNT(*) AS cnt FROM `app_ikev2_provision_queue` GROUP BY final_status", false);
    $stats = array();
    while ($row = sql_fetch_array($res)) {
        $stats[$row['final_status']] = (int)$row['cnt'];
    }
    _prov_api_emit(array('ok' => true, 'stats' => $stats));
}

// ── manual_retry ────────────────────────────────────────────────
if ($op === 'manual_retry') {
    $queueId   = (int)($req['queue_id'] ?? 0);
    $newServer = trim((string)($req['new_server_ip'] ?? ''));

    if ($queueId <= 0) {
        _prov_api_emit(array('ok' => false, 'error' => 'missing_queue_id'));
    }

    $ret = vpnlink_ikev2_manual_retry_queue($queueId, $newServer, 'admin_manual_retry_api');
    _prov_api_emit($ret);
}

http_response_code(400);
_prov_api_emit(array('ok' => false, 'error' => 'unknown_op:' . $op));
