<?php
/**
 * Migración: el SERVICIO se comporta como un PRODUCTO más del maestro.
 *
 *   - productos.tipo ENUM('producto','servicio'): el maestro distingue la clase.
 *   - servicios.producto_id (UNIQUE, FK): cada servicio queda representado por
 *     UN producto del maestro. Así el interés del lead, la rotación, el candado
 *     y el alcance operan por producto sin cambios; la diferencia aparece solo
 *     al cotizar (planes + documento premium).
 *   - Upgrade: servicios existentes sin producto reciben (o crean) su producto.
 *
 * Uso: C:\wamp\bin\php\php5.5.12\php.exe database\migracion_producto_servicio.php
 */
$env = include __DIR__ . '/../.env.php';
$pdo = new PDO(
    'mysql:host=' . $env['DB_HOST'] . ';dbname=' . $env['DB_NAME'] . ';charset=utf8mb4',
    $env['DB_USER'],
    $env['DB_PASS'],
    array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION)
);

// ── productos.tipo ──────────────────────────────────────────────────────────
if ($pdo->query("SHOW COLUMNS FROM productos LIKE 'tipo'")->fetch()) {
    echo "Columna productos.tipo ya existe.\n";
} else {
    $pdo->exec("ALTER TABLE productos ADD COLUMN tipo ENUM('producto','servicio') NOT NULL DEFAULT 'producto' AFTER descripcion");
    echo "Columna productos.tipo agregada.\n";
}

// ── servicios.producto_id ───────────────────────────────────────────────────
if ($pdo->query("SHOW COLUMNS FROM servicios LIKE 'producto_id'")->fetch()) {
    echo "Columna servicios.producto_id ya existe.\n";
} else {
    $pdo->exec("ALTER TABLE servicios ADD COLUMN producto_id INT NULL AFTER marca_id");
    $pdo->exec("ALTER TABLE servicios ADD UNIQUE KEY uq_servicio_producto (producto_id)");
    // Sin CASCADE: los productos no se borran físicamente, solo se desactivan
    $pdo->exec("ALTER TABLE servicios ADD CONSTRAINT fk_servicio_producto FOREIGN KEY (producto_id) REFERENCES productos(id)");
    echo "Columna servicios.producto_id agregada (UNIQUE + FK).\n";
}

// ── Upgrade: enlazar servicios existentes con su producto ───────────────────
$huerfanos = $pdo->query("SELECT s.id, s.marca_id, s.nombre, s.descripcion, s.activo, m.vertical_id
                          FROM servicios s INNER JOIN marcas m ON m.id = s.marca_id
                          WHERE s.producto_id IS NULL")->fetchAll(PDO::FETCH_ASSOC);
if (!$huerfanos) {
    echo "Todos los servicios ya tienen producto enlazado.\n";
}
$stmtBuscar = $pdo->prepare("SELECT id FROM productos WHERE marca_id = ? AND nombre = ? LIMIT 1");
$stmtCrear  = $pdo->prepare(
    "INSERT INTO productos (vertical_id, marca_id, nombre, descripcion, tipo, precio_minimo, precio_maximo, precio_sugerido, moneda, es_suscripcion, activo)
     VALUES (?, ?, ?, ?, 'servicio', 0, NULL, 0, 'CLP', 0, ?)"
);
foreach ($huerfanos as $srv) {
    $stmtBuscar->execute(array($srv['marca_id'], $srv['nombre']));
    $prod = $stmtBuscar->fetch(PDO::FETCH_ASSOC);
    if ($prod) {
        $productoId = (int)$prod['id'];
        echo "Servicio {$srv['nombre']}: producto existente $productoId enlazado.\n";
    } else {
        $stmtCrear->execute(array($srv['vertical_id'], $srv['marca_id'], $srv['nombre'], $srv['descripcion'], $srv['activo']));
        $productoId = (int)$pdo->lastInsertId();
        echo "Servicio {$srv['nombre']}: producto $productoId creado.\n";
    }
    $pdo->prepare("UPDATE productos SET tipo = 'servicio' WHERE id = ?")->execute(array($productoId));
    $pdo->prepare("UPDATE servicios SET producto_id = ? WHERE id = ?")->execute(array($productoId, $srv['id']));
}

echo "Migración completada.\n";
