<?php
/**
 * Script de Reparación Hosting: Sincronizar farmacia_nadiecomoel2026 → farmacia_nadiecomoel
 * y activar los AUTO_INCREMENT faltantes en la base secundaria.
 */
header('Content-Type: text/plain; charset=utf-8');

$host = 'localhost';
$user = 'farmacia_onlydi2025';
$pass = '1corintios13';

$db_principal = 'farmacia_nadiecomoel2026';
$db_secundaria = 'farmacia_nadiecomoel';

try {
    $pdo1 = new PDO("mysql:host=$host;dbname=$db_principal;charset=utf8mb4", $user, $pass, [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]);
    $pdo2 = new PDO("mysql:host=$host;dbname=$db_secundaria;charset=utf8mb4", $user, $pass, [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]);

    echo "=== REPARACIÓN DE BASE DE DATOS DUAL EN HOSTING ===\n";
    echo "Principal: $db_principal  |  Secundaria: $db_secundaria\n";
    echo "--------------------------------------------------------\n\n";

    // 1. OBTENER Y CORREGIR ESTRUCTURA DE AUTO_INCREMENTS
    echo "--- 1. Verificando y corrigiendo AUTO_INCREMENT en columnas ---\n";
    $tables = $pdo1->query("
        SELECT c.TABLE_NAME, c.COLUMN_NAME, c.COLUMN_TYPE
        FROM information_schema.COLUMNS c
        JOIN information_schema.TABLES t ON c.TABLE_SCHEMA = t.TABLE_SCHEMA AND c.TABLE_NAME = t.TABLE_NAME
        WHERE c.TABLE_SCHEMA = '$db_principal' 
        AND c.EXTRA LIKE '%auto_increment%'
        ORDER BY c.TABLE_NAME
    ")->fetchAll(PDO::FETCH_ASSOC);

    $fixedCols = 0;
    foreach ($tables as $t) {
        $tableName = $t['TABLE_NAME'];
        $colName = $t['COLUMN_NAME'];
        $colType = $t['COLUMN_TYPE'];
        
        $col2 = $pdo2->query("
            SELECT EXTRA FROM information_schema.COLUMNS 
            WHERE TABLE_SCHEMA = '$db_secundaria' 
            AND TABLE_NAME = '$tableName' 
            AND COLUMN_NAME = '$colName'
        ")->fetch(PDO::FETCH_ASSOC);
        
        if (!$col2) continue; // Si la tabla no existe en la secundaria
        
        if (strpos($col2['EXTRA'], 'auto_increment') === false) {
            // Falta AUTO_INCREMENT en la secundaria, aplicarlo
            try {
                $pdo2->exec("ALTER TABLE `$tableName` MODIFY `$colName` $colType NOT NULL AUTO_INCREMENT");
                echo "  ✓ AUTO_INCREMENT activado en `$tableName`.`$colName`\n";
                $fixedCols++;
            } catch (Exception $ex) {
                echo "  ✗ Error al modificar `$tableName`.`$colName`: " . $ex->getMessage() . "\n";
            }
        }
    }
    echo "  Total columnas corregidas: $fixedCols\n\n";

    // 2. SINCRONIZAR DATOS FALTANTES
    echo "--- 2. Copiando registros faltantes a la base secundaria ---\n";
    $tablesToSync = [
        'productos',
        'productos_costo_promedio',
        'producto_presentaciones',
        'producto_lugares_compra',
        'fel_producto_mapping',
        'compras',
        'compras_detalle',
        'detalle_ventas',
        'ventas',
        'factura_archivos_pdf',
        'factura_dias_pdf',
        'fel_facturas',
    ];

    $totalFixed = 0;
    foreach ($tablesToSync as $table) {
        // Eliminar registro temporal id=0 si existe por fallas previas
        $pdo2->exec("DELETE FROM `$table` WHERE id = 0");

        // Buscar IDs en la principal que no están en la secundaria
        $missingIds = $pdo1->query("
            SELECT a.id FROM `$db_principal`.`$table` a
            LEFT JOIN `$db_secundaria`.`$table` b ON a.id = b.id
            WHERE b.id IS NULL
            ORDER BY a.id
        ")->fetchAll(PDO::FETCH_COLUMN);

        if (count($missingIds) > 0) {
            echo "  Tabla `$table`: Encontrados " . count($missingIds) . " registros faltantes.\n";
            
            $cols = $pdo1->query("SELECT COLUMN_NAME FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = '$db_principal' AND TABLE_NAME = '$table' ORDER BY ORDINAL_POSITION")->fetchAll(PDO::FETCH_COLUMN);
            $colList = implode(', ', array_map(fn($c) => "`$c`", $cols));
            $placeholders = implode(', ', array_fill(0, count($cols), '?'));
            
            $insertStmt = $pdo2->prepare("INSERT INTO `$table` ($colList) VALUES ($placeholders)");
            $selectStmt = $pdo1->prepare("SELECT $colList FROM `$table` WHERE id = ?");
            
            $inserted = 0;
            foreach ($missingIds as $id) {
                $selectStmt->execute([$id]);
                $row = $selectStmt->fetch(PDO::FETCH_NUM);
                if ($row) {
                    try {
                        $insertStmt->execute($row);
                        $inserted++;
                    } catch (Exception $e) {}
                }
            }
            echo "    ✓ Copiados: $inserted registros\n";
            $totalFixed += $inserted;
        }

        // Alinear el contador AUTO_INCREMENT
        $maxId1 = $pdo1->query("SELECT COALESCE(MAX(id), 0) FROM `$db_principal`.`$table`")->fetchColumn();
        $maxId2 = $pdo2->query("SELECT COALESCE(MAX(id), 0) FROM `$db_secundaria`.`$table`")->fetchColumn();
        $newAI = max($maxId1, $maxId2) + 1;
        $pdo2->exec("ALTER TABLE `$table` AUTO_INCREMENT = $newAI");
    }
    echo "  Total registros copiados: $totalFixed\n\n";

    // 3. PRUEBA DE INSERCIÓN FINAL
    echo "--- 3. Verificando funcionamiento de AUTO_INCREMENT ---\n";
    try {
        $pdo2->exec("INSERT INTO producto_presentaciones (producto_id, presentacion_id, factor_conversion, activo, es_unidad_base, orden, precio_venta) VALUES (999999, 99, 1, 0, 0, 0, 0)");
        $testId = $pdo2->lastInsertId();
        $pdo2->exec("DELETE FROM producto_presentaciones WHERE id = $testId");
        echo "  ✓ Prueba exitosa. ID dinámico generado: $testId\n";
        echo "  ✓ El sistema de replicación dual ya está listo y corregido.\n";
    } catch (Exception $e) {
        echo "  ✗ Error en prueba de inserción: " . $e->getMessage() . "\n";
    }

} catch (Exception $e) {
    echo "ERROR GENERAL: " . $e->getMessage() . "\n";
}
