<?php

declare(strict_types=1);

$lane = (string)getenv('CDX_GIFT_LANE');
if (($argv[1] ?? '') !== '--preflight' || !in_array($lane, ['A', 'B', 'C'], true)) {
    echo json_encode(['status' => 'default_deny', 'dml' => 0, 'http' => 0]), PHP_EOL;
    exit(78);
}
$base = $lane === 'C'
    ? '/tmp/zhct-ai-read2-VgKO4CDY/read2_schema_preflight.php'
    : __DIR__ . '/../parallel-ai-next-read-safe4/read2_schema_preflight.php';
if (!is_file($base) || hash_file('sha256', $base)
    !== '8641ee015ad537d300de9c00f2c882e654b739d7c2194dd13ef4635ca9df1af0') {
    throw new RuntimeException('Identity preflight drift');
}
putenv('CDX_READ2_TARGET=' . $lane);
putenv('CDX_READ2_SCHEMA_PREFLIGHT=1');
require $base;
$name = $dialect === 'dm' ? 'YOSHOP_USER_GIFT_LOG' : 'yoshop_user_gift_log';
$indexes = [];
$constraints = [];
if ($dialect === 'mysql') {
    $stmt = $ai->prepare('SELECT INDEX_NAME,NON_UNIQUE,SEQ_IN_INDEX,COLUMN_NAME'
        . ' FROM INFORMATION_SCHEMA.STATISTICS'
        . ' WHERE TABLE_SCHEMA=? AND TABLE_NAME=?'
        . ' ORDER BY INDEX_NAME,SEQ_IN_INDEX');
    $stmt->execute([(string)$config['POC_AI_SCHEMA'], $name]);
    foreach ($stmt->fetchAll(PDO::FETCH_ASSOC) as $raw) {
        $row = array_change_key_case($raw, CASE_LOWER);
        $index = (string)$row['index_name'];
        $indexes[$index]['unique'] = (int)$row['non_unique'] === 0;
        $indexes[$index]['columns'][] = (string)$row['column_name'];
    }
    $stmt = $ai->prepare('SELECT CONSTRAINT_NAME,CONSTRAINT_TYPE'
        . ' FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS'
        . ' WHERE TABLE_SCHEMA=? AND TABLE_NAME=?'
        . " AND CONSTRAINT_TYPE IN ('PRIMARY KEY','UNIQUE')"
        . ' ORDER BY CONSTRAINT_NAME');
    $stmt->execute([(string)$config['POC_AI_SCHEMA'], $name]);
    foreach ($stmt->fetchAll(PDO::FETCH_ASSOC) as $raw) {
        $row = array_change_key_case($raw, CASE_LOWER);
        $constraints[(string)$row['constraint_name']] = (string)$row['constraint_type'];
    }
} else {
    $stmt = $ai->prepare('SELECT i.INDEX_NAME,i.UNIQUENESS,'
        . ' c.COLUMN_POSITION,c.COLUMN_NAME FROM USER_INDEXES i'
        . ' JOIN USER_IND_COLUMNS c ON c.INDEX_NAME=i.INDEX_NAME'
        . ' AND c.TABLE_NAME=i.TABLE_NAME WHERE i.TABLE_NAME=?'
        . ' ORDER BY i.INDEX_NAME,c.COLUMN_POSITION');
    $stmt->execute([$name]);
    foreach ($stmt->fetchAll(PDO::FETCH_ASSOC) as $raw) {
        $row = array_change_key_case($raw, CASE_LOWER);
        $index = (string)$row['index_name'];
        $indexes[$index]['unique'] = strtoupper((string)$row['uniqueness']) === 'UNIQUE';
        $indexes[$index]['columns'][] = (string)$row['column_name'];
    }
    $stmt = $ai->prepare('SELECT CONSTRAINT_NAME,CONSTRAINT_TYPE,INDEX_NAME'
        . ' FROM USER_CONSTRAINTS WHERE TABLE_NAME=?'
        . " AND CONSTRAINT_TYPE IN ('P','U') ORDER BY CONSTRAINT_NAME");
    $stmt->execute([$name]);
    foreach ($stmt->fetchAll(PDO::FETCH_ASSOC) as $raw) {
        $row = array_change_key_case($raw, CASE_LOWER);
        $constraints[(string)$row['constraint_name']] = [
            'type' => (string)$row['constraint_type'],
            'index' => (string)$row['index_name']];
    }
}
if (!$indexes || !$constraints) throw new RuntimeException('Gift index metadata unavailable');
ksort($indexes, SORT_STRING);
ksort($constraints, SORT_STRING);
echo json_encode(['status' => 'gift_index_metadata', 'lane' => $lane,
    'dialect' => $dialect, 'indexes' => $indexes,
    'primary_unique_constraints' => $constraints,
    'http' => 0, 'dml' => 0], JSON_UNESCAPED_SLASHES), PHP_EOL;
