<?php

namespace WMS\Core;

use PDO;
use PDOException;

/**
 * Conexión directa a SAP HANA vía ODBC/PDO.
 * Permite consultar tablas SAP directamente (items, lotes, documentos, etc.).
 *
 * Requisitos:
 * - Driver ODBC HANA instalado (hdbodbc o HDBODBC)
 * - Extensión php_pdo_odbc habilitada en php.ini
 */
class HanaDatabase
{
    private static ?PDO $instance = null;

    public static function getConnection(): PDO
    {
        if (self::$instance === null) {
            $config = require __DIR__ . '/../config/app.php';
            $hana = $config['hana'];

            // Intentar conexión ODBC (driver HANA)
            $dsn = sprintf(
                'odbc:DRIVER={HDBODBC};SERVERNODE=%s:%s;DATABASE=%s;',
                $hana['host'],
                $hana['port'],
                $hana['schema']
            );

            try {
                self::$instance = new PDO($dsn, $hana['username'], $hana['password'], [
                    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
                    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
                ]);

                // Establecer schema por defecto
                self::$instance->exec("SET SCHEMA \"{$hana['schema']}\"");
            } catch (PDOException $e) {
                throw new \RuntimeException('Error de conexión a SAP HANA: ' . $e->getMessage());
            }
        }

        return self::$instance;
    }

    /**
     * Ejecuta una consulta SELECT contra HANA y retorna los resultados.
     */
    public static function query(string $sql, array $params = []): array
    {
        $stmt = self::getConnection()->prepare($sql);
        $stmt->execute($params);
        return $stmt->fetchAll();
    }

    /**
     * Ejecuta una consulta y retorna una sola fila.
     */
    public static function queryOne(string $sql, array $params = []): ?array
    {
        $stmt = self::getConnection()->prepare($sql);
        $stmt->execute($params);
        return $stmt->fetch() ?: null;
    }

    /**
     * Ejecuta una consulta y retorna el valor de la primera columna.
     */
    public static function scalar(string $sql, array $params = [])
    {
        $stmt = self::getConnection()->prepare($sql);
        $stmt->execute($params);
        return $stmt->fetchColumn();
    }
}
