<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;

class OracleTestOci8Connection extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'oracle:test-oci8';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Test an oracle connection using OCI8 reading credentials from .env';

    /**
     * Execute the console command.
     */
    public function handle(): int
    {
        $this->comment('Iniciando prueba de conexión OCI8 a Oracle...');
        $this->newLine();

        // --- 1. Obtener Parámetros de Conexión desde .env ---
        // Usamos env() para leer los valores de tu archivo .env

        $host = config('database.connections.oracle.host');
        $port = config('database.connections.oracle.port', '1521'); // Usamos 1521 como fallback si no está en .env
        $username = config('database.connections.oracle.username');
        $password = config('database.connections.oracle.password');
        $service_name = config('database.connections.oracle.service_name');

        // Validación básica para asegurar que se cargaron los datos
        if (empty($host) || empty($username) || empty($password) || empty($service_name)) {
            $this->error('Error: Faltan credenciales esenciales en el archivo .env.');
            $this->error('Asegúrate de que DB_ORACLE_D1_HOST, USERNAME, PASSWORD y SERVICE_NAME están definidos.');

            return static::FAILURE; // Detiene la ejecución del comando
        }

        // --- 2. Cadena de Conexión Easy Connect ---
        $cadena_conexion = "//{$host}:{$port}/{$service_name}";

        // --- 3. Intento de Conexión (oci_connect) ---
        // @ suprime los errores nativos de PHP (útil si falta la extensión OCI8)
        $conn = @oci_connect($username, $password, $cadena_conexion);

        if (! $conn) {
            // Manejo de error con Artisan
            $e = oci_error();
            $this->error('Error de conexión a Oracle:');
            $this->error('Cadena usada: '.$cadena_conexion);
            $this->error(htmlentities($e['message'] ?? 'Error desconocido (¿Falta extensión OCI8?)', ENT_QUOTES));

        } else {
            $this->info('Conexión a Oracle con Service Name exitosa!');

            // --- Ejemplo de Consulta (Opcional) ---
            $sql = 'SELECT SYSDATE FROM DUAL';
            $stid = oci_parse($conn, $sql);

            if ($stid) {
                oci_execute($stid);

                if (oci_fetch($stid)) {
                    $fecha = oci_result($stid, 1);
                    $this->comment("Fecha actual del servidor: **$fecha**");
                }

                oci_free_statement($stid);
            }

            oci_close($conn);
        }

        return static::SUCCESS;
    }
}
