<?php

declare(strict_types=1);

if (!defined('PDO::EXTRA_DECIMAL')) {
    fwrite(STDERR, "Candidate feature required\n");
    exit(2);
}
foreach (['HOST', 'PORT', 'SCHEMA', 'USER', 'PASSWORD'] as $part) {
    if ((string) getenv('POC_' . $part) === '') {
        fwrite(STDERR, "Approved runtime required\n");
        exit(2);
    }
}
$pdo = new PDO('dm:host=' . getenv('POC_HOST') . ';port=' . getenv('POC_PORT')
    . ';schema=' . getenv('POC_SCHEMA'), (string) getenv('POC_USER'),
    (string) getenv('POC_PASSWORD'), [
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_STRINGIFY_FETCHES => true,
        PDO::EXTRA_DECIMAL => 1,
    ]);
$queries = [
    'base_alias' => 'SELECT ACCOUNT_SETTLEMENT_ID AS linked_id FROM YDY_MEAL_ORDER WHERE 1=0',
    'addition' => 'SELECT ACCOUNT_SETTLEMENT_ID + 0 AS linked_id FROM YDY_MEAL_ORDER WHERE 1=0',
    'cast' => 'SELECT CAST(ACCOUNT_SETTLEMENT_ID AS DECIMAL(20,0)) AS linked_id'
        . ' FROM YDY_MEAL_ORDER WHERE 1=0',
    'case' => 'SELECT CASE WHEN 1=1 THEN ACCOUNT_SETTLEMENT_ID ELSE 0 END AS linked_id'
        . ' FROM YDY_MEAL_ORDER WHERE 1=0',
    'coalesce' => 'SELECT COALESCE(ACCOUNT_SETTLEMENT_ID,0) AS linked_id'
        . ' FROM YDY_MEAL_ORDER WHERE 1=0',
    'derived_alias' => 'SELECT linked_id FROM'
        . ' (SELECT ACCOUNT_SETTLEMENT_ID AS linked_id FROM YDY_MEAL_ORDER) q WHERE 1=0',
];
$results = [];
foreach ($queries as $name => $sql) {
    try {
        $statement = $pdo->query($sql);
        $columns = [];
        for ($i = 0; $i < $statement->columnCount(); $i++) {
            $columns[] = $statement->getColumnMeta($i);
        }
        $results[$name] = ['column_count' => $statement->columnCount(),
            'columns' => $columns, 'row_present' => $statement->fetch() !== false];
    } catch (Throwable $error) {
        $results[$name] = ['error_class' => get_class($error), 'error_code' => $error->getCode()];
    }
}
echo json_encode(['php' => PHP_VERSION, 'cases' => $results], JSON_PRETTY_PRINT) . PHP_EOL;
