<?php
/**
 * Helpers fase v7: prestaciones con historial salarial real e intereses BCV.
 * Compatible MariaDB/MySQL. Compatible MariaDB/MySQL con guardado por SELECT/UPDATE/INSERT seguro.
 */
if (!function_exists('nomina_pm_table_exists')) {
    function nomina_pm_table_exists($conexion, $table) {
        $table = preg_replace('/[^a-zA-Z0-9_]/', '', (string)$table);
        if ($table === '') { return false; }
        $res = @mysqli_query($conexion, "SHOW TABLES LIKE '" . mysqli_real_escape_string($conexion, $table) . "'");
        return $res && mysqli_num_rows($res) > 0;
    }
}

if (!function_exists('nomina_pm_ensure_schema')) {
    function nomina_pm_ensure_schema($conexion) {
        @mysqli_query($conexion, "CREATE TABLE IF NOT EXISTS nomina_tasas_interes_bcv (
            id INT AUTO_INCREMENT PRIMARY KEY,
            periodo_ym CHAR(7) NOT NULL,
            anio SMALLINT NOT NULL,
            mes TINYINT NOT NULL,
            tasa_activa_anual DECIMAL(10,4) NOT NULL DEFAULT 0.0000,
            tasa_pasiva_anual DECIMAL(10,4) NOT NULL DEFAULT 0.0000,
            tasa_promedio_anual DECIMAL(10,4) NOT NULL DEFAULT 0.0000,
            fecha_publicacion DATE DEFAULT NULL,
            fuente_url VARCHAR(255) DEFAULT NULL,
            aplica_prestaciones TINYINT(1) NOT NULL DEFAULT 1,
            observacion VARCHAR(255) DEFAULT NULL,
            created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
            updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
            UNIQUE KEY uniq_periodo_ym (periodo_ym),
            KEY idx_anio_mes (anio, mes),
            KEY idx_aplica (aplica_prestaciones)
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4");

        @mysqli_query($conexion, "CREATE TABLE IF NOT EXISTS nomina_salario_historial (
            id INT AUTO_INCREMENT PRIMARY KEY,
            persona_id INT NOT NULL,
            fecha_desde DATE NOT NULL,
            fecha_hasta DATE DEFAULT NULL,
            salario_origen VARCHAR(30) DEFAULT NULL,
            salario_moneda VARCHAR(10) DEFAULT NULL,
            salario_monto_original DECIMAL(18,4) NOT NULL DEFAULT 0.0000,
            tasa_bcv_usada DECIMAL(18,6) NOT NULL DEFAULT 0.000000,
            salario_mensual_bs DECIMAL(18,4) NOT NULL DEFAULT 0.0000,
            salario_diario_bs DECIMAL(18,4) NOT NULL DEFAULT 0.0000,
            salario_hora_bs DECIMAL(18,4) NOT NULL DEFAULT 0.0000,
            bono_extra_usd_mensual DECIMAL(18,4) NOT NULL DEFAULT 0.0000,
            salario_normal_mensual_bs DECIMAL(18,4) NOT NULL DEFAULT 0.0000,
            salario_integral_mensual_bs DECIMAL(18,4) NOT NULL DEFAULT 0.0000,
            origen VARCHAR(40) NOT NULL DEFAULT 'CORRIDA_CERRADA',
            referencia_corrida_id INT DEFAULT NULL,
            snapshot_json JSON DEFAULT NULL,
            observacion VARCHAR(255) DEFAULT NULL,
            created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
            updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
            UNIQUE KEY uniq_persona_corrida (persona_id, referencia_corrida_id),
            KEY idx_persona_fecha (persona_id, fecha_desde),
            KEY idx_origen (origen)
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4");

        @mysqli_query($conexion, "CREATE TABLE IF NOT EXISTS nomina_prestaciones_intereses (
            id INT AUTO_INCREMENT PRIMARY KEY,
            persona_id INT NOT NULL,
            periodo_ym CHAR(7) NOT NULL,
            fecha_desde DATE NOT NULL,
            fecha_hasta DATE NOT NULL,
            metodo VARCHAR(30) NOT NULL DEFAULT 'PROMEDIO_ACTIVA_PASIVA',
            tasa_id INT DEFAULT NULL,
            tasa_anual DECIMAL(10,4) NOT NULL DEFAULT 0.0000,
            tasa_mensual DECIMAL(12,8) NOT NULL DEFAULT 0.00000000,
            capital_base_bs DECIMAL(18,2) NOT NULL DEFAULT 0.00,
            interes_bs DECIMAL(18,2) NOT NULL DEFAULT 0.00,
            fuente_url VARCHAR(255) DEFAULT NULL,
            observacion VARCHAR(255) DEFAULT NULL,
            estado VARCHAR(20) NOT NULL DEFAULT 'REGISTRADO',
            created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
            updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
            UNIQUE KEY uniq_persona_periodo_metodo (persona_id, periodo_ym, metodo),
            KEY idx_persona_fecha (persona_id, fecha_hasta),
            KEY idx_estado (estado)
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4");

        if (function_exists('nomina_table_has_column')) {
            if (!nomina_table_has_column($conexion, 'nomina_prestaciones_eventos', 'tasa_bcv_usada')) {
                @mysqli_query($conexion, "ALTER TABLE nomina_prestaciones_eventos ADD COLUMN tasa_bcv_usada DECIMAL(18,6) NOT NULL DEFAULT 0.000000 AFTER salario_integral_diario_bs");
            }
            if (!nomina_table_has_column($conexion, 'nomina_prestaciones_eventos', 'salario_moneda')) {
                @mysqli_query($conexion, "ALTER TABLE nomina_prestaciones_eventos ADD COLUMN salario_moneda VARCHAR(10) DEFAULT NULL AFTER tasa_bcv_usada");
            }
            if (!nomina_table_has_column($conexion, 'nomina_prestaciones_eventos', 'salario_monto_original')) {
                @mysqli_query($conexion, "ALTER TABLE nomina_prestaciones_eventos ADD COLUMN salario_monto_original DECIMAL(18,4) NOT NULL DEFAULT 0.0000 AFTER salario_moneda");
            }
            if (!nomina_table_has_column($conexion, 'nomina_prestaciones_eventos', 'fuente_salario')) {
                @mysqli_query($conexion, "ALTER TABLE nomina_prestaciones_eventos ADD COLUMN fuente_salario VARCHAR(40) DEFAULT NULL AFTER salario_monto_original");
            }
        }
        return true;
    }
}

if (!function_exists('nomina_pm_parse_period_ym')) {
    function nomina_pm_parse_period_ym($periodoYm) {
        $periodoYm = trim((string)$periodoYm);
        if (!preg_match('/^(20\d{2})-(0[1-9]|1[0-2])$/', $periodoYm, $m)) {
            return null;
        }
        return ['anio' => (int)$m[1], 'mes' => (int)$m[2], 'ym' => $periodoYm];
    }
}

if (!function_exists('nomina_pm_save_interest_rate')) {
    function nomina_pm_save_interest_rate($conexion, array $data) {
        nomina_pm_ensure_schema($conexion);
        $period = nomina_pm_parse_period_ym($data['periodo_ym'] ?? '');
        if (!$period) { return ['ok' => false, 'message' => 'Período inválido. Usa formato AAAA-MM.']; }
        $activa = nomina_normalize_decimal($data['tasa_activa_anual'] ?? 0);
        $pasiva = nomina_normalize_decimal($data['tasa_pasiva_anual'] ?? 0);
        $promedio = nomina_normalize_decimal($data['tasa_promedio_anual'] ?? 0);
        if ($promedio <= 0 && ($activa > 0 || $pasiva > 0)) { $promedio = ($activa + $pasiva) / 2; }
        $fechaPub = nomina_date_to_iso($data['fecha_publicacion'] ?? '') ?: null;
        $fuente = trim((string)($data['fuente_url'] ?? 'https://www.bcv.org.ve/estadisticas/tasas-de-interes'));
        $obs = trim((string)($data['observacion'] ?? 'Tasa de interés BCV para cálculo de prestaciones'));
        $aplica = !empty($data['aplica_prestaciones']) ? 1 : 0;

        $id = 0;
        $stmt = mysqli_prepare($conexion, "SELECT id FROM nomina_tasas_interes_bcv WHERE periodo_ym = ? LIMIT 1");
        if ($stmt) {
            mysqli_stmt_bind_param($stmt, 's', $period['ym']);
            mysqli_stmt_execute($stmt);
            mysqli_stmt_bind_result($stmt, $foundId);
            if (mysqli_stmt_fetch($stmt)) { $id = (int)$foundId; }
            mysqli_stmt_close($stmt);
        }
        if ($id > 0) {
            $stmt = mysqli_prepare($conexion, "UPDATE nomina_tasas_interes_bcv SET anio=?, mes=?, tasa_activa_anual=?, tasa_pasiva_anual=?, tasa_promedio_anual=?, fecha_publicacion=?, fuente_url=?, aplica_prestaciones=?, observacion=? WHERE id=?");
            if (!$stmt) { return ['ok' => false, 'message' => mysqli_error($conexion)]; }
            mysqli_stmt_bind_param($stmt, 'iidddssisi', $period['anio'], $period['mes'], $activa, $pasiva, $promedio, $fechaPub, $fuente, $aplica, $obs, $id);
            $ok = mysqli_stmt_execute($stmt);
            $err = mysqli_stmt_error($stmt);
            mysqli_stmt_close($stmt);
            return ['ok' => $ok, 'message' => $ok ? 'Tasa actualizada.' : $err];
        }
        $stmt = mysqli_prepare($conexion, "INSERT INTO nomina_tasas_interes_bcv (periodo_ym, anio, mes, tasa_activa_anual, tasa_pasiva_anual, tasa_promedio_anual, fecha_publicacion, fuente_url, aplica_prestaciones, observacion) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
        if (!$stmt) { return ['ok' => false, 'message' => mysqli_error($conexion)]; }
        mysqli_stmt_bind_param($stmt, 'siidddssis', $period['ym'], $period['anio'], $period['mes'], $activa, $pasiva, $promedio, $fechaPub, $fuente, $aplica, $obs);
        $ok = mysqli_stmt_execute($stmt);
        $err = mysqli_stmt_error($stmt);
        mysqli_stmt_close($stmt);
        return ['ok' => $ok, 'message' => $ok ? 'Tasa registrada.' : $err];
    }
}

if (!function_exists('nomina_pm_fetch_interest_rates')) {
    function nomina_pm_fetch_interest_rates($conexion, $limit = 60) {
        nomina_pm_ensure_schema($conexion);
        $limit = max(1, (int)$limit);
        $rows = [];
        $res = mysqli_query($conexion, "SELECT * FROM nomina_tasas_interes_bcv ORDER BY periodo_ym DESC LIMIT {$limit}");
        if ($res) { while ($r = mysqli_fetch_assoc($res)) { $rows[] = $r; } }
        return $rows;
    }
}

if (!function_exists('nomina_pm_get_rate_for_month')) {
    function nomina_pm_get_rate_for_month($conexion, $periodoYm, $metodo = 'PROMEDIO_ACTIVA_PASIVA') {
        nomina_pm_ensure_schema($conexion);
        $period = nomina_pm_parse_period_ym($periodoYm);
        if (!$period) { return null; }
        $stmt = mysqli_prepare($conexion, "SELECT * FROM nomina_tasas_interes_bcv WHERE periodo_ym = ? AND aplica_prestaciones = 1 LIMIT 1");
        if (!$stmt) { return null; }
        mysqli_stmt_bind_param($stmt, 's', $period['ym']);
        mysqli_stmt_execute($stmt);
        $res = mysqli_stmt_get_result($stmt);
        $row = $res ? mysqli_fetch_assoc($res) : null;
        mysqli_stmt_close($stmt);
        if (!$row) { return null; }
        $metodo = strtoupper((string)$metodo);
        if ($metodo === 'ACTIVA') { $tasa = (float)$row['tasa_activa_anual']; }
        elseif ($metodo === 'PASIVA') { $tasa = (float)$row['tasa_pasiva_anual']; }
        else { $tasa = (float)$row['tasa_promedio_anual']; }
        return ['row' => $row, 'tasa_anual' => $tasa, 'metodo' => $metodo === 'ACTIVA' || $metodo === 'PASIVA' ? $metodo : 'PROMEDIO_ACTIVA_PASIVA'];
    }
}

if (!function_exists('nomina_pm_capital_base_until')) {
    function nomina_pm_capital_base_until($conexion, $personaId, $fechaHasta) {
        nomina_pm_ensure_schema($conexion);
        $personaId = (int)$personaId;
        $fechaHasta = nomina_date_to_iso($fechaHasta);
        if ($personaId <= 0 || $fechaHasta === '') { return 0.0; }
        $sql = "SELECT tipo, monto_bs FROM nomina_prestaciones_eventos WHERE persona_id=? AND estado='REGISTRADO' AND fecha_evento <= ?";
        $stmt = mysqli_prepare($conexion, $sql);
        if (!$stmt) { return 0.0; }
        mysqli_stmt_bind_param($stmt, 'is', $personaId, $fechaHasta);
        mysqli_stmt_execute($stmt);
        $res = mysqli_stmt_get_result($stmt);
        $capital = 0.0;
        if ($res) {
            while ($row = mysqli_fetch_assoc($res)) {
                $tipo = strtoupper((string)$row['tipo']);
                $monto = nomina_normalize_decimal($row['monto_bs'] ?? 0);
                if ($tipo === 'ANTICIPO') { $capital -= abs($monto); }
                elseif (in_array($tipo, ['TRIMESTRAL','ADICIONAL_ANUAL','AJUSTE_HISTORICO'], true)) { $capital += $monto; }
            }
        }
        mysqli_stmt_close($stmt);
        return max(0.0, round($capital, 2));
    }
}

if (!function_exists('nomina_pm_register_advance')) {
    function nomina_pm_register_advance($conexion, $personaId, $fechaDocumento, $montoBs, $observacion) {
        nomina_pm_ensure_schema($conexion);
        $personaId = (int)$personaId;
        $fechaDocumento = nomina_date_to_iso($fechaDocumento) ?: date('Y-m-d');
        $monto = abs(nomina_normalize_decimal($montoBs));
        $obs = trim((string)$observacion);
        if ($personaId <= 0 || $monto <= 0 || strlen($obs) < 8) { return ['ok' => false, 'message' => 'Indica trabajador, monto y observación/soporte del anticipo.']; }
        $periodRef = 'ANT-' . date('YmdHis');
        $stmt = mysqli_prepare($conexion, "INSERT INTO nomina_prestaciones_eventos (persona_id, fecha_documento, fecha_evento, tipo, periodo_ref, anio_servicio, trimestre_nro, es_historico, dias, salario_normal_mensual_bs, salario_diario_bs, salario_integral_diario_bs, monto_bs, observacion, estado) VALUES (?, ?, ?, 'ANTICIPO', ?, 0, 0, 0, 0, 0, 0, 0, ?, ?, 'REGISTRADO')");
        if (!$stmt) { return ['ok' => false, 'message' => mysqli_error($conexion)]; }
        mysqli_stmt_bind_param($stmt, 'isssds', $personaId, $fechaDocumento, $fechaDocumento, $periodRef, $monto, $obs);
        $ok = mysqli_stmt_execute($stmt);
        $err = mysqli_stmt_error($stmt);
        mysqli_stmt_close($stmt);
        return ['ok' => $ok, 'message' => $ok ? 'Anticipo de prestaciones registrado.' : $err];
    }
}

if (!function_exists('nomina_pm_generate_interests')) {
    function nomina_pm_generate_interests($conexion, $personaId, $fechaCorte, $metodo = 'PROMEDIO_ACTIVA_PASIVA', $observacion = '') {
        nomina_pm_ensure_schema($conexion);
        $personaId = (int)$personaId;
        $fechaCorte = nomina_date_to_iso($fechaCorte) ?: date('Y-m-d');
        if ($personaId <= 0) { return ['ok' => false, 'message' => 'Trabajador inválido.', 'created' => 0, 'missing' => []]; }
        $minDate = null;
        $stmt = mysqli_prepare($conexion, "SELECT MIN(fecha_evento) FROM nomina_prestaciones_eventos WHERE persona_id=? AND estado='REGISTRADO' AND tipo IN ('TRIMESTRAL','ADICIONAL_ANUAL','AJUSTE_HISTORICO')");
        if ($stmt) {
            mysqli_stmt_bind_param($stmt, 'i', $personaId);
            mysqli_stmt_execute($stmt);
            mysqli_stmt_bind_result($stmt, $minDate);
            mysqli_stmt_fetch($stmt);
            mysqli_stmt_close($stmt);
        }
        if (!$minDate) { return ['ok' => false, 'message' => 'No hay capital base de prestaciones para calcular intereses.', 'created' => 0, 'missing' => []]; }
        try {
            $start = new DateTime(substr($minDate, 0, 7) . '-01');
            $end = new DateTime(substr($fechaCorte, 0, 7) . '-01');
        } catch (Exception $e) {
            return ['ok' => false, 'message' => 'Fechas inválidas.', 'created' => 0, 'missing' => []];
        }
        $created = 0; $skipped = 0; $missing = []; $errors = [];
        $obs = trim((string)$observacion);
        if ($obs === '') { $obs = 'Interés mensual sobre prestaciones con tasa BCV'; }
        $current = clone $start;
        while ($current <= $end) {
            $ym = $current->format('Y-m');
            $monthEnd = clone $current;
            $monthEnd->modify('last day of this month');
            if ($monthEnd->format('Y-m-d') > $fechaCorte) { $monthEnd = new DateTime($fechaCorte); }
            $rateInfo = nomina_pm_get_rate_for_month($conexion, $ym, $metodo);
            if (!$rateInfo || (float)$rateInfo['tasa_anual'] <= 0) { $missing[] = $ym; $current->modify('+1 month'); continue; }
            $capital = nomina_pm_capital_base_until($conexion, $personaId, $monthEnd->format('Y-m-d'));
            if ($capital <= 0) { $skipped++; $current->modify('+1 month'); continue; }
            $exists = 0;
            $stmt = mysqli_prepare($conexion, "SELECT id FROM nomina_prestaciones_intereses WHERE persona_id=? AND periodo_ym=? AND metodo=? AND estado='REGISTRADO' LIMIT 1");
            if ($stmt) {
                mysqli_stmt_bind_param($stmt, 'iss', $personaId, $ym, $rateInfo['metodo']);
                mysqli_stmt_execute($stmt);
                mysqli_stmt_bind_result($stmt, $existsId);
                if (mysqli_stmt_fetch($stmt)) { $exists = (int)$existsId; }
                mysqli_stmt_close($stmt);
            }
            if ($exists > 0) { $skipped++; $current->modify('+1 month'); continue; }
            $tasaAnual = (float)$rateInfo['tasa_anual'];
            $tasaMensual = ($tasaAnual / 100.0) / 12.0;
            $interes = round($capital * $tasaMensual, 2);
            $rateRow = $rateInfo['row'];
            $tasaId = (int)$rateRow['id'];
            $fechaDesde = $current->format('Y-m-01');
            $fechaHasta = $monthEnd->format('Y-m-d');
            $fuente = (string)($rateRow['fuente_url'] ?? '');
            $stmt = mysqli_prepare($conexion, "INSERT INTO nomina_prestaciones_intereses (persona_id, periodo_ym, fecha_desde, fecha_hasta, metodo, tasa_id, tasa_anual, tasa_mensual, capital_base_bs, interes_bs, fuente_url, observacion, estado) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 'REGISTRADO')");
            if (!$stmt) { $errors[] = mysqli_error($conexion); $current->modify('+1 month'); continue; }
            mysqli_stmt_bind_param($stmt, 'issssiddddss', $personaId, $ym, $fechaDesde, $fechaHasta, $rateInfo['metodo'], $tasaId, $tasaAnual, $tasaMensual, $capital, $interes, $fuente, $obs);
            $ok = mysqli_stmt_execute($stmt);
            $err = mysqli_stmt_error($stmt);
            mysqli_stmt_close($stmt);
            if ($ok) { $created++; } else { $errors[] = $err; }
            $current->modify('+1 month');
        }
        $msg = 'Intereses generados: ' . $created . '. Meses omitidos/existentes: ' . $skipped . '.';
        if ($missing) { $msg .= ' Faltan tasas BCV para: ' . implode(', ', array_unique($missing)) . '.'; }
        if ($errors) { $msg .= ' Errores: ' . implode(' | ', array_slice($errors, 0, 3)); }
        return ['ok' => empty($errors), 'message' => $msg, 'created' => $created, 'missing' => array_unique($missing)];
    }
}

if (!function_exists('nomina_pm_sum_interests')) {
    function nomina_pm_sum_interests($conexion, $personaId) {
        nomina_pm_ensure_schema($conexion);
        $personaId = (int)$personaId;
        $sum = 0.0;
        $stmt = mysqli_prepare($conexion, "SELECT COALESCE(SUM(interes_bs),0) FROM nomina_prestaciones_intereses WHERE persona_id=? AND estado='REGISTRADO'");
        if ($stmt) {
            mysqli_stmt_bind_param($stmt, 'i', $personaId);
            mysqli_stmt_execute($stmt);
            mysqli_stmt_bind_result($stmt, $sum);
            mysqli_stmt_fetch($stmt);
            mysqli_stmt_close($stmt);
        }
        return round((float)$sum, 2);
    }
}

if (!function_exists('nomina_pm_sum_advances')) {
    function nomina_pm_sum_advances($conexion, $personaId) {
        nomina_pm_ensure_schema($conexion);
        $personaId = (int)$personaId;
        $sum = 0.0;
        $stmt = mysqli_prepare($conexion, "SELECT COALESCE(SUM(monto_bs),0) FROM nomina_prestaciones_eventos WHERE persona_id=? AND tipo='ANTICIPO' AND estado='REGISTRADO'");
        if ($stmt) {
            mysqli_stmt_bind_param($stmt, 'i', $personaId);
            mysqli_stmt_execute($stmt);
            mysqli_stmt_bind_result($stmt, $sum);
            mysqli_stmt_fetch($stmt);
            mysqli_stmt_close($stmt);
        }
        return round((float)$sum, 2);
    }
}

if (!function_exists('nomina_pm_fetch_interests')) {
    function nomina_pm_fetch_interests($conexion, $personaId, $limit = 24) {
        nomina_pm_ensure_schema($conexion);
        $personaId = (int)$personaId; $limit = max(1, (int)$limit);
        $rows = [];
        $stmt = mysqli_prepare($conexion, "SELECT * FROM nomina_prestaciones_intereses WHERE persona_id=? AND estado='REGISTRADO' ORDER BY periodo_ym DESC LIMIT {$limit}");
        if ($stmt) {
            mysqli_stmt_bind_param($stmt, 'i', $personaId);
            mysqli_stmt_execute($stmt);
            $res = mysqli_stmt_get_result($stmt);
            if ($res) { while ($r = mysqli_fetch_assoc($res)) { $rows[] = $r; } }
            mysqli_stmt_close($stmt);
        }
        return $rows;
    }
}

if (!function_exists('nomina_pm_sync_salary_history_from_closed_runs')) {
    function nomina_pm_sync_salary_history_from_closed_runs($conexion) {
        nomina_pm_ensure_schema($conexion);
        if (!nomina_pm_table_exists($conexion, 'nomina_corrida_trabajador_snapshot')) {
            return ['ok' => false, 'message' => 'No existe nomina_corrida_trabajador_snapshot.', 'created' => 0];
        }
        $sql = "SELECT c.id AS corrida_id, p.fecha_inicio, p.fecha_fin, s.*, d.base_salario_normal, d.base_salario_integral
                FROM nomina_corrida_trabajador_snapshot s
                INNER JOIN nomina_corridas c ON c.id = s.corrida_id
                INNER JOIN periodos_nomina p ON p.id = c.periodo_id
                LEFT JOIN nomina_detalle d ON d.corrida_id = c.id AND d.persona_id = s.persona_id
                WHERE c.estado IN ('PAGADA','CERRADA')
                ORDER BY c.id ASC, s.persona_id ASC";
        $res = mysqli_query($conexion, $sql);
        if (!$res) { return ['ok' => false, 'message' => mysqli_error($conexion), 'created' => 0]; }
        $created = 0; $skipped = 0; $errors = [];
        while ($row = mysqli_fetch_assoc($res)) {
            $personaId = (int)$row['persona_id'];
            $corridaId = (int)$row['corrida_id'];
            $exists = 0;
            $stmt = mysqli_prepare($conexion, "SELECT id FROM nomina_salario_historial WHERE persona_id=? AND referencia_corrida_id=? LIMIT 1");
            if ($stmt) {
                mysqli_stmt_bind_param($stmt, 'ii', $personaId, $corridaId);
                mysqli_stmt_execute($stmt);
                mysqli_stmt_bind_result($stmt, $foundId);
                if (mysqli_stmt_fetch($stmt)) { $exists = (int)$foundId; }
                mysqli_stmt_close($stmt);
            }
            if ($exists > 0) { $skipped++; continue; }
            $desde = $row['fecha_inicio'] ?: date('Y-m-d');
            $hasta = $row['fecha_fin'] ?: null;
            $salarioOrigen = (string)($row['salario_origen'] ?? 'CORRIDA');
            $salarioMoneda = (string)($row['salario_moneda'] ?? 'VES');
            $salarioMontoOriginal = nomina_normalize_decimal($row['salario_monto_original'] ?? 0);
            $tasa = nomina_normalize_decimal($row['tasa_bcv_usada'] ?? 0);
            $mensual = nomina_normalize_decimal($row['salario_mensual_bs'] ?? 0);
            $diario = nomina_normalize_decimal($row['salario_diario_bs'] ?? 0);
            $hora = nomina_normalize_decimal($row['salario_hora_bs'] ?? 0);
            $bonoUsd = nomina_normalize_decimal($row['bono_extra_usd_mensual'] ?? 0);
            $normal = nomina_normalize_decimal($row['base_salario_normal'] ?? 0);
            $integral = nomina_normalize_decimal($row['base_salario_integral'] ?? 0);
            $snapshot = (string)($row['snapshot_json'] ?? '');
            if ($snapshot === '') { $snapshot = null; }
            $obs = 'Sincronizado desde corrida cerrada/pagada #' . $corridaId;
            $stmt = mysqli_prepare($conexion, "INSERT INTO nomina_salario_historial (persona_id, fecha_desde, fecha_hasta, salario_origen, salario_moneda, salario_monto_original, tasa_bcv_usada, salario_mensual_bs, salario_diario_bs, salario_hora_bs, bono_extra_usd_mensual, salario_normal_mensual_bs, salario_integral_mensual_bs, origen, referencia_corrida_id, snapshot_json, observacion) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 'CORRIDA_CERRADA', ?, ?, ?)");
            if (!$stmt) { $errors[] = mysqli_error($conexion); continue; }
            mysqli_stmt_bind_param($stmt, 'issssddddddddiss', $personaId, $desde, $hasta, $salarioOrigen, $salarioMoneda, $salarioMontoOriginal, $tasa, $mensual, $diario, $hora, $bonoUsd, $normal, $integral, $corridaId, $snapshot, $obs);
            $ok = mysqli_stmt_execute($stmt);
            $err = mysqli_stmt_error($stmt);
            mysqli_stmt_close($stmt);
            if ($ok) { $created++; } else { $errors[] = $err; }
        }
        $msg = 'Historial salarial sincronizado. Nuevos registros: ' . $created . '. Existentes omitidos: ' . $skipped . '.';
        if ($errors) { $msg .= ' Errores: ' . implode(' | ', array_slice($errors, 0, 3)); }
        return ['ok' => empty($errors), 'message' => $msg, 'created' => $created];
    }
}

if (!function_exists('nomina_pm_fetch_salary_history')) {
    function nomina_pm_fetch_salary_history($conexion, $personaId, $limit = 24) {
        nomina_pm_ensure_schema($conexion);
        $personaId = (int)$personaId; $limit = max(1, (int)$limit);
        $rows = [];
        $stmt = mysqli_prepare($conexion, "SELECT * FROM nomina_salario_historial WHERE persona_id=? ORDER BY fecha_desde DESC, id DESC LIMIT {$limit}");
        if ($stmt) {
            mysqli_stmt_bind_param($stmt, 'i', $personaId);
            mysqli_stmt_execute($stmt);
            $res = mysqli_stmt_get_result($stmt);
            if ($res) { while ($r = mysqli_fetch_assoc($res)) { $rows[] = $r; } }
            mysqli_stmt_close($stmt);
        }
        return $rows;
    }
}

if (!function_exists('nomina_pm_recent_salary_history_count')) {
    function nomina_pm_recent_salary_history_count($conexion) {
        nomina_pm_ensure_schema($conexion);
        $count = 0;
        $res = mysqli_query($conexion, "SELECT COUNT(*) AS c FROM nomina_salario_historial");
        if ($res && ($row = mysqli_fetch_assoc($res))) { $count = (int)$row['c']; }
        return $count;
    }
}
?>
