<?php
/**
 * Migrador y Analizador de Productos Faltantes entre Base de Datos Principal y Secundaria (PRODUCCIÓN / WEB HOSTING)
 * 
 * Permite identificar productos presentes en la BD Principal (farmacia_nadiecomoel2026) 
 * que no se encuentran en la BD Secundaria (farmacia_nadiecomoel), reportando duplicados 
 * y realizando una migración limpia y segura sin modificar la BD Principal.
 */

// Configuración para Web Hosting
$host = 'localhost';
$user = 'farmacia_onlydi2025';
$pass = '1corintios13';
$db_principal = 'farmacia_nadiecomoel2026';
$db_secundaria = 'farmacia_nadiecomoel';

// Si se ejecuta en entorno local (WAMP), ajustar a base de datos de pruebas
if ($_SERVER['HTTP_HOST'] === 'localhost' || $_SERVER['HTTP_HOST'] === '127.0.0.1' || php_sapi_name() === 'cli') {
    $user = 'root';
    $pass = '';
    try {
        $test_pdo = new PDO("mysql:host=$host;dbname=host_nadiecomoel2026;charset=utf8mb4", $user, $pass);
        $db_principal = 'host_nadiecomoel2026';
        $db_secundaria = 'host_nadiecomoel';
    } catch (Exception $e) {
        $db_principal = 'farmacia_eles';
        $db_secundaria = 'farmacia_nadiecomoel';
    }
}

$error_conexion = null;
$pdo1 = null;
$pdo2 = null;

try {
    $pdo1 = new PDO("mysql:host=$host;dbname=$db_principal;charset=utf8mb4", $user, $pass, [
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
    ]);
    $pdo2 = new PDO("mysql:host=$host;dbname=$db_secundaria;charset=utf8mb4", $user, $pass, [
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
    ]);
} catch (Exception $e) {
    $error_conexion = "Error al conectar a las bases de datos ($db_principal / $db_secundaria): " . $e->getMessage();
}

$action = isset($_GET['action']) ? $_GET['action'] : (isset($_POST['action']) ? $_POST['action'] : 'preview');

// Lógica de Análisis
function analizar_diferencias($pdo1, $pdo2) {
    $prods1 = $pdo1->query("SELECT * FROM `productos` ORDER BY id ASC")->fetchAll();
    $prods2 = $pdo2->query("SELECT * FROM `productos` ORDER BY id ASC")->fetchAll();

    $map2_id = [];
    $map2_code = [];
    foreach ($prods2 as $p) {
        $map2_id[$p['id']] = $p;
        $code = trim($p['CodigoInterno']);
        if (!empty($code)) {
            $map2_code[$code][] = $p;
        }
    }

    $listos_migrar = [];
    $conflictos_duplicados = [];
    $ya_existentes = [];

    foreach ($prods1 as $p) {
        $id = $p['id'];
        $code = trim($p['CodigoInterno']);
        
        $existe_por_id = isset($map2_id[$id]);
        $existe_por_code = (!empty($code) && isset($map2_code[$code]));

        if ($existe_por_id && $existe_por_code) {
            $p2 = $map2_id[$id];
            if (trim($p2['CodigoInterno']) === $code) {
                $ya_existentes[] = $p;
            } else {
                $conflictos_duplicados[] = [
                    'tipo' => 'ID coincide pero Código Interno difiere',
                    'p_principal' => $p,
                    'p_secundaria' => $p2,
                    'razon' => "En BD Principal ID $id es '$code', pero en BD Secundaria ID $id es '{$p2['CodigoInterno']}'"
                ];
            }
        } elseif ($existe_por_code && !$existe_por_id) {
            $p2 = $map2_code[$code][0];
            $conflictos_duplicados[] = [
                'tipo' => 'Código Interno duplicado con diferente ID',
                'p_principal' => $p,
                'p_secundaria' => $p2,
                'razon' => "Código '$code' existe en BD Principal con ID {$p['id']} ({$p['NombreComercial']}) y en BD Secundaria con ID {$p2['id']} ({$p2['NombreComercial']})"
            ];
        } elseif ($existe_por_id && !$existe_por_code) {
            $p2 = $map2_id[$id];
            $conflictos_duplicados[] = [
                'tipo' => 'ID ocupado con diferente Código Interno',
                'p_principal' => $p,
                'p_secundaria' => $p2,
                'razon' => "ID {$id} existe en BD Principal como '$code' y en BD Secundaria como '{$p2['CodigoInterno']}'"
            ];
        } else {
            // No existe ni por ID ni por Código Interno -> Seguro para migrar
            $listos_migrar[] = $p;
        }
    }

    return [
        'total_principal' => count($prods1),
        'total_secundaria' => count($prods2),
        'listos_migrar' => $listos_migrar,
        'conflictos_duplicados' => $conflictos_duplicados,
        'ya_existentes' => $ya_existentes
    ];
}

$analisis = null;
$migracion_resultado = null;

if (!$error_conexion) {
    $analisis = analizar_diferencias($pdo1, $pdo2);

    if ($action === 'migrate' && $_SERVER['REQUEST_METHOD'] === 'POST') {
        $insertados = 0;
        $presentaciones_insertadas = 0;
        $costos_insertados = 0;

        try {
            $pdo2->beginTransaction();

            $cols_prod = array_keys($analisis['listos_migrar'][0] ?? []);
            if (!empty($cols_prod)) {
                $placeholders = implode(',', array_fill(0, count($cols_prod), '?'));
                $sql_prod = "INSERT INTO `productos` (" . implode(',', array_map(fn($c) => "`$c`", $cols_prod)) . ") VALUES ($placeholders)";
                $stmt_prod = $pdo2->prepare($sql_prod);

                $stmt_pres_get = $pdo1->prepare("SELECT * FROM `producto_presentaciones` WHERE `producto_id` = ?");
                $stmt_costo_get = $pdo1->prepare("SELECT * FROM `productos_costo_promedio` WHERE `producto_id` = ?");

                foreach ($analisis['listos_migrar'] as $p) {
                    // Insertar producto
                    $stmt_prod->execute(array_values($p));
                    $insertados++;

                    // Copiar presentaciones asociadas
                    $stmt_pres_get->execute([$p['id']]);
                    $presentaciones = $stmt_pres_get->fetchAll();
                    foreach ($presentaciones as $pres) {
                        $pres_cols = array_keys($pres);
                        $pres_placeholders = implode(',', array_fill(0, count($pres_cols), '?'));
                        $sql_pres = "INSERT INTO `producto_presentaciones` (" . implode(',', array_map(fn($c) => "`$c`", $pres_cols)) . ") VALUES ($pres_placeholders)";
                        try {
                            $stmt_pres_ins = $pdo2->prepare($sql_pres);
                            $stmt_pres_ins->execute(array_values($pres));
                            $presentaciones_insertadas++;
                        } catch (Exception $ex_pres) {
                            $pres_cols_noid = array_filter($pres_cols, fn($c) => $c !== 'id');
                            $pres_placeholders_noid = implode(',', array_fill(0, count($pres_cols_noid), '?'));
                            $sql_pres_noid = "INSERT INTO `producto_presentaciones` (" . implode(',', array_map(fn($c) => "`$c`", $pres_cols_noid)) . ") VALUES ($pres_placeholders_noid)";
                            $stmt_pres_ins_noid = $pdo2->prepare($sql_pres_noid);
                            $vals = [];
                            foreach ($pres_cols_noid as $c) { $vals[] = $pres[$c]; }
                            $stmt_pres_ins_noid->execute($vals);
                            $presentaciones_insertadas++;
                        }
                    }

                    // Copiar costo promedio si existe
                    $stmt_costo_get->execute([$p['id']]);
                    $costos = $stmt_costo_get->fetchAll();
                    foreach ($costos as $costo) {
                        $costo_cols = array_keys($costo);
                        $costo_placeholders = implode(',', array_fill(0, count($costo_cols), '?'));
                        $sql_costo = "INSERT INTO `productos_costo_promedio` (" . implode(',', array_map(fn($c) => "`$c`", $costo_cols)) . ") VALUES ($costo_placeholders)";
                        try {
                            $stmt_costo_ins = $pdo2->prepare($sql_costo);
                            $stmt_costo_ins->execute(array_values($costo));
                            $costos_insertados++;
                        } catch (Exception $ex_c) {}
                    }
                }
            }

            // Actualizar AUTO_INCREMENT
            $max_id = $pdo2->query("SELECT MAX(id) FROM `productos`")->fetchColumn();
            if ($max_id) {
                $next_id = $max_id + 1;
                $pdo2->exec("ALTER TABLE `productos` AUTO_INCREMENT = $next_id");
            }

            $pdo2->commit();

            $migracion_resultado = [
                'exito' => true,
                'insertados' => $insertados,
                'presentaciones_insertadas' => $presentaciones_insertadas,
                'costos_insertados' => $costos_insertados,
                'omitidos' => count($analisis['conflictos_duplicados'])
            ];

            // Re-analizar después de la migración
            $analisis = analizar_diferencias($pdo1, $pdo2);

        } catch (Exception $e) {
            $pdo2->rollBack();
            $migracion_resultado = [
                'exito' => false,
                'mensaje' => $e->getMessage()
            ];
        }
    }
}
?>
<!DOCTYPE html>
<html lang="es">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Migración y Análisis de Productos Faltantes</title>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
    <link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css" rel="stylesheet">
    <style>
        body {
            background-color: #0f172a;
            color: #f8fafc;
            font-family: 'Segoe UI', system-ui, -apple-system, sans-serif;
        }
        .glass-card {
            background: rgba(30, 41, 59, 0.7);
            backdrop-filter: blur(12px);
            border: 1px solid rgba(255, 255, 255, 0.1);
            border-radius: 1rem;
            box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.3);
        }
        .stat-card {
            background: rgba(15, 23, 42, 0.6);
            border-radius: 0.75rem;
            border-left: 4px solid #3b82f6;
            padding: 1.25rem;
        }
        .stat-card.success { border-left-color: #10b981; }
        .stat-card.warning { border-left-color: #f59e0b; }
        .stat-card.info { border-left-color: #6366f1; }
        .badge-code {
            font-family: monospace;
            background-color: rgba(51, 65, 85, 0.8);
            color: #38bdf8;
            padding: 0.2rem 0.5rem;
            border-radius: 0.25rem;
        }
        .table-dark-custom {
            --bs-table-bg: rgba(15, 23, 42, 0.4);
            --bs-table-border-color: rgba(255, 255, 255, 0.1);
            color: #e2e8f0;
        }
    </style>
</head>
<body class="py-4">

<div class="container">
    <!-- Header -->
    <div class="glass-card p-4 mb-4 text-center">
        <h2 class="fw-bold text-white mb-2"><i class="fa-solid fa-boxes-packing text-primary me-2"></i> Migración y Análisis de Productos Faltantes</h2>
        <p class="text-secondary mb-0">Compara la Base de Datos Principal (<code><?= htmlspecialchars($db_principal) ?></code>) con la Secundaria (<code><?= htmlspecialchars($db_secundaria) ?></code>)</p>
    </div>

    <?php if ($error_conexion): ?>
        <div class="alert alert-danger glass-card border-danger text-white">
            <i class="fa-solid fa-triangle-exclamation me-2 fs-4"></i> <?= htmlspecialchars($error_conexion) ?>
        </div>
    <?php else: ?>

        <!-- Resultado de la migración -->
        <?php if ($migracion_resultado): ?>
            <?php if ($migracion_resultado['exito']): ?>
                <div class="alert alert-success glass-card border-success text-white mb-4">
                    <h4 class="alert-heading fw-bold"><i class="fa-solid fa-circle-check me-2"></i> ¡Migración Completada con Éxito!</h4>
                    <hr>
                    <ul class="mb-0">
                        <li><strong><?= $migracion_resultado['insertados'] ?></strong> productos nuevos agregados a <code><?= htmlspecialchars($db_secundaria) ?></code>.</li>
                        <li><strong><?= $migracion_resultado['presentaciones_insertadas'] ?></strong> presentaciones vinculadas agregadas.</li>
                        <li><strong><?= $migracion_resultado['costos_insertados'] ?></strong> registros de costo promedio copiados.</li>
                        <li><strong><?= $migracion_resultado['omitidos'] ?></strong> productos duplicados/conflicto omitidos para proteger la integridad.</li>
                    </ul>
                    <div class="mt-3">
                        <span class="badge bg-info"><i class="fa-solid fa-shield-halved me-1"></i> La base de datos principal <?= htmlspecialchars($db_principal) ?> NO sufrió ninguna modificación (100% Intacta).</span>
                    </div>
                </div>
            <?php else: ?>
                <div class="alert alert-danger glass-card border-danger text-white mb-4">
                    <h4 class="alert-heading fw-bold"><i class="fa-solid fa-circle-xmark me-2"></i> Error en la Migración</h4>
                    <p class="mb-0"><?= htmlspecialchars($migracion_resultado['mensaje']) ?></p>
                </div>
            <?php endif; ?>
        <?php endif; ?>

        <!-- Resumen Estadístico -->
        <div class="row g-3 mb-4">
            <div class="col-md-3">
                <div class="stat-card info glass-card">
                    <div class="text-secondary small fw-bold">TOTAL BD PRINCIPAL</div>
                    <div class="fs-3 fw-bold text-white"><?= number_format($analisis['total_principal']) ?></div>
                    <div class="small text-muted"><code><?= htmlspecialchars($db_principal) ?></code></div>
                </div>
            </div>
            <div class="col-md-3">
                <div class="stat-card info glass-card">
                    <div class="text-secondary small fw-bold">TOTAL BD SECUNDARIA</div>
                    <div class="fs-3 fw-bold text-white"><?= number_format($analisis['total_secundaria']) ?></div>
                    <div class="small text-muted"><code><?= htmlspecialchars($db_secundaria) ?></code></div>
                </div>
            </div>
            <div class="col-md-3">
                <div class="stat-card success glass-card">
                    <div class="text-success small fw-bold">LISTOS PARA MIGRAR</div>
                    <div class="fs-3 fw-bold text-success"><?= number_format(count($analisis['listos_migrar'])) ?></div>
                    <div class="small text-muted">No existen en la secundaria</div>
                </div>
            </div>
            <div class="col-md-3">
                <div class="stat-card warning glass-card">
                    <div class="text-warning small fw-bold">CÓDIGOS DUPLICADOS / OMISIONES</div>
                    <div class="fs-3 fw-bold text-warning"><?= number_format(count($analisis['conflictos_duplicados'])) ?></div>
                    <div class="small text-muted">Se omiten por seguridad</div>
                </div>
            </div>
        </div>

        <!-- Botón de Migración -->
        <?php if (!empty($analisis['listos_migrar'])): ?>
            <div class="glass-card p-4 mb-4 text-center">
                <form method="POST" action="?action=migrate" onsubmit="return confirm('¿Está seguro de migrar los <?= count($analisis['listos_migrar']) ?> productos faltantes a la base de datos secundaria? La base principal no será afectada.');">
                    <button type="submit" class="btn btn-success btn-lg px-5 py-3 fw-bold shadow-lg">
                        <i class="fa-solid fa-rocket me-2"></i> Ejecutar Migración de <?= count($analisis['listos_migrar']) ?> Productos Faltantes
                    </button>
                </form>
            </div>
        <?php else: ?>
            <div class="alert alert-info glass-card border-info text-white mb-4">
                <i class="fa-solid fa-circle-info me-2"></i> Ambas bases de datos están totalmente al día. No hay productos nuevos pendientes de migrar.
            </div>
        <?php endif; ?>

        <!-- Tabla 1: Productos Listos para Migrar -->
        <div class="glass-card p-4 mb-4">
            <h4 class="fw-bold text-success mb-3"><i class="fa-solid fa-plus-circle me-2"></i> Productos Faltantes Listos para Migrar (<?= count($analisis['listos_migrar']) ?>)</h4>
            <?php if (empty($analisis['listos_migrar'])): ?>
                <p class="text-muted mb-0">No hay productos faltantes por ingresar.</p>
            <?php else: ?>
                <div class="table-responsive" style="max-height: 400px;">
                    <table class="table table-dark-custom table-hover align-middle">
                        <thead class="table-dark sticky-top">
                            <tr>
                                <th>ID</th>
                                <th>Código Interno</th>
                                <th>Código Barras</th>
                                <th>Nombre Comercial</th>
                                <th>Nombre Genérico</th>
                                <th>Laboratorio</th>
                            </tr>
                        </thead>
                        <tbody>
                            <?php foreach ($analisis['listos_migrar'] as $p): ?>
                                <tr>
                                    <td><span class="badge bg-secondary"><?= $p['id'] ?></span></td>
                                    <td><span class="badge-code"><?= htmlspecialchars($p['CodigoInterno'] ?? 'N/A') ?></span></td>
                                    <td><small class="text-muted"><?= htmlspecialchars($p['CodigoBarra'] ?? '-') ?></small></td>
                                    <td class="fw-bold text-white"><?= htmlspecialchars($p['NombreComercial']) ?></td>
                                    <td class="text-secondary"><?= htmlspecialchars($p['NombreGenerico'] ?? '-') ?></td>
                                    <td><small><?= htmlspecialchars($p['laboratorio'] ?? '-') ?></small></td>
                                </tr>
                            <?php endforeach; ?>
                        </tbody>
                    </table>
                </div>
            <?php endif; ?>
        </div>

        <!-- Tabla 2: Códigos Duplicados / Conflictos (Omitidos) -->
        <div class="glass-card p-4 mb-4">
            <h4 class="fw-bold text-warning mb-3"><i class="fa-solid fa-triangle-exclamation me-2"></i> Códigos Duplicados / Conflictos Detectados (<?= count($analisis['conflictos_duplicados']) ?>)</h4>
            <p class="text-secondary small mb-3">Estos productos <strong>NO SE INGRESARÁN</strong> a la base de datos secundaria para evitar sobreescribir ni duplicar información existente.</p>
            <?php if (empty($analisis['conflictos_duplicados'])): ?>
                <p class="text-muted mb-0">No se detectaron códigos duplicados ni conflictos.</p>
            <?php else: ?>
                <div class="table-responsive" style="max-height: 450px;">
                    <table class="table table-dark-custom table-hover align-middle">
                        <thead class="table-dark sticky-top">
                            <tr>
                                <th>Tipo de Conflicto</th>
                                <th>Código Interno</th>
                                <th>Producto en BD Principal (<code><?= htmlspecialchars($db_principal) ?></code>)</th>
                                <th>Producto en BD Secundaria (<code><?= htmlspecialchars($db_secundaria) ?></code>)</th>
                                <th>Detalle del Conflicto</th>
                            </tr>
                        </thead>
                        <tbody>
                            <?php foreach ($analisis['conflictos_duplicados'] as $c): ?>
                                <tr>
                                    <td><span class="badge bg-warning text-dark"><?= htmlspecialchars($c['tipo']) ?></span></td>
                                    <td><span class="badge-code"><?= htmlspecialchars($c['p_principal']['CodigoInterno'] ?? 'N/A') ?></span></td>
                                    <td>
                                        <div class="fw-bold">ID: <?= $c['p_principal']['id'] ?></div>
                                        <div class="text-white small"><?= htmlspecialchars($c['p_principal']['NombreComercial']) ?></div>
                                    </td>
                                    <td>
                                        <div class="fw-bold text-info">ID: <?= $c['p_secundaria']['id'] ?></div>
                                        <div class="text-info small"><?= htmlspecialchars($c['p_secundaria']['NombreComercial']) ?></div>
                                    </td>
                                    <td><small class="text-secondary"><?= htmlspecialchars($c['razon']) ?></small></td>
                                </tr>
                            <?php endforeach; ?>
                        </tbody>
                    </table>
                </div>
            <?php endif; ?>
        </div>

    <?php endif; ?>
</div>

</body>
</html>
