<?php
declare(strict_types=1);

require_once __DIR__ . '/../config/database.php';
require_once __DIR__ . '/../config/veiculo_modelo_base.php';

$pdo = db();
$backupModelos = 'veiculo_modelos_catalogo_backup_' . date('Ymd_His');
$backupVeiculos = 'veiculos_catalogo_backup_' . date('Ymd_His');
$pdo->exec('CREATE TABLE `' . $backupModelos . '` AS SELECT * FROM veiculo_modelos_catalogo');
$pdo->exec('CREATE TABLE `' . $backupVeiculos . '` AS SELECT id, id_modelo_catalogo, modelo FROM veiculos');

$pdo->beginTransaction();

try {
    $modelos = $pdo->query(
        'SELECT id, id_marca, nome, categoria_economica, categoria_plus, categoria_pro, ativo
         FROM veiculo_modelos_catalogo
         ORDER BY id ASC'
    )->fetchAll();

    $upsert = $pdo->prepare(
        'INSERT INTO veiculo_modelos_catalogo
         (id_marca, nome, categoria_economica, categoria_plus, categoria_pro, ativo)
         VALUES (?, ?, ?, ?, ?, ?)
         ON DUPLICATE KEY UPDATE
           categoria_economica = GREATEST(categoria_economica, VALUES(categoria_economica)),
           categoria_plus = GREATEST(categoria_plus, VALUES(categoria_plus)),
           categoria_pro = GREATEST(categoria_pro, VALUES(categoria_pro)),
           ativo = GREATEST(ativo, VALUES(ativo)),
           id = LAST_INSERT_ID(id)'
    );
    $updateTarget = $pdo->prepare(
        'UPDATE veiculo_modelos_catalogo
         SET categoria_economica = GREATEST(categoria_economica, ?),
             categoria_plus = GREATEST(categoria_plus, ?),
             categoria_pro = GREATEST(categoria_pro, ?),
             ativo = GREATEST(ativo, ?)
         WHERE id = ?'
    );
    $updateVeiculos = $pdo->prepare(
        'UPDATE veiculos
         SET id_modelo_catalogo = ?, modelo = ?
         WHERE id_modelo_catalogo = ?'
    );
    $deleteModelo = $pdo->prepare('DELETE FROM veiculo_modelos_catalogo WHERE id = ?');

    $cache = [];
    $criados = 0;
    $removidos = 0;
    $inalterados = 0;
    $veiculosAtualizados = 0;

    foreach ($modelos as $modelo) {
        $id = (int) $modelo['id'];
        $idMarca = (int) $modelo['id_marca'];
        $nomeOriginal = (string) $modelo['nome'];
        $nomeBase = veiculo_modelo_base($nomeOriginal);
        if ($nomeBase === '') {
            $nomeBase = $nomeOriginal;
        }

        $nomeChave = function_exists('mb_strtolower') ? mb_strtolower($nomeBase, 'UTF-8') : strtolower($nomeBase);
        $key = $idMarca . '|' . $nomeChave;
        if (!isset($cache[$key])) {
            $upsert->execute([
                $idMarca,
                $nomeBase,
                (int) $modelo['categoria_economica'],
                (int) $modelo['categoria_plus'],
                (int) $modelo['categoria_pro'],
                (int) $modelo['ativo'],
            ]);
            $targetId = (int) $pdo->lastInsertId();
            $cache[$key] = $targetId;
            if ($targetId !== $id) {
                $criados++;
            }
        } else {
            $targetId = $cache[$key];
            $updateTarget->execute([
                (int) $modelo['categoria_economica'],
                (int) $modelo['categoria_plus'],
                (int) $modelo['categoria_pro'],
                (int) $modelo['ativo'],
                $targetId,
            ]);
        }

        if ($targetId === $id) {
            if ($nomeBase !== $nomeOriginal) {
                $rename = $pdo->prepare('UPDATE veiculo_modelos_catalogo SET nome = ? WHERE id = ?');
                $rename->execute([$nomeBase, $id]);
            }
            $inalterados++;
            continue;
        }

        $updateVeiculos->execute([$targetId, $nomeBase, $id]);
        $veiculosAtualizados += $updateVeiculos->rowCount();
        $deleteModelo->execute([$id]);
        $removidos++;
    }

    $pdo->commit();

    $total = (int) $pdo->query('SELECT COUNT(*) FROM veiculo_modelos_catalogo')->fetchColumn();
    echo "Consolidado.\n";
    echo "Backup modelos: {$backupModelos}\n";
    echo "Backup veiculos: {$backupVeiculos}\n";
    echo "Modelos finais: {$total}\n";
    echo "Bases criadas: {$criados}\n";
    echo "Linhas removidas/mescladas: {$removidos}\n";
    echo "Linhas mantidas: {$inalterados}\n";
    echo "Veiculos atualizados: {$veiculosAtualizados}\n";
} catch (Throwable $e) {
    $pdo->rollBack();
    throw $e;
}
