<?php

namespace App\DB;

use PDO;

/**
 * Realiza una operación "upsert": actualiza si el registro existe, o inserta si no.
 *
 * Utiliza la sintaxis `INSERT ... ON DUPLICATE KEY UPDATE` de MySQL, que es atómica.
 * Requiere que la columna de coincidencia ($matchColumn) tenga una restricción UNIQUE o PRIMARY KEY.
 *
 * @param PDO $pdo La conexión a la base de datos.
 * @param string $table El nombre de la tabla.
 * @param array $data Un array asociativo de [columna => valor] para insertar/actualizar.
 * @param string $matchColumn La columna usada para verificar la existencia (ej. 'run').
 * @param mixed $matchValue El valor de la columna de verificación.
 */
function upsert(PDO $pdo, string $table, array $data, string $matchColumn, $matchValue)
{
    if (empty($data)) {
        return;
    }

    // Añadir la columna de coincidencia y su valor a los datos para la parte INSERT
    $data[$matchColumn] = $matchValue;

    $columns = implode(', ', array_keys($data));
    $placeholders = rtrim(str_repeat('?,', count($data)), ',');

    // Construir la parte de UPDATE. No se necesita actualizar la clave de coincidencia.
    $updateSet = [];
    foreach ($data as $key => $value) {
        if ($key !== $matchColumn) {
            // Usar VALUES(columna) para referirse al valor que se habría insertado.
            $updateSet[] = "$key = VALUES($key)";
        }
    }

    if (empty($updateSet)) {
        $updateClause = "$matchColumn = VALUES($matchColumn)"; // Dummy update
    } else {
        $updateClause = implode(', ', $updateSet);
    }

    $sql = "INSERT INTO $table ($columns) VALUES ($placeholders) ON DUPLICATE KEY UPDATE $updateClause";

    $pdo->prepare($sql)->execute(array_values($data));
}
