<?php
// profile/update.php
// Actualiza datos de contacto/dirección del distribuidor.
// Registra en audit_cambios los campos de contacto (tel1, tel2, email, wa).
require_once dirname(__FILE__) . '/../config.php';

if ($_SERVER['REQUEST_METHOD'] !== 'POST') { jsonErr(405, 'Metodo no permitido.'); }
$jwt   = auth();
$idinv = (int)$jwt['idinv'];
$b     = body();
$db    = getDB();

$mapa = [
    'tel1'           => 'tel1',
    'tel2'           => 'tel2',
    'email'          => 'email',
    'wa'             => 'wa',
    'domicilio'      => 'domicilio',
    'colonia'        => 'colonia',
    'cp'             => 'cp',
    'ciudad'         => 'ciudad',
    'nocuenta'       => 'nocuenta',
    'banco_idbanco'  => 'banco_idbanco',
    'depo'           => 'depo',
    'correo'         => 'email',
    'telefono'       => 'tel1',
    'celular'        => 'tel2',
    'calle'          => 'domicilio',
    'no_cuenta'      => 'nocuenta',
];

$auditables = ['tel1', 'tel2', 'email', 'wa'];

$sets        = [];
$params      = [];
$seen        = [];
$colsToAudit = [];

foreach ($mapa as $key => $col) {
    if (isset($b[$key]) && !in_array($col, $seen)) {
        $sets[]   = '`' . $col . '` = ?';
        $params[] = $b[$key];
        $seen[]   = $col;
        if (in_array($col, $auditables)) {
            $colsToAudit[$col] = $b[$key];
        }
    }
}

if (empty($sets)) { jsonErr(400, 'No hay campos para actualizar.'); }

if (isset($b['depo']) && !in_array(strtoupper((string)$b['depo']), ['DEPOSITO', 'VOUCHER', 'PENDIENTE'])) {
    jsonErr(400, 'El campo depo debe ser DEPOSITO, VOUCHER o PENDIENTE.');
}

$anterior = [];
if (!empty($colsToAudit)) {
    $db->exec("CREATE TABLE IF NOT EXISTS audit_cambios (
        id          INT UNSIGNED NOT NULL AUTO_INCREMENT,
        id_inver    INT NOT NULL,
        tipo        VARCHAR(30) NOT NULL,
        campo       VARCHAR(50) NOT NULL,
        valor_ant   TEXT,
        valor_nuevo TEXT,
        ip          VARCHAR(45),
        fecha       DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
        PRIMARY KEY (id),
        KEY idx_inver_tipo (id_inver, tipo),
        KEY idx_fecha (fecha)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4");

    $cols = implode(', ', array_map(fn($c) => "`$c`", array_keys($colsToAudit)));
    $cur  = $db->prepare("SELECT $cols FROM inversionista WHERE id_inver = ? LIMIT 1");
    $cur->execute([$idinv]);
    $anterior = $cur->fetch() ?: [];
}

$params[] = $idinv;
$db->prepare('UPDATE inversionista SET ' . implode(', ', $sets) . ' WHERE id_inver = ?')
   ->execute($params);

if (!empty($colsToAudit) && !empty($anterior)) {
    $ip  = $_SERVER['REMOTE_ADDR'] ?? null;
    $ins = $db->prepare(
        "INSERT INTO audit_cambios (id_inver, tipo, campo, valor_ant, valor_nuevo, ip) VALUES (?, 'contacto', ?, ?, ?, ?)"
    );
    foreach ($colsToAudit as $col => $nuevoVal) {
        $antVal = $anterior[$col] ?? null;
        if ((string)$antVal !== (string)$nuevoVal) {
            $ins->execute([$idinv, $col, $antVal, $nuevoVal, $ip]);
        }
    }
}

jsonOk(['mensaje' => 'Perfil actualizado correctamente.']);
