<?php

declare(strict_types=1);

$dialect = getenv('POC_DIALECT');
if (!in_array($dialect, ['mysql', 'dm'], true)) exit(2);
$host = getenv('POC_HOST');
$port = getenv('POC_PORT');
$schema = getenv('POC_SCHEMA');
$dsn = $dialect === 'dm'
    ? "dm:host=$host;port=$port;schema=$schema"
    : "mysql:host=$host;port=$port;dbname=$schema;charset=utf8mb4";
$pdo = new PDO($dsn, getenv('POC_USER'), getenv('POC_PASSWORD'),
    [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]);
$session = $dialect === 'dm' ? 'YDY_MEASUREMENT_SESSION' : 'ydy_measurement_session';
$raw = $dialect === 'dm' ? 'YDY_MEASUREMENT_SESSION_RAW' : 'ydy_measurement_session_raw';
$health = $dialect === 'dm' ? 'YDY_HEALTH_RECORD' : 'ydy_health_record';
$sql = 'SELECT S.SESSION_ID FROM ' . $session . ' S JOIN ' . $raw
    . ' R ON S.SESSION_ID=R.SESSION_ID WHERE S.VENDOR=? AND S.DEVICE_MODEL=?'
    . ' AND R.DATA LIKE ? ORDER BY S.SESSION_ID';
$query = $pdo->prepare($sql);
$query->execute(['mocatch', '', '%CDXMOCA-%']);
$ids = array_map('intval', $query->fetchAll(PDO::FETCH_COLUMN));
if (getenv('POC_CLEAN_MOCATCH_ORPHAN') !== '1') {
    echo json_encode(['dialect' => $dialect, 'mode' => 'dry-run',
        'synthetic_orphan_session_ids' => $ids]) . PHP_EOL;
    exit(0);
}
$pdo->beginTransaction();
try {
    foreach ($ids as $id) {
        $pdo->prepare('DELETE FROM ' . $health . ' WHERE SESSION_ID=?')->execute([$id]);
        $pdo->prepare('DELETE FROM ' . $raw . ' WHERE SESSION_ID=?')->execute([$id]);
        $pdo->prepare('DELETE FROM ' . $session . ' WHERE SESSION_ID=?')->execute([$id]);
    }
    $pdo->commit();
} catch (Throwable $error) {
    $pdo->rollBack();
    throw $error;
}
$query->execute(['mocatch', '', '%CDXMOCA-%']);
echo json_encode(['dialect' => $dialect, 'mode' => 'applied',
    'deleted_synthetic_orphans' => count($ids),
    'remaining' => count($query->fetchAll(PDO::FETCH_COLUMN))]) . PHP_EOL;
