<?php

declare(strict_types=1);

$root = getenv('POC_TARGET_ROOT');
$dialect = getenv('POC_DIALECT');
if (!$root || !in_array($dialect, ['mysql', 'dm'], true)) exit(2);
$config = require $root . '/application/database.php';
$targets = [
    ['config' => $config, 'tables' => ['ydy_api_auth', 'ydy_staff', 'ydy_user', 'ydy_staff_card']],
    ['config' => $config['ai_zhct'], 'tables' => ['yoshop_user']],
];
$result = [];
foreach ($targets as $target) {
    $db = $target['config'];
    $dsn = $dialect === 'dm'
        ? 'dm:host=' . $db['hostname'] . ';port=' . $db['hostport'] . ';schema=' . $db['database']
        : 'mysql:host=' . $db['hostname'] . ';port=' . $db['hostport'] . ';dbname=' . $db['database'] . ';charset=utf8mb4';
    $pdo = new PDO($dsn, $db['username'], $db['password'], [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]);
    foreach ($target['tables'] as $table) {
        if ($dialect === 'dm') {
            $stmt = $pdo->prepare('SELECT COLUMN_NAME,DATA_TYPE,NULLABLE,DATA_DEFAULT FROM USER_TAB_COLUMNS WHERE TABLE_NAME=? ORDER BY COLUMN_ID');
            $stmt->execute([strtoupper($table)]);
            $columns = array_map('array_change_key_case', $stmt->fetchAll(PDO::FETCH_ASSOC));
            $required = [];
            $types = [];
            foreach ($columns as $column) {
                if (($column['nullable'] ?? '') === 'N' && ($column['data_default'] ?? null) === null) {
                    $name = strtolower((string)$column['column_name']);
                    $required[] = $name;
                    $types[$name] = (string)$column['data_type'];
                }
            }
        } else {
            $columns = $pdo->query('SHOW COLUMNS FROM `' . $table . '`')->fetchAll(PDO::FETCH_ASSOC);
            $required = [];
            $types = [];
            foreach ($columns as $column) {
                if (($column['Null'] ?? '') === 'NO' && ($column['Default'] ?? null) === null
                    && strpos((string)($column['Extra'] ?? ''), 'auto_increment') === false) {
                    $name = (string)$column['Field'];
                    $required[] = $name;
                    $types[$name] = (string)$column['Type'];
                }
            }
        }
        $names = $dialect === 'dm'
            ? array_map(static function (array $column): string { return strtolower((string)$column['column_name']); }, $columns)
            : array_column($columns, 'Field');
        $result[$table] = ['columns' => count($columns), 'required_without_default' => $required,
            'types' => $types, 'has_store_id' => in_array('store_id', $names, true)];
    }
}
echo json_encode(['dialect' => $dialect, 'tables' => $result]) . PHP_EOL;
