<?php
include('conexion.php');
include('nomina_helpers.php');
include_once('nomina_legal_master.php');
session_start();
if (!isset($_SESSION['usuario'])) { header('Location: login.php'); exit; }
if (function_exists('nlm_ensure_master_schema')) { nlm_ensure_master_schema($conexion); }

$schemaFixed = nomina_ensure_conceptos_fixed_schema($conexion);
$flash = nomina_flash_get();
$errors = $schemaFixed['errors'];
$schemaNotice = !empty($schemaFixed['changes'])
    ? 'Se activó soporte para conceptos FIJOS globales con monto base en VES/USD: ' . implode(', ', $schemaFixed['changes']) . '.'
    : '';
$editState = false;
$form = [
    'id' => 0,
    'codigo' => '',
    'nombre' => '',
    'tipo' => 'ASIG',
    'modo_calculo' => 'FIJO',
    'tasa' => '',
    'monto_fijo' => '',
    'moneda_monto_fijo' => 'VES',
    'aplica_global' => 0,
    'incide_salario_normal' => 1,
    'incide_base_cotizacion' => 1,
    'activo' => 1,
];

if (isset($_GET['edit'])) {
    $editId = (int)$_GET['edit'];
    $res = mysqli_query($conexion, 'SELECT * FROM conceptos_nomina WHERE id=' . $editId);
    if ($res && mysqli_num_rows($res) === 1) {
        $row = mysqli_fetch_assoc($res);
        $form = [
            'id' => (int)$row['id'],
            'codigo' => $row['codigo'],
            'nombre' => $row['nombre'],
            'tipo' => $row['tipo'],
            'modo_calculo' => strtoupper((string)$row['modo_calculo']),
            'tasa' => $row['tasa'],
            'monto_fijo' => isset($row['monto_fijo']) ? $row['monto_fijo'] : '',
            'moneda_monto_fijo' => isset($row['moneda_monto_fijo']) ? strtoupper((string)$row['moneda_monto_fijo']) : 'VES',
            'aplica_global' => isset($row['aplica_global']) ? (int)$row['aplica_global'] : 0,
            'incide_salario_normal' => (int)$row['incide_salario_normal'],
            'incide_base_cotizacion' => (int)$row['incide_base_cotizacion'],
            'activo' => (int)$row['activo'],
        ];
        $editState = true;
    }
}

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $form['id'] = isset($_POST['id']) ? (int)$_POST['id'] : 0;
    $form['codigo'] = strtoupper(trim((string)($_POST['codigo'] ?? '')));
    $form['nombre'] = trim((string)($_POST['nombre'] ?? ''));
    $form['tipo'] = strtoupper(trim((string)($_POST['tipo'] ?? 'ASIG')));
    $form['modo_calculo'] = strtoupper(trim((string)($_POST['modo_calculo'] ?? 'FIJO')));
    $mapModo = [
        'MONTO FIJO (FIJO)' => 'FIJO',
        'POR PORCENTAJE (TASA)' => 'TASA',
        'CANTIDAD × VALOR (CANTIDAD)' => 'CANTIDAD',
        'CANTIDAD X VALOR (CANTIDAD)' => 'CANTIDAD',
    ];
    if (isset($mapModo[$form['modo_calculo']])) {
        $form['modo_calculo'] = $mapModo[$form['modo_calculo']];
    }
    if (!in_array($form['modo_calculo'], ['FIJO','TASA','CANTIDAD','FORMULA'], true)) {
        $form['modo_calculo'] = 'FIJO';
    }
    $form['tasa'] = trim((string)($_POST['tasa'] ?? ''));
    $form['monto_fijo'] = trim((string)($_POST['monto_fijo'] ?? ''));
    $form['moneda_monto_fijo'] = strtoupper(trim((string)($_POST['moneda_monto_fijo'] ?? 'VES')));
    $form['aplica_global'] = isset($_POST['aplica_global']) ? 1 : 0;
    $form['incide_salario_normal'] = isset($_POST['incide_salario_normal']) ? 1 : 0;
    $form['incide_base_cotizacion'] = isset($_POST['incide_base_cotizacion']) ? 1 : 0;
    $form['activo'] = isset($_POST['activo']) ? 1 : 0;

    if (!in_array($form['tipo'], ['ASIG','DED','PATR','PROV'], true)) {
        $form['tipo'] = 'ASIG';
    }
    if (!in_array($form['moneda_monto_fijo'], ['VES','USD'], true)) {
        $form['moneda_monto_fijo'] = 'VES';
    }

    if ($form['codigo'] === '') { $errors[] = 'Debes indicar el código del concepto.'; }
    if ($form['nombre'] === '') { $errors[] = 'Debes indicar el nombre del concepto.'; }
    if ($form['modo_calculo'] === 'TASA' && $form['tasa'] === '') { $errors[] = 'Cuando el modo es TASA, debes indicar la tasa.'; }
    if ($form['modo_calculo'] === 'TASA' && $form['tasa'] !== '' && nomina_normalize_decimal($form['tasa'], -1) < 0) { $errors[] = 'La tasa no puede ser negativa.'; }
    if ($form['modo_calculo'] === 'FIJO' && $form['aplica_global'] && $form['monto_fijo'] === '') { $errors[] = 'Cuando el concepto fijo aplica globalmente, debes indicar el monto fijo base.'; }
    if ($form['modo_calculo'] === 'FIJO' && $form['monto_fijo'] !== '' && nomina_normalize_decimal($form['monto_fijo'], -1) < 0) { $errors[] = 'El monto fijo no puede ser negativo. Usa el tipo DED si deseas que reste dinero.'; }

    if ($form['modo_calculo'] !== 'FIJO') {
        $form['monto_fijo'] = '';
        $form['moneda_monto_fijo'] = 'VES';
        $form['aplica_global'] = 0;
    }

    $tasaSql = $form['tasa'] === '' ? 'NULL' : (string)nomina_normalize_decimal($form['tasa']);
    $montoFijoSql = $form['monto_fijo'] === '' ? 'NULL' : (string)nomina_normalize_decimal($form['monto_fijo']);
    $checkSql = "SELECT id FROM conceptos_nomina WHERE codigo='" . mysqli_real_escape_string($conexion, $form['codigo']) . "' AND id <> " . (int)$form['id'] . ' LIMIT 1';
    $check = mysqli_query($conexion, $checkSql);
    if ($check && mysqli_num_rows($check) > 0) {
        $errors[] = 'Ya existe otro concepto con ese código.';
    }

    if (isset($_POST['save']) && !$errors) {
        $sql = "INSERT INTO conceptos_nomina (codigo, nombre, tipo, modo_calculo, tasa, monto_fijo, moneda_monto_fijo, aplica_global, incide_salario_normal, incide_base_cotizacion, activo)
                VALUES ('" . mysqli_real_escape_string($conexion, $form['codigo']) . "',
                        '" . mysqli_real_escape_string($conexion, $form['nombre']) . "',
                        '" . mysqli_real_escape_string($conexion, $form['tipo']) . "',
                        '" . mysqli_real_escape_string($conexion, $form['modo_calculo']) . "',
                        {$tasaSql}, {$montoFijoSql},
                        '" . mysqli_real_escape_string($conexion, $form['moneda_monto_fijo']) . "',
                        {$form['aplica_global']}, {$form['incide_salario_normal']}, {$form['incide_base_cotizacion']}, {$form['activo']})";
        if (mysqli_query($conexion, $sql)) {
            nomina_flash_set('success', 'Concepto creado correctamente.');
            header('Location: conceptos_nomina.php');
            exit;
        }
        $errors[] = 'No se pudo crear el concepto: ' . mysqli_error($conexion);
    }

    if (isset($_POST['update']) && !$errors) {
        $sql = "UPDATE conceptos_nomina
                SET codigo='" . mysqli_real_escape_string($conexion, $form['codigo']) . "',
                    nombre='" . mysqli_real_escape_string($conexion, $form['nombre']) . "',
                    tipo='" . mysqli_real_escape_string($conexion, $form['tipo']) . "',
                    modo_calculo='" . mysqli_real_escape_string($conexion, $form['modo_calculo']) . "',
                    tasa={$tasaSql},
                    monto_fijo={$montoFijoSql},
                    moneda_monto_fijo='" . mysqli_real_escape_string($conexion, $form['moneda_monto_fijo']) . "',
                    aplica_global={$form['aplica_global']},
                    incide_salario_normal={$form['incide_salario_normal']},
                    incide_base_cotizacion={$form['incide_base_cotizacion']},
                    activo={$form['activo']}
                WHERE id=" . (int)$form['id'];
        if (mysqli_query($conexion, $sql)) {
            nomina_flash_set('success', 'Concepto actualizado correctamente.');
            header('Location: conceptos_nomina.php');
            exit;
        }
        $errors[] = 'No se pudo actualizar el concepto: ' . mysqli_error($conexion);
    }
}

if (isset($_GET['delete'])) {
    $deleteId = (int)$_GET['delete'];
    $conceptRes = mysqli_query($conexion, 'SELECT * FROM conceptos_nomina WHERE id=' . $deleteId . ' LIMIT 1');
    $concept = $conceptRes ? mysqli_fetch_assoc($conceptRes) : null;

    if (!$concept) {
        nomina_flash_set('error', 'No se encontró el concepto solicitado.');
        header('Location: conceptos_nomina.php');
        exit;
    }

    $codigoConcepto = strtoupper((string)($concept['codigo'] ?? ''));
    if (nomina_es_concepto_base($codigoConcepto)) {
        nomina_flash_set('error', 'Este concepto pertenece al motor de nómina y no debe eliminarse desde catálogo. Puedes dejarlo activo/inactivo solo con revisión técnica.');
        header('Location: conceptos_nomina.php');
        exit;
    }

    $usedMovRes = mysqli_query($conexion, 'SELECT COUNT(*) AS total FROM nomina_movimientos WHERE concepto_id=' . $deleteId);
    $usedMov = $usedMovRes ? (int)(mysqli_fetch_assoc($usedMovRes)['total'] ?? 0) : 0;
    $usedManual = 0;
    if (function_exists('nomina_ensure_manual_novedades_schema')) {
        nomina_ensure_manual_novedades_schema($conexion);
        $usedManualRes = mysqli_query($conexion, 'SELECT COUNT(*) AS total FROM novedades_periodo_conceptos_manual WHERE concepto_id=' . $deleteId);
        $usedManual = $usedManualRes ? (int)(mysqli_fetch_assoc($usedManualRes)['total'] ?? 0) : 0;
    }

    if ($usedMov > 0) {
        $sqlArchive = 'UPDATE conceptos_nomina SET activo=0, aplica_global=0 WHERE id=' . $deleteId;
        if (mysqli_query($conexion, $sqlArchive)) {
            nomina_flash_set('success', 'Concepto archivado correctamente. Tenía movimientos históricos, por eso no se borró físicamente; ya no aparecerá activo ni se aplicará en nuevas corridas.');
        } else {
            nomina_flash_set('error', 'No se pudo archivar el concepto: ' . mysqli_error($conexion));
        }
        header('Location: conceptos_nomina.php');
        exit;
    }

    if ($usedManual > 0) {
        mysqli_query($conexion, 'DELETE FROM novedades_periodo_conceptos_manual WHERE concepto_id=' . $deleteId);
    }

    if (mysqli_query($conexion, 'DELETE FROM conceptos_nomina WHERE id=' . $deleteId)) {
        nomina_flash_set('success', 'Concepto eliminado correctamente.');
    } else {
        $sqlArchive = 'UPDATE conceptos_nomina SET activo=0, aplica_global=0 WHERE id=' . $deleteId;
        if (mysqli_query($conexion, $sqlArchive)) {
            nomina_flash_set('success', 'No se pudo borrar físicamente por relación de base de datos, pero quedó archivado e inactivo para nuevas corridas.');
        } else {
            nomina_flash_set('error', 'No se pudo eliminar ni archivar el concepto: ' . mysqli_error($conexion));
        }
    }
    header('Location: conceptos_nomina.php');
    exit;
}

$showInactive = isset($_GET['show_inactive']) && (int)$_GET['show_inactive'] === 1;
$resultSql = $showInactive ? 'SELECT * FROM conceptos_nomina ORDER BY activo DESC, codigo ASC' : 'SELECT * FROM conceptos_nomina WHERE activo = 1 ORDER BY codigo ASC';
$result = mysqli_query($conexion, $resultSql);
$activeGlobalFixed = nomina_get_active_global_fixed_concepts($conexion, true);
?>
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Conceptos de Nómina</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet">
<style>
:root{--primary:#1a3c8b;--accent:#ff9800;--success:#166534;--danger:#be123c;--gray:#6b7280;--bg:#f5f7fa;--card:#fff;--line:#e5e7eb;--shadow:0 8px 24px rgba(16,24,40,.08);--radius:16px}
*{box-sizing:border-box}body{margin:0;font-family:'Inter',sans-serif;background:var(--bg);color:#24364b}a{color:var(--primary);text-decoration:none}.container{max-width:1380px;margin:24px auto;padding:0 16px}.topbar,.card{background:var(--card);border:1px solid var(--line);border-radius:var(--radius);box-shadow:var(--shadow)}.topbar{display:flex;justify-content:space-between;align-items:center;padding:16px 18px;gap:16px}.title{font-size:20px;font-weight:700}.subtitle{font-size:13px;color:var(--gray);margin-top:4px}.card{padding:18px;margin-top:16px}.btn{display:inline-flex;align-items:center;justify-content:center;gap:8px;padding:10px 14px;border-radius:12px;border:1px solid transparent;background:var(--primary);color:#fff;font-weight:600;cursor:pointer}.btn.secondary{background:#fff;color:var(--primary);border-color:rgba(26,60,139,.22)}.btn.danger{background:#fff;color:var(--danger);border-color:rgba(190,18,60,.22)}
.grid{display:grid;grid-template-columns:repeat(12,1fr);gap:14px}.col-3{grid-column:span 3}.col-4{grid-column:span 4}.col-5{grid-column:span 5}.col-6{grid-column:span 6}.col-7{grid-column:span 7}.col-12{grid-column:span 12}@media(max-width:980px){.col-3,.col-4,.col-5,.col-6,.col-7{grid-column:span 12}.topbar{flex-direction:column;align-items:flex-start}}
label{display:block;font-size:12px;font-weight:600;margin:0 0 6px 2px;color:#334155}input,select{width:100%;padding:10px 12px;border:1px solid var(--line);border-radius:12px;background:#fff;font:inherit}input:focus,select:focus{outline:none;border-color:rgba(26,60,139,.55);box-shadow:0 0 0 3px rgba(26,60,139,.12)}input[disabled],select[disabled]{background:#f8fafc;color:#64748b}
.help{border-left:4px solid var(--accent);background:rgba(255,152,0,.10);padding:14px;border-radius:14px;font-size:13px}.help ul{margin:8px 0 0 18px}.alert{padding:12px 14px;border-radius:12px;margin:12px 0;font-size:13px;border:1px solid}.alert.error{background:rgba(190,18,60,.08);border-color:rgba(190,18,60,.24);color:var(--danger)}.alert.success{background:rgba(22,101,52,.08);border-color:rgba(22,101,52,.22);color:var(--success)}.alert.info{background:rgba(26,60,139,.08);border-color:rgba(26,60,139,.22);color:var(--primary)}.table-wrap{overflow:auto;border:1px solid var(--line);border-radius:14px;margin-top:14px}.table{width:100%;border-collapse:collapse}.table th,.table td{padding:10px 12px;border-bottom:1px solid #eef2f7;font-size:13px;vertical-align:top;text-align:left}.table th{background:#fafafa;font-weight:700}.badge{display:inline-flex;padding:5px 10px;border-radius:999px;background:rgba(26,60,139,.10);color:var(--primary);font-size:12px;font-weight:600}.mini{font-size:11px;color:#64748b}.checks{display:flex;flex-direction:column;gap:8px;padding:12px;border:1px dashed rgba(26,60,139,.22);border-radius:12px;background:#fbfdff}.hint{font-size:12px;color:#64748b;margin-top:6px}.engine-tag{display:inline-flex;padding:4px 8px;border-radius:999px;background:rgba(255,152,0,.12);color:#9a5b00;font-size:11px;font-weight:700}.right-card{border:1px solid var(--line);border-radius:16px;padding:16px;background:#fbfcff;height:100%}.right-card table{width:100%;border-collapse:collapse;margin-top:10px}.right-card td{padding:7px 6px;border-bottom:1px dashed #dce5f1;font-size:13px}.right-card td:last-child{text-align:right;font-weight:600}.hide{display:none}
</style>
</head>
<body>
<div class="container">
    <div class="topbar">
        <div>
            <div class="title">Conceptos de Nómina</div>
            <div class="subtitle">Configura asignaciones y deducciones con monto fijo global en VES o USD indexado a la tasa BCV de la corrida.</div>
        </div>
        <div style="display:flex;gap:10px;flex-wrap:wrap;">
            <a class="btn secondary" href="index.php">Volver al dashboard</a>
        </div>
    </div>

    <div class="card">
        <div class="help">
            <strong>Cómo entender esta pantalla</strong>
            <ul>
                <li><b>Asignación</b> suma dinero. <b>Deducción</b> resta dinero.</li>
                <li><b>Monto fijo</b> puede quedar global para todos y guardarse en <b>VES</b> o en <b>USD</b>.</li>
                <li>Si el monto fijo está en <b>USD</b>, la nómina lo convertirá a bolívares con la <b>tasa BCV de la corrida</b>.</li>
                <li><b>Porcentaje</b>: escribe el valor decimal. Ejemplo: <code>0.04</code> = 4%.</li>
                <li>Los conceptos base del motor actual siguen siendo A-001…A-010 y B-001…B-007. Un concepto fijo nuevo puede entrar por <b>Novedades avanzadas</b> si es manual, o automáticamente si se marca como fijo global.</li>
            </ul>
        </div>
        <div class="alert info">Ejemplos rápidos: <b>CANTIDAD</b> = 2 horas extra × tarifa por hora. <b>TASA</b> = base × 4% (SSO). <b>FIJO</b> = bono nocturno 40 USD → Bs según BCV de la corrida.</div>

        <?php if ($flash): ?><div class="alert <?php echo h($flash['type']); ?>"><?php echo h($flash['message']); ?></div><?php endif; ?>
        <?php if ($schemaNotice): ?><div class="alert success"><?php echo h($schemaNotice); ?></div><?php endif; ?>
        <?php if ($errors): ?><div class="alert error"><strong>Revisa estos puntos:</strong><ul style="margin:8px 0 0 18px;"><?php foreach ($errors as $error): ?><li><?php echo $error; ?></li><?php endforeach; ?></ul></div><?php endif; ?>

        <form method="post">
            <input type="hidden" name="id" value="<?php echo (int)$form['id']; ?>">
            <div class="grid">
                <div class="col-7">
                    <div class="grid">
                        <div class="col-4">
                            <label for="codigo">Código interno</label>
                            <input id="codigo" name="codigo" required value="<?php echo h($form['codigo']); ?>" placeholder="Ej: A-999 / B-099">
                            <div class="hint">Usa un identificador corto y consistente. A = asignación, B = deducción.</div>
                        </div>
                        <div class="col-4">
                            <label for="nombre">Nombre del concepto</label>
                            <input id="nombre" name="nombre" required value="<?php echo h($form['nombre']); ?>" placeholder="Ej: Bono nocturno fijo global">
                        </div>
                        <div class="col-4">
                            <label for="tipo">Tipo de concepto</label>
                            <select id="tipo" name="tipo">
                                <?php foreach (['ASIG' => 'Asignación (ASIG)', 'DED' => 'Deducción (DED)', 'PATR' => 'Patronal (PATR)', 'PROV' => 'Provisión (PROV)'] as $key => $label): ?>
                                    <option value="<?php echo $key; ?>" <?php echo $form['tipo'] === $key ? 'selected' : ''; ?>><?php echo $label; ?></option>
                                <?php endforeach; ?>
                            </select>
                            <div class="hint">Asignación suma dinero. Deducción resta dinero.</div>
                        </div>

                        <div class="col-4">
                            <label for="modo_calculo">Cómo se calcula</label>
                            <select id="modo_calculo" name="modo_calculo">
                                <?php foreach (['FIJO' => 'Monto fijo (FIJO)', 'TASA' => 'Por porcentaje (TASA)', 'CANTIDAD' => 'Cantidad × valor (CANTIDAD)', 'FORMULA' => 'Fórmula (FORMULA)'] as $modo => $label): ?>
                                    <option value="<?php echo $modo; ?>" <?php echo $form['modo_calculo'] === $modo ? 'selected' : ''; ?>><?php echo $label; ?></option>
                                <?php endforeach; ?>
                            </select>
                            <div class="hint" id="modoHint">Usa un monto exacto por período. Puede ser fijo global o resolverse fuera del catálogo.</div>
                        </div>
                        <div class="col-4" id="tasaWrap">
                            <label for="tasa">Porcentaje</label>
                            <input id="tasa" name="tasa" value="<?php echo h($form['tasa']); ?>" placeholder="Ej: 0.04">
                            <div class="hint">Solo se usa cuando el modo es Por porcentaje (TASA). Ej.: 0.04 = 4%.</div>
                        </div>
                        <div class="col-4">
                            <label>Comportamiento del concepto</label>
                            <div class="checks">
                                <label><input type="checkbox" name="incide_salario_normal" <?php echo $form['incide_salario_normal'] ? 'checked' : ''; ?> style="width:auto;"> Forma parte del salario normal</label>
                                <label><input type="checkbox" name="incide_base_cotizacion" <?php echo $form['incide_base_cotizacion'] ? 'checked' : ''; ?> style="width:auto;"> Forma parte de la base de cotización</label>
                                <label><input type="checkbox" name="activo" <?php echo $form['activo'] ? 'checked' : ''; ?> style="width:auto;"> Activo</label>
                            </div>
                        </div>

                        <div class="col-4" id="montoFijoWrap">
                            <label for="monto_fijo">Monto fijo base</label>
                            <input id="monto_fijo" name="monto_fijo" value="<?php echo h($form['monto_fijo']); ?>" placeholder="Ej: 40 o 1500">
                            <div class="hint" id="montoFijoHint">Monto base global. Si la moneda es USD, se convertirá a Bs con la tasa BCV de la corrida.</div>
                        </div>
                        <div class="col-4" id="monedaFijaWrap">
                            <label for="moneda_monto_fijo">Moneda del monto fijo</label>
                            <select id="moneda_monto_fijo" name="moneda_monto_fijo">
                                <option value="VES" <?php echo $form['moneda_monto_fijo'] === 'VES' ? 'selected' : ''; ?>>VES · Monto fijo en bolívares</option>
                                <option value="USD" <?php echo $form['moneda_monto_fijo'] === 'USD' ? 'selected' : ''; ?>>USD · Convertir por BCV al calcular</option>
                            </select>
                            <div class="hint" id="monedaFijaHint">Para USD, la corrida congelará el BCV usado en ese cálculo.</div>
                        </div>
                        <div class="col-4" id="globalWrap">
                            <label>Aplicación del monto fijo</label>
                            <div class="checks">
                                <label><input type="checkbox" id="aplica_global" name="aplica_global" <?php echo $form['aplica_global'] ? 'checked' : ''; ?> style="width:auto;"> Aplicar globalmente a todos los trabajadores en la corrida</label>
                            </div>
                            <div class="hint">Úsalo para bonos o descuentos fijos globales. Los conceptos base del motor siguen su propia lógica.</div>
                        </div>
                    </div>

                    <div style="display:flex;gap:10px;flex-wrap:wrap;margin-top:14px;">
                        <?php if ($editState): ?>
                            <button class="btn" type="submit" name="update">Actualizar concepto</button>
                            <a class="btn secondary" href="conceptos_nomina.php">Cancelar edición</a>
                        <?php else: ?>
                            <button class="btn" type="submit" name="save">Guardar concepto</button>
                        <?php endif; ?>
                    </div>
                </div>

                <div class="col-5">
                    <div class="right-card">
                        <div style="font-size:15px;font-weight:700;">Ejemplo automático del concepto</div>
                        <div class="hint" id="previewLegend">Define si el monto fijo vive en VES o en USD y si se aplicará a todos en cada corrida.</div>
                        <table>
                            <tr><td>Nombre</td><td id="pvNombre"><?php echo h($form['nombre'] !== '' ? $form['nombre'] : 'Concepto actual'); ?></td></tr>
                            <tr><td>Tipo</td><td id="pvTipo"><?php echo h($form['tipo'] === 'DED' ? 'Deducción' : ($form['tipo'] === 'ASIG' ? 'Asignación' : $form['tipo'])); ?></td></tr>
                            <tr><td>Cómo se calcula</td><td id="pvModo"><?php echo h($form['modo_calculo']); ?></td></tr>
                            <tr><td>Porcentaje</td><td id="pvTasa"><?php echo $form['tasa'] !== '' ? h($form['tasa']) : 'No aplica'; ?></td></tr>
                            <tr><td>Monto fijo base</td><td id="pvMontoFijo"><?php echo $form['monto_fijo'] !== '' ? h($form['monto_fijo']) : 'No definido'; ?></td></tr>
                            <tr><td>Moneda base</td><td id="pvMonedaFijo"><?php echo h($form['moneda_monto_fijo']); ?></td></tr>
                            <tr><td>Aplicación</td><td id="pvGlobal"><?php echo $form['aplica_global'] ? 'Global en cada corrida' : 'No automático'; ?></td></tr>
                        </table>
                        <div class="hint" id="previewNote">Si eliges USD, el sistema multiplicará este monto por la tasa BCV que ingreses al calcular la nómina.</div>
                    </div>
                </div>
            </div>
        </form>
    </div>

    <?php if ($activeGlobalFixed): ?>
    <div class="card">
        <h2 style="margin:0 0 6px 0;">Conceptos fijos globales activos</h2>
        <div class="mini">Se aplicarán automáticamente a todos los trabajadores cuando calcules la nómina. En USD se convertirán usando la tasa BCV de la corrida.</div>
        <div class="table-wrap">
            <table class="table">
                <thead>
                    <tr>
                        <th>Código</th>
                        <th>Concepto</th>
                        <th>Tipo</th>
                        <th>Monto base</th>
                        <th>Moneda</th>
                        <th>Aplicación</th>
                    </tr>
                </thead>
                <tbody>
                    <?php foreach ($activeGlobalFixed as $fixed): ?>
                    <tr>
                        <td><span class="badge"><?php echo h($fixed['codigo']); ?></span></td>
                        <td><?php echo h($fixed['nombre']); ?></td>
                        <td><?php echo h($fixed['tipo']); ?></td>
                        <td><?php echo number_format((float)$fixed['monto_fijo'], 2, ',', '.'); ?></td>
                        <td><?php echo h(strtoupper((string)$fixed['moneda_monto_fijo'])); ?></td>
                        <td><span class="engine-tag">Global</span></td>
                    </tr>
                    <?php endforeach; ?>
                </tbody>
            </table>
        </div>
    </div>
    <?php endif; ?>

    <div class="card">
        <div style="display:flex;justify-content:space-between;align-items:flex-start;gap:12px;flex-wrap:wrap;">
            <div>
                <h2 style="margin:0 0 6px 0;">Catálogo actual</h2>
                <div class="mini">Los conceptos marcados como <span class="engine-tag">Base del motor</span> son los que el cálculo actual reconoce de forma explícita.</div>
            </div>
            <div>
                <?php if ($showInactive): ?>
                    <a class="btn secondary" href="conceptos_nomina.php">Ver solo activos</a>
                <?php else: ?>
                    <a class="btn secondary" href="conceptos_nomina.php?show_inactive=1">Ver archivados/inactivos</a>
                <?php endif; ?>
            </div>
        </div>

        <div class="table-wrap">
            <table class="table">
                <thead>
                    <tr>
                        <th>Código</th>
                        <th>Nombre</th>
                        <th>Tipo</th>
                        <th>Modo</th>
                        <th>Tasa</th>
                        <th>Monto fijo</th>
                        <th>Moneda</th>
                        <th>Aplicación</th>
                        <th>Flags</th>
                        <th>Uso</th>
                        <th>Acciones</th>
                    </tr>
                </thead>
                <tbody>
                    <?php while ($row = mysqli_fetch_assoc($result)): ?>
                        <tr style="<?php echo (int)$row['activo'] === 1 ? '' : 'opacity:.58;background:#fafafa;'; ?>">
                            <td><span class="badge"><?php echo h($row['codigo']); ?></span></td>
                            <td><?php echo h($row['nombre']); ?></td>
                            <td><?php echo h($row['tipo']); ?></td>
                            <td><?php echo h($row['modo_calculo']); ?></td>
                            <td><?php echo $row['tasa'] === null ? '—' : h($row['tasa']); ?></td>
                            <td><?php echo isset($row['monto_fijo']) && $row['monto_fijo'] !== null ? number_format((float)$row['monto_fijo'], 2, ',', '.') : '—'; ?></td>
                            <td><?php echo isset($row['moneda_monto_fijo']) ? h($row['moneda_monto_fijo']) : '—'; ?></td>
                            <td><?php echo !empty($row['aplica_global']) ? '<span class="engine-tag">Global</span>' : '<span class="mini">Manual / lógica del motor</span>'; ?></td>
                            <td>
                                <div class="mini">SN: <?php echo (int)$row['incide_salario_normal']; ?></div>
                                <div class="mini">BC: <?php echo (int)$row['incide_base_cotizacion']; ?></div>
                                <div class="mini">Activo: <?php echo (int)$row['activo']; ?></div>
                            </td>
                            <td>
                                <?php if (nomina_es_concepto_base($row['codigo'])): ?>
                                    <span class="engine-tag">Base del motor</span>
                                <?php elseif (($row['modo_calculo'] ?? '') === 'FIJO' && empty($row['aplica_global'])): ?>
                                    <span class="mini">Novedades avanzadas / recibos</span>
                                <?php elseif (($row['modo_calculo'] ?? '') === 'FIJO' && !empty($row['aplica_global'])): ?>
                                    <span class="mini">Global automático / recibos</span>
                                <?php else: ?>
                                    <span class="mini">Catálogo / ampliación futura</span>
                                <?php endif; ?>
                            </td>
                            <td>
                                <div style="display:flex;gap:8px;flex-wrap:wrap;">
                                    <a class="btn secondary" href="conceptos_nomina.php?edit=<?php echo (int)$row['id']; ?>">Editar</a>
                                    <a class="btn danger" href="conceptos_nomina.php?delete=<?php echo (int)$row['id']; ?>" onclick="return confirm('¿Eliminar o archivar este concepto? Si tiene movimientos históricos, se archivará para proteger recibos anteriores.');">Eliminar/archivar</a>
                                </div>
                            </td>
                        </tr>
                    <?php endwhile; ?>
                </tbody>
            </table>
        </div>
    </div>
</div>
<script>
(function(){
    const modo = document.getElementById('modo_calculo');
    const tasa = document.getElementById('tasa');
    const montoFijo = document.getElementById('monto_fijo');
    const monedaFija = document.getElementById('moneda_monto_fijo');
    const aplicaGlobal = document.getElementById('aplica_global');
    const nombre = document.getElementById('nombre');
    const tipo = document.getElementById('tipo');
    const modoHint = document.getElementById('modoHint');
    const montoFijoHint = document.getElementById('montoFijoHint');
    const previewLegend = document.getElementById('previewLegend');
    const previewNote = document.getElementById('previewNote');
    const pvNombre = document.getElementById('pvNombre');
    const pvTipo = document.getElementById('pvTipo');
    const pvModo = document.getElementById('pvModo');
    const pvTasa = document.getElementById('pvTasa');
    const pvMontoFijo = document.getElementById('pvMontoFijo');
    const pvMonedaFijo = document.getElementById('pvMonedaFijo');
    const pvGlobal = document.getElementById('pvGlobal');
    const montoWrap = document.getElementById('montoFijoWrap');
    const monedaWrap = document.getElementById('monedaFijaWrap');
    const globalWrap = document.getElementById('globalWrap');
    const tasaWrap = document.getElementById('tasaWrap');

    function syncUi(){
        const isFijo = modo && modo.value === 'FIJO';
        const isTasa = modo && modo.value === 'TASA';
        if (tasa) {
            tasa.disabled = !isTasa;
            if (!isTasa) tasa.value = '';
        }
        if (tasaWrap) tasaWrap.classList.toggle('hide', !isTasa);
        if (montoFijo) montoFijo.disabled = !isFijo;
        if (monedaFija) monedaFija.disabled = !isFijo;
        if (aplicaGlobal) aplicaGlobal.disabled = !isFijo;
        if (montoWrap) montoWrap.classList.toggle('hide', !isFijo);
        if (monedaWrap) monedaWrap.classList.toggle('hide', !isFijo);
        if (globalWrap) globalWrap.classList.toggle('hide', !isFijo);

        const map = {
            FIJO: 'Usa un monto exacto por período. Puede guardarse en VES o en USD y aplicarse globalmente.',
            TASA: 'Usa un porcentaje sobre una base. Ejemplo: 4% para SSO o 2.5% para RPE.',
            CANTIDAD: 'Multiplica una cantidad por una tarifa. Ejemplo: horas extra o días trabajados.',
            FORMULA: 'Reservado para una fase más avanzada del motor de nómina.'
        };
        if (modoHint) modoHint.textContent = map[modo.value] || 'Define cómo se calcula el monto del concepto.';
        if (montoFijoHint) {
            montoFijoHint.textContent = monedaFija && monedaFija.value === 'USD'
                ? 'Monto base en USD. La nómina lo convertirá a Bs con la tasa BCV ingresada en la corrida.'
                : 'Monto base en bolívares. Se aplicará directo en la corrida si está marcado como global.';
        }

        if (pvNombre) pvNombre.textContent = nombre && nombre.value ? nombre.value : 'Concepto actual';
        if (pvTipo) pvTipo.textContent = tipo && tipo.value === 'DED' ? 'Deducción' : (tipo && tipo.value === 'ASIG' ? 'Asignación' : (tipo ? tipo.value : ''));
        if (pvModo) pvModo.textContent = modo ? modo.options[modo.selectedIndex].text : '';
        if (pvTasa) pvTasa.textContent = isTasa && tasa && tasa.value ? tasa.value : 'No aplica';
        if (pvMontoFijo) pvMontoFijo.textContent = isFijo && montoFijo && montoFijo.value ? montoFijo.value : 'No definido';
        if (pvMonedaFijo) pvMonedaFijo.textContent = isFijo && monedaFija ? monedaFija.value : 'No aplica';
        if (pvGlobal) pvGlobal.textContent = isFijo && aplicaGlobal && aplicaGlobal.checked ? 'Global en cada corrida' : 'No automático';
        if (previewLegend) previewLegend.textContent = isFijo
            ? 'Para FIJO, el sistema puede aplicar el monto a todos. En USD se convierte a Bs usando el BCV de la corrida.'
            : (isTasa ? 'Para TASA, el porcentaje se multiplicará por la base que use el motor o la lógica asociada.' : 'Para CANTIDAD, el resultado depende de la cantidad capturada y la tarifa usada.');
        if (previewNote) previewNote.textContent = isFijo
            ? (monedaFija && monedaFija.value === 'USD' ? 'Ejemplo: 40 USD × tasa BCV de la corrida = monto aplicado en Bs.' : 'Ejemplo: Bs 1.500 exactos en la corrida.')
            : (isTasa ? 'Ejemplo: base × 0.04 = monto calculado.' : 'Ejemplo: 2 horas × tarifa por hora = monto calculado.');
    }
    [modo, tasa, montoFijo, monedaFija, aplicaGlobal, nombre, tipo].forEach(function(el){
        if (el) el.addEventListener('change', syncUi);
        if (el) el.addEventListener('input', syncUi);
    });
    syncUi();
})();
</script>
</body>
</html>
