<?php
// Load Core
include "core/controller/Database.php";
include "core/controller/Executor.php";

echo "<h2>Starting Database Refactor...</h2>";

// 1. Update DEPARTAMENTOS
echo "<h3>1. Updating 'departamentos'</h3>";
// Add codigo column if not exists
$sql = "SHOW COLUMNS FROM departamentos LIKE 'codigo'";
$con = Database::getCon();
$res = $con->query($sql);
if($res->num_rows == 0){
    Executor::doit("ALTER TABLE departamentos ADD COLUMN codigo VARCHAR(50)");
    echo "Added column 'codigo' to 'departamentos'.<br>";
} else {
    echo "Column 'codigo' already exists in 'departamentos'.<br>";
}

// 2. Update PROPIETARIOS
echo "<h3>2. Updating 'propietarios'</h3>";
// Add departamento_id
$sql = "SHOW COLUMNS FROM propietarios LIKE 'departamento_id'";
$res = $con->query($sql);
if($res->num_rows == 0){
    Executor::doit("ALTER TABLE propietarios ADD COLUMN departamento_id INT");
    echo "Added column 'departamento_id' to 'propietarios'.<br>";
} else {
    echo "Column 'departamento_id' already exists in 'propietarios'.<br>";
}

// 3. Update LECTURAS_AGUA
echo "<h3>3. Updating 'lecturas_agua'</h3>";
// Add departamento_id
$sql = "SHOW COLUMNS FROM lecturas_agua LIKE 'departamento_id'";
$res = $con->query($sql);
if($res->num_rows == 0){
    Executor::doit("ALTER TABLE lecturas_agua ADD COLUMN departamento_id INT");
    echo "Added column 'departamento_id' to 'lecturas_agua'.<br>";
} else {
    echo "Column 'departamento_id' already exists in 'lecturas_agua'.<br>";
}

// 4. MIGRATION LOGIC
echo "<h3>4. Migrating Data Relations...</h3>";

// Fetch all Departamentos
$sql = "SELECT * FROM departamentos";
$query = $con->query($sql);
$dptos = [];
while($r = $query->fetch_object()){
    $dptos[] = $r;
}

$count_prop = 0;
$count_lec = 0;

foreach($dptos as $d){
    // Construct typical Code/Name variations
    // Piso: "PB", Nombre: "A" -> "PB-A"
    // Piso: "1", Nombre "A" -> "1-A"
    
    $search_str = $d->piso . "-" . $d->nombre; // e.g., "1-A"
    
    // A. Update Propietarios
    // propietarios.dpto is "1-A"
    $update_prop = "UPDATE propietarios SET departamento_id = $d->id WHERE dpto = \"$search_str\" OR dpto = \"$d->nombre\""; 
    // Sometimes dpto might just be "A" if piso matches? No, looking at sql dump, it is "1-A", "PB-A".
    $con->query($update_prop);
    if($con->affected_rows > 0) $count_prop += $con->affected_rows;
    
    // B. Update Lecturas
    // lecturas_agua.dpto_nombre is "1-A"
    // lecturas also has codigo "111".
    $update_lec = "UPDATE lecturas_agua SET departamento_id = $d->id WHERE dpto_nombre = \"$search_str\"";
    $con->query($update_lec);
    if($con->affected_rows > 0) $count_lec += $con->affected_rows;
    
    // C. Try to backfill Codigo in Departamentos from Lecturas (if any match found)
    // We can just take one reading that has a code
    $sql_code = "SELECT codigo FROM lecturas_agua WHERE departamento_id = $d->id AND codigo != '' LIMIT 1";
    $q_code = $con->query($sql_code);
    if($q_code->num_rows > 0){
        $code_row = $q_code->fetch_object();
        if($code_row->codigo){
            $con->query("UPDATE departamentos SET codigo = \"$code_row->codigo\" WHERE id = $d->id");
        }
    }
}

echo "Linked $count_prop Propietarios.<br>";
echo "Linked $count_lec Lecturas.<br>";

// 5. Update BOLETAS
// Ensure lectura_id column (already done in setup_all but good to integrity check)
echo "<h3>5. Verifying Boletas</h3>";
$sql = "SHOW COLUMNS FROM boletas LIKE 'lectura_id'";
$res = $con->query($sql);
if($res->num_rows == 0){
    Executor::doit("ALTER TABLE boletas ADD COLUMN lectura_id INT");
    echo "Added column 'lectura_id' to 'boletas'.<br>";
}

echo "<h2>Refactor Complete.</h2>";
?>
