<?php
include('conexion.php');
include('nomina_helpers.php');
session_start();

if (!isset($_SESSION['usuario'])) {
    header('Location: login.php');
    exit;
}

$flash = nomina_flash_get();
$errors = [];
$editState = false;

$form = [
    'id' => 0,
    'codigo' => '',
    'tipo' => 'QUINCENAL',
    'fecha_desde' => '',
    'fecha_hasta' => '',
    'moneda_base' => 'VES',
    'estado' => 'ABIERTO',
    'es_ultima_quincena' => 0,
];

if (isset($_GET['edit'])) {
    $editId = (int)$_GET['edit'];
    $periodo = nomina_get_periodo($conexion, $editId);
    if ($periodo) {
        $form = [
            'id' => (int)$periodo['id'],
            'codigo' => $periodo['codigo'],
            'tipo' => $periodo['tipo'],
            'fecha_desde' => $periodo['fecha_desde'],
            'fecha_hasta' => $periodo['fecha_hasta'],
            'moneda_base' => $periodo['moneda_base'],
            'estado' => $periodo['estado'],
            'es_ultima_quincena' => (int)$periodo['es_ultima_quincena'],
        ];
        $editState = true;
    }
}

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $form['id'] = isset($_POST['id']) ? (int)$_POST['id'] : 0;
    $form['codigo'] = trim((string)($_POST['codigo'] ?? ''));
    $form['tipo'] = strtoupper(trim((string)($_POST['tipo'] ?? 'QUINCENAL')));
    $form['fecha_desde'] = nomina_date_to_iso($_POST['fecha_desde'] ?? '');
    $form['fecha_hasta'] = nomina_date_to_iso($_POST['fecha_hasta'] ?? '');
    $form['moneda_base'] = strtoupper(trim((string)($_POST['moneda_base'] ?? 'VES')));
    $form['estado'] = strtoupper(trim((string)($_POST['estado'] ?? 'ABIERTO')));
    $form['es_ultima_quincena'] = isset($_POST['es_ultima_quincena']) ? 1 : 0;

    if ($form['codigo'] === '') {
        $errors[] = 'Debes indicar el código del período.';
    }
    if ($form['fecha_desde'] === '' || $form['fecha_hasta'] === '') {
        $errors[] = 'Debes indicar fecha desde y fecha hasta.';
    }
    if ($form['fecha_desde'] !== '' && $form['fecha_hasta'] !== '' && $form['fecha_desde'] > $form['fecha_hasta']) {
        $errors[] = 'La fecha desde no puede ser mayor que la fecha hasta.';
    }

    $overlap = nomina_periodo_has_overlap($conexion, $form['tipo'], $form['fecha_desde'], $form['fecha_hasta'], $form['id']);
    if ($overlap) {
        $errors[] = 'Las fechas se solapan con el período ' . h($overlap['codigo']) . '. Revisa antes de guardar.';
    }

    if (!$form['es_ultima_quincena'] && nomina_should_mark_ultima_quincena($form['tipo'], $form['fecha_desde'], $form['fecha_hasta'])) {
        $form['es_ultima_quincena'] = 1;
        $flash = ['type' => 'info', 'message' => 'Se marcó automáticamente como última quincena por corresponder al rango 16–30/31.'];
    }

    $codigoSql = mysqli_real_escape_string($conexion, $form['codigo']);
    $checkSql = "SELECT id FROM periodos_nomina WHERE codigo = '{$codigoSql}' AND id <> " . (int)$form['id'] . " LIMIT 1";
    $checkRes = mysqli_query($conexion, $checkSql);
    if ($checkRes && mysqli_num_rows($checkRes)) {
        $errors[] = 'Ya existe otro período con ese código.';
    }

    $lockInfo = $form['id'] ? nomina_periodo_lock_info($conexion, $form['id']) : ['total' => 0, 'pagadas' => 0, 'firmes' => 0];

    if (isset($_POST['save']) && !$errors) {
        $sql = sprintf(
            "INSERT INTO periodos_nomina (codigo, tipo, fecha_desde, fecha_hasta, moneda_base, estado, es_ultima_quincena)
             VALUES ('%s', '%s', '%s', '%s', '%s', '%s', %d)",
            mysqli_real_escape_string($conexion, $form['codigo']),
            mysqli_real_escape_string($conexion, $form['tipo']),
            mysqli_real_escape_string($conexion, $form['fecha_desde']),
            mysqli_real_escape_string($conexion, $form['fecha_hasta']),
            mysqli_real_escape_string($conexion, $form['moneda_base']),
            mysqli_real_escape_string($conexion, $form['estado']),
            (int)$form['es_ultima_quincena']
        );
        if (mysqli_query($conexion, $sql)) {
            nomina_flash_set('success', 'Período guardado correctamente.');
            header('Location: periodos_nomina.php');
            exit;
        }
        $errors[] = 'No se pudo guardar el período: ' . mysqli_error($conexion);
    }

    if (isset($_POST['update']) && !$errors) {
        if ($lockInfo['firmes'] > 0) {
            $original = nomina_get_periodo($conexion, $form['id']);
            if ($original) {
                $changedCritical = $original['codigo'] !== $form['codigo']
                    || $original['tipo'] !== $form['tipo']
                    || $original['fecha_desde'] !== $form['fecha_desde']
                    || $original['fecha_hasta'] !== $form['fecha_hasta']
                    || $original['moneda_base'] !== $form['moneda_base']
                    || (int)$original['es_ultima_quincena'] !== (int)$form['es_ultima_quincena'];
                if ($changedCritical) {
                    $errors[] = 'Este período ya tiene corridas calculadas/aprobadas/pagadas. Solo debes cambiar el estado, no la configuración base.';
                }
            }
        }

        if (!$errors) {
            $sql = sprintf(
                "UPDATE periodos_nomina
                 SET codigo='%s', tipo='%s', fecha_desde='%s', fecha_hasta='%s', moneda_base='%s', estado='%s', es_ultima_quincena=%d
                 WHERE id=%d",
                mysqli_real_escape_string($conexion, $form['codigo']),
                mysqli_real_escape_string($conexion, $form['tipo']),
                mysqli_real_escape_string($conexion, $form['fecha_desde']),
                mysqli_real_escape_string($conexion, $form['fecha_hasta']),
                mysqli_real_escape_string($conexion, $form['moneda_base']),
                mysqli_real_escape_string($conexion, $form['estado']),
                (int)$form['es_ultima_quincena'],
                (int)$form['id']
            );
            if (mysqli_query($conexion, $sql)) {
                nomina_flash_set('success', 'Período actualizado correctamente.');
                header('Location: periodos_nomina.php');
                exit;
            }
            $errors[] = 'No se pudo actualizar el período: ' . mysqli_error($conexion);
        }
    }
}

if (isset($_GET['delete'])) {
    $deleteId = (int)$_GET['delete'];
    $lockInfo = nomina_periodo_lock_info($conexion, $deleteId);
    if ($lockInfo['total'] > 0) {
        nomina_flash_set('error', 'No se puede eliminar el período porque ya tiene corridas asociadas.');
    } else {
        mysqli_query($conexion, 'DELETE FROM periodos_nomina WHERE id=' . $deleteId);
        nomina_flash_set('success', 'Período eliminado correctamente.');
    }
    header('Location: periodos_nomina.php');
    exit;
}

$periodos = nomina_get_periodos_with_stats($conexion);
$currentLock = $form['id'] ? nomina_periodo_lock_info($conexion, $form['id']) : ['total' => 0, 'pagadas' => 0, 'firmes' => 0];
?>
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Períodos 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:1280px;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}.grid{display:grid;grid-template-columns:repeat(12,1fr);gap:14px}.col-3{grid-column:span 3}.col-4{grid-column:span 4}.col-6{grid-column:span 6}.col-12{grid-column:span 12}@media(max-width:960px){.col-3,.col-4,.col-6{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:11px 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)}
.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)}.btn:disabled,.btn.disabled{opacity:.55;cursor:not-allowed;pointer-events:none}
.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)}
.row-actions{display:flex;flex-wrap:wrap;gap:10px;margin-top:14px}.inline-note{font-size:12px;color:var(--gray);margin-top:6px}.checkbox-card{display:flex;gap:10px;align-items:flex-start;padding:12px;border:1px dashed rgba(26,60,139,.25);border-radius:12px;background:#fbfdff}.stats{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:12px;margin-top:14px}.stat{padding:14px;border:1px solid var(--line);border-radius:14px;background:#fff}.stat b{display:block;font-size:22px;margin-bottom:4px}.table-wrap{overflow:auto}.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}.status{font-size:12px;color:#475569}.muted{color:var(--gray);font-size:12px}.warn-chip{display:inline-block;padding:4px 8px;border-radius:999px;background:rgba(255,152,0,.12);color:#9a5b00;font-size:11px;font-weight:600;margin-left:6px}
</style>
<link rel="stylesheet" href="nomina_ui_patch.css?v=20260415">
</head>
<body data-nomina-page="periodos">
<div class="container">
    <div class="topbar">
        <div>
            <div class="title">Períodos de Nómina</div>
            <div class="subtitle">Crea y controla quincenas de trabajo con mejor contexto operativo y menos errores de captura.</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>Uso sugerido</strong>
            <ul>
                <li>Crea períodos <b>QUINCENALES</b> con sus fechas reales.</li>
                <li>El sistema sugiere marcar <b>Última quincena</b> cuando el rango es 16–30/31.</li>
                <li>Si el período ya tiene corridas calculadas, evita cambiar su configuración base.</li>
                <li>Cuando cierres un período, úsalo solo para consulta y recibos.</li>
            </ul>
        </div>

        <?php if ($flash): ?>
            <div class="alert <?php echo h($flash['type']); ?>"><?php echo h($flash['message']); ?></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; ?>
        <?php if ($editState && $currentLock['firmes'] > 0): ?>
            <div class="alert info">Este período ya tiene corridas firmes. Puedes cambiar el <b>estado</b>, pero no conviene alterar fechas, código ni reglas base.</div>
        <?php endif; ?>

        <form method="post" id="form-periodo">
            <input type="hidden" name="id" value="<?php echo (int)$form['id']; ?>">
            <div class="grid">
                <div class="col-6">
                    <label for="codigo">Código del período</label>
                    <input id="codigo" name="codigo" required value="<?php echo h($form['codigo']); ?>" placeholder="Ej: 2026-04-Q1">
                    <div class="inline-note">Identificador visible en novedades, cálculo y recibos. Puedes escribirlo manualmente o dejar que el sistema lo sugiera según las fechas.</div>
                </div>
                <div class="col-3">
                    <label for="tipo">Tipo</label>
                    <select id="tipo" name="tipo">
                        <?php foreach (['SEMANAL','QUINCENAL','MENSUAL'] as $tipo): ?>
                            <option value="<?php echo $tipo; ?>" <?php echo $form['tipo'] === $tipo ? 'selected' : ''; ?>><?php echo $tipo; ?></option>
                        <?php endforeach; ?>
                    </select>
                </div>
                <div class="col-3">
                    <label for="estado">Estado</label>
                    <select id="estado" name="estado">
                        <?php foreach (['ABIERTO','CERRADO'] as $estado): ?>
                            <option value="<?php echo $estado; ?>" <?php echo $form['estado'] === $estado ? 'selected' : ''; ?>><?php echo $estado; ?></option>
                        <?php endforeach; ?>
                    </select>
                    <div class="inline-note">Abierto permite carga y cálculo. Cerrado deja el período solo para consulta.</div>
                </div>

                <div class="col-3">
                    <label for="fecha_desde">Fecha desde</label>
                    <input id="fecha_desde" type="date" name="fecha_desde" required value="<?php echo h($form['fecha_desde']); ?>">
                </div>
                <div class="col-3">
                    <label for="fecha_hasta">Fecha hasta</label>
                    <input id="fecha_hasta" type="date" name="fecha_hasta" required value="<?php echo h($form['fecha_hasta']); ?>">
                </div>
                <div class="col-3">
                    <label for="moneda_base">Moneda operativa</label>
                    <input id="moneda_base" name="moneda_base" value="<?php echo h($form['moneda_base']); ?>" placeholder="VES" readonly>
                    <div class="inline-note">Normalmente VES. Se usa como referencia del período.</div>
                </div>
                <div class="col-3">
                    <label>Configuración especial</label>
                    <div class="checkbox-card">
                        <input type="checkbox" id="es_ultima_quincena" name="es_ultima_quincena" value="1" <?php echo $form['es_ultima_quincena'] ? 'checked' : ''; ?> style="width:auto;margin-top:2px;">
                        <div>
                            <label for="es_ultima_quincena" style="margin:0;font-size:13px;">Última quincena del mes</label>
                            <div class="inline-note">Márcalo cuando el período corresponda al 16–30/31. En este período se liquida el cestaticket mensual.</div>
                        </div>
                    </div>
                </div>
            </div>
            <div class="row-actions">
                <?php if ($editState): ?>
                    <button class="btn" type="submit" name="update">Actualizar período</button>
                    <a class="btn secondary" href="periodos_nomina.php">Cancelar edición</a>
                <?php else: ?>
                    <button class="btn" type="submit" name="save">Guardar período</button>
                <?php endif; ?>
            </div>
        </form>
    </div>

    <div class="card">
        <div style="display:flex;justify-content:space-between;gap:12px;flex-wrap:wrap;align-items:flex-start;">
            <div>
                <h2 style="margin:0 0 6px 0;">Períodos registrados</h2>
                <div class="muted">La tabla muestra corridas asociadas y actividad del período para ayudar a RRHH a decidir si aún conviene editarlo.</div>
            </div>
        </div>

        <div class="stats">
            <div class="stat"><b><?php echo count($periodos); ?></b><span class="muted">Períodos registrados</span></div>
            <div class="stat"><b><?php echo count(array_filter($periodos, function($p){ return strtoupper($p['estado']) === 'ABIERTO'; })); ?></b><span class="muted">Períodos abiertos</span></div>
            <div class="stat"><b><?php echo count(array_filter($periodos, function($p){ return (int)$p['total_corridas'] > 0; })); ?></b><span class="muted">Períodos con corridas</span></div>
            <div class="stat"><b><?php echo count(array_filter($periodos, function($p){ return (int)$p['corridas_pagadas'] > 0; })); ?></b><span class="muted">Períodos con pagos</span></div>
        </div>

        <div class="table-wrap" style="margin-top:14px;">
            <table class="table">
                <thead>
                    <tr>
                        <th>Código</th>
                        <th>Tipo y fechas</th>
                        <th>Configuración</th>
                        <th>Actividad</th>
                        <th>Acciones</th>
                    </tr>
                </thead>
                <tbody>
                <?php if (!$periodos): ?>
                    <tr><td colspan="5" class="muted">No hay períodos registrados todavía.</td></tr>
                <?php else: ?>
                    <?php foreach ($periodos as $row): ?>
                        <?php $locked = (int)$row['total_corridas'] > 0; ?>
                        <tr>
                            <td>
                                <span class="badge"><?php echo h($row['codigo']); ?></span>
                                <?php if ((int)$row['es_ultima_quincena'] === 1): ?><span class="warn-chip">Última quincena</span><?php endif; ?>
                            </td>
                            <td>
                                <div><strong><?php echo h($row['tipo']); ?></strong></div>
                                <div class="muted">Desde <?php echo h($row['fecha_desde']); ?> hasta <?php echo h($row['fecha_hasta']); ?></div>
                            </td>
                            <td>
                                <div class="status">Moneda base: <b><?php echo h($row['moneda_base']); ?></b></div>
                                <div class="status">Estado: <b><?php echo h($row['estado']); ?></b></div>
                            </td>
                            <td>
                                <div class="status">Corridas: <b><?php echo (int)$row['total_corridas']; ?></b></div>
                                <div class="status">Última corrida: <b><?php echo $row['ultima_corrida'] ? h($row['ultima_corrida']) : '—'; ?></b></div>
                                <div class="status">Pagadas: <b><?php echo (int)$row['corridas_pagadas']; ?></b></div>
                            </td>
                            <td>
                                <div style="display:flex;flex-wrap:wrap;gap:8px;">
                                    <a class="btn secondary" href="periodos_nomina.php?edit=<?php echo (int)$row['id']; ?>">Editar</a>
                                    <a class="btn danger <?php echo $locked ? 'disabled' : ''; ?>" href="periodos_nomina.php?delete=<?php echo (int)$row['id']; ?>" onclick="return <?php echo $locked ? 'false' : 'confirm(\'¿Eliminar este período?\')'; ?>;">Eliminar</a>
                                </div>
                                <?php if ($locked): ?>
                                    <div class="inline-note">Bloqueado para eliminar porque ya tiene corridas asociadas.</div>
                                <?php endif; ?>
                            </td>
                        </tr>
                    <?php endforeach; ?>
                <?php endif; ?>
                </tbody>
            </table>
        </div>
    </div>
</div>
<script>
(function(){
  const tipo = document.getElementById('tipo');
  const desde = document.getElementById('fecha_desde');
  const hasta = document.getElementById('fecha_hasta');
  const ultima = document.getElementById('es_ultima_quincena');
  function sugerirUltima(){
    if (!tipo || !desde || !hasta || !ultima) return;
    if (tipo.value !== 'QUINCENAL' || !desde.value || !hasta.value) return;
    const d = new Date(desde.value + 'T00:00:00');
    const h = new Date(hasta.value + 'T00:00:00');
    if (d.getFullYear() === h.getFullYear() && d.getMonth() === h.getMonth() && d.getDate() >= 16 && h.getDate() >= 28) {
      ultima.checked = true;
    }
  }
  [tipo,desde,hasta].forEach(el => el && el.addEventListener('change', sugerirUltima));
})();
</script>
<script src="nomina_ui_patch.js?v=20260415"></script>
</body>
</html>
