<?php
require_once __DIR__ . '/../../config/auth.php';

$configuraciones = require __DIR__ . '/config.php';
$modulo = $_GET['mod'] ?? 'colaboradores';

if (!isset($configuraciones[$modulo])) {
    http_response_code(404);
    exit('Módulo no encontrado.');
}

$config = $configuraciones[$modulo];
$tabla = $config['tabla'];
$campos = $config['campos'];
$id = filter_input(INPUT_GET, 'id', FILTER_VALIDATE_INT) ?: 0;
$accion = $_GET['accion'] ?? 'lista';
$errores = [];
$datos = [];
$colaboradorAnteriorConcepto = null;

foreach ($campos as $nombre => $definicion) {
    if (($definicion['type'] ?? '') === 'multiselect_sql') {
        $datos[$nombre] = [];
    } else {
        $datos[$nombre] = ($definicion['type'] ?? '') === 'checkbox' ? 1 : '';
    }
}
if ($modulo === 'documentos' && $accion === 'nuevo' && !empty($_GET['colaborador_id'])) {
    $datos['colaborador_id'] = (int) $_GET['colaborador_id'];
}

if ($accion === 'editar' && $id) {
    $stmt = $conn->prepare("SELECT * FROM `$tabla` WHERE id=?");
    $stmt->bind_param('i', $id);
    $stmt->execute();
    $registro = $stmt->get_result()->fetch_assoc();
    $stmt->close();
    if (!$registro) {
        http_response_code(404);
        exit('Registro no encontrado.');
    }
    $datos = array_merge($datos, $registro);
    if (in_array($modulo, ['descuentos', 'adicionales'], true)) {
        $colaboradorAnteriorConcepto = (int) $registro['colaborador_id'];
    }
    if ($modulo === 'capacitaciones') {
        $participantes = $conn->prepare(
            'SELECT colaborador_id FROM capacitacion_colaboradores WHERE capacitacion_id=?'
        );
        $participantes->bind_param('i', $id);
        $participantes->execute();
        $resultadoParticipantes = $participantes->get_result();
        $datos['colaboradores_ids'] = [];
        while ($participante = $resultadoParticipantes->fetch_assoc()) {
            $datos['colaboradores_ids'][] = (int) $participante['colaborador_id'];
        }
        $participantes->close();
    }
}

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $id = filter_input(INPUT_POST, 'id', FILTER_VALIDATE_INT) ?: 0;
    foreach ($campos as $nombre => $definicion) {
        $tipoCampo = $definicion['type'] ?? '';
        if ($tipoCampo === 'checkbox') {
            $datos[$nombre] = isset($_POST[$nombre]) ? 1 : 0;
        } elseif ($tipoCampo === 'multiselect_sql') {
            $datos[$nombre] = array_values(array_filter(
                array_map('intval', (array) ($_POST[$nombre] ?? []))
            ));
        } else {
            $datos[$nombre] = limpiar($_POST[$nombre] ?? '');
            if ($tipoCampo === 'number') {
                $datos[$nombre] = numero_entero($datos[$nombre]);
            }
        }
        if (($definicion['required'] ?? false)
            && ($datos[$nombre] === '' || $datos[$nombre] === [])) {
            $errores[] = 'El campo ' . $definicion['label'] . ' es obligatorio.';
        }
    }

    if ($modulo === 'ausencias' && $datos['fecha_hasta'] < $datos['fecha_desde']) {
        $errores[] = 'La fecha hasta no puede ser anterior a la fecha desde.';
    }
    if ($modulo === 'evaluaciones' && ((float) $datos['puntaje'] < 0 || (float) $datos['puntaje'] > 100)) {
        $errores[] = 'El puntaje debe estar entre 0 y 100.';
    }
    if ($modulo === 'colaboradores') {
        if ($datos['fecha_fin_contrato'] !== '' && $datos['fecha_ingreso'] !== '' && $datos['fecha_fin_contrato'] < $datos['fecha_ingreso']) {
            $errores[] = 'La fecha de fin de contrato no puede ser anterior al ingreso.';
        }
        if ($datos['fecha_egreso'] !== '' && $datos['fecha_ingreso'] !== '' && $datos['fecha_egreso'] < $datos['fecha_ingreso']) {
            $errores[] = 'La fecha de egreso no puede ser anterior al ingreso.';
        }
    }
    if (in_array($modulo, ['descuentos', 'adicionales'], true)) {
        if (!preg_match('/^\d{4}-(0[1-9]|1[0-2])$/', $datos['desde_periodo'])) {
            $errores[] = 'El periodo inicial debe tener el formato AAAA-MM.';
        }
        if ($datos['hasta_periodo'] !== '' && !preg_match('/^\d{4}-(0[1-9]|1[0-2])$/', $datos['hasta_periodo'])) {
            $errores[] = 'El periodo final debe tener el formato AAAA-MM.';
        }
        if ($datos['hasta_periodo'] !== '' && $datos['hasta_periodo'] < $datos['desde_periodo']) {
            $errores[] = 'El periodo final no puede ser anterior al periodo inicial.';
        }
        if ((float) $datos['monto'] <= 0) {
            $errores[] = 'El monto debe ser mayor que cero.';
        }
    }
    if ($modulo === 'nomina') {
        $datos['total_neto'] = (float) $datos['salario_base'] + (float) $datos['horas_extra']
            + (float) $datos['bonificaciones'] - (float) $datos['descuentos'];
    }

    if (!$errores) {
        $nombres = array_keys(array_filter(
            $campos,
            fn($definicion) => !($definicion['virtual'] ?? false)
        ));
        $valores = [];
        foreach ($nombres as $nombre) {
            $valores[] = $datos[$nombre] === '' ? null : $datos[$nombre];
        }

        if ($id) {
            $asignaciones = implode(', ', array_map(fn($campo) => "`$campo`=?", $nombres));
            $sql = "UPDATE `$tabla` SET $asignaciones WHERE id=?";
            $stmt = $conn->prepare($sql);
            $tipos = str_repeat('s', count($valores)) . 'i';
            $parametros = array_merge($valores, [$id]);
            $stmt->bind_param($tipos, ...$parametros);
            $detalle = 'Actualización en ' . $config['titulo'];
        } else {
            $columnas = implode(', ', array_map(fn($campo) => "`$campo`", $nombres));
            $marcas = implode(', ', array_fill(0, count($nombres), '?'));
            $sql = "INSERT INTO `$tabla` ($columnas) VALUES ($marcas)";
            $stmt = $conn->prepare($sql);
            $tipos = str_repeat('s', count($valores));
            $stmt->bind_param($tipos, ...$valores);
            $detalle = 'Alta en ' . $config['titulo'];
        }

        if ($stmt->execute()) {
            $registroId = $id ?: $stmt->insert_id;
            if ($modulo === 'descuentos') {
                $colaboradorActual = (int) $datos['colaborador_id'];
                sincronizar_descuentos_nominas_abiertas($conn, $colaboradorActual);
                if ($colaboradorAnteriorConcepto && $colaboradorAnteriorConcepto !== $colaboradorActual) {
                    sincronizar_descuentos_nominas_abiertas($conn, $colaboradorAnteriorConcepto);
                }
            }
            if ($modulo === 'adicionales') {
                $colaboradorActual = (int) $datos['colaborador_id'];
                sincronizar_adicionales_nominas_abiertas($conn, $colaboradorActual);
                if ($colaboradorAnteriorConcepto && $colaboradorAnteriorConcepto !== $colaboradorActual) {
                    sincronizar_adicionales_nominas_abiertas($conn, $colaboradorAnteriorConcepto);
                }
            }
            if ($modulo === 'capacitaciones') {
                $borrarParticipantes = $conn->prepare(
                    'DELETE FROM capacitacion_colaboradores WHERE capacitacion_id=?'
                );
                $borrarParticipantes->bind_param('i', $registroId);
                $borrarParticipantes->execute();
                $borrarParticipantes->close();

                $insertarParticipante = $conn->prepare(
                    'INSERT INTO capacitacion_colaboradores
                     (capacitacion_id, colaborador_id) VALUES (?, ?)'
                );
                foreach ($datos['colaboradores_ids'] as $colaboradorId) {
                    $insertarParticipante->bind_param('ii', $registroId, $colaboradorId);
                    $insertarParticipante->execute();
                }
                $insertarParticipante->close();
            }
            registrar_auditoria($conn, $id ? 'UPDATE' : 'INSERT', $tabla, $registroId, $detalle);
            $_SESSION['flash_mensaje'] = 'Registro guardado correctamente.';
            $_SESSION['flash_tipo'] = 'success';
            $stmt->close();
            header('Location: /HM/modules/rrhh/index.php?mod=' . urlencode($modulo));
            exit;
        }
        $errores[] = 'No se pudo guardar el registro: ' . $stmt->error;
        $stmt->close();
    }
    $accion = $id ? 'editar' : 'nuevo';
}

$mensaje = $_SESSION['flash_mensaje'] ?? '';
$tipoMensaje = $_SESSION['flash_tipo'] ?? 'success';
unset($_SESSION['flash_mensaje'], $_SESSION['flash_tipo']);

include __DIR__ . '/../../includes/header.php';
include __DIR__ . '/../../includes/sidebar.php';
?>
<main class="main">
  <?php include __DIR__ . '/../../includes/topbar.php'; ?>
  <div class="content">
    <?php if ($accion === 'lista'): ?>
      <div class="d-flex flex-wrap justify-content-between align-items-center gap-3 mb-4">
        <div>
          <h3 class="page-title mb-1"><i class="fa <?= e($config['icono']) ?> me-2"></i><?= e($config['titulo']) ?></h3>
          <p class="text-muted mb-0"><?= e($config['descripcion']) ?></p>
        </div>
        <a class="btn btn-hm" href="/HM/modules/rrhh/index.php?mod=<?= e($modulo) ?>&accion=nuevo">
          <i class="fa fa-plus me-1"></i> Nuevo registro
        </a>
      </div>
      <?php if ($mensaje): ?><div class="alert alert-<?= e($tipoMensaje) ?>"><?= e($mensaje) ?></div><?php endif; ?>
      <div class="card card-hm">
        <div class="card-body">
          <div class="row mb-3">
            <div class="col-md-5">
              <label class="form-label" for="buscar-registro">Buscar</label>
              <input class="form-control" id="buscar-registro" type="search" placeholder="Escriba para filtrar">
            </div>
          </div>
          <div class="table-responsive">
            <table class="table table-hover align-middle mb-0" id="tabla-registros">
              <thead><tr>
                <?php foreach ($config['columnas'] as $etiqueta): ?><th><?= e($etiqueta) ?></th><?php endforeach; ?>
                <th class="text-end">Acciones</th>
              </tr></thead>
              <tbody>
              <?php
              $sqlLista = $config['list_sql'] ?? ('SELECT id, ' . implode(', ', array_map(fn($c) => "`$c`", array_keys($config['columnas']))) . " FROM `$tabla` ORDER BY id DESC");
              $registros = $conn->query($sqlLista);
              while ($fila = $registros->fetch_assoc()):
              ?>
                <tr>
                  <?php foreach (array_keys($config['columnas']) as $columna): ?>
                    <td><?= e(($config['formatos'][$columna] ?? '') === 'numero' ? numero_py($fila[$columna] ?? 0) : ($fila[$columna] ?? '—')) ?></td>
                  <?php endforeach; ?>
                  <td class="text-end">
                    <?php if ($modulo === 'colaboradores'): ?><a class="btn btn-sm btn-outline-secondary" title="Agregar documento al legajo" href="/HM/modules/rrhh/index.php?mod=documentos&accion=nuevo&colaborador_id=<?= (int) $fila['id'] ?>"><i class="fa fa-file-circle-plus"></i></a><?php endif; ?>
                    <a class="btn btn-sm btn-outline-primary" href="/HM/modules/rrhh/index.php?mod=<?= e($modulo) ?>&accion=editar&id=<?= (int) $fila['id'] ?>">
                      <i class="fa fa-pen"></i>
                    </a>
                  </td>
                </tr>
              <?php endwhile; ?>
              </tbody>
            </table>
          </div>
        </div>
      </div>
      <script>
      document.getElementById('buscar-registro').addEventListener('input', function () {
        const texto = this.value.toLowerCase();
        document.querySelectorAll('#tabla-registros tbody tr').forEach(function (fila) {
          fila.style.display = fila.innerText.toLowerCase().includes(texto) ? '' : 'none';
        });
      });
      </script>
    <?php else: ?>
      <a class="text-decoration-none" href="/HM/modules/rrhh/index.php?mod=<?= e($modulo) ?>"><i class="fa fa-arrow-left me-1"></i> Volver</a>
      <h3 class="page-title mt-2 mb-4"><?= $id ? 'Editar' : 'Nuevo registro' ?> — <?= e($config['titulo']) ?></h3>
      <?php if ($errores): ?>
        <div class="alert alert-danger"><ul class="mb-0"><?php foreach ($errores as $error): ?><li><?= e($error) ?></li><?php endforeach; ?></ul></div>
      <?php endif; ?>
      <div class="card card-hm">
        <div class="card-body p-4">
          <form method="post">
            <input type="hidden" name="id" value="<?= (int) $id ?>">
            <div class="row g-3">
              <?php foreach ($campos as $nombre => $definicion):
                $tipo = $definicion['type'] ?? 'text';
                $valor = $datos[$nombre] ?? '';
                $seccionActual = $definicion['seccion'] ?? '';
              ?>
                <?php if ($seccionActual !== ($ultimaSeccion ?? '')): $ultimaSeccion = $seccionActual; ?>
                  <?php if ($seccionActual): ?><div class="col-12"><h5 class="border-bottom pb-2 mt-3 text-primary"><?=e($seccionActual)?></h5></div><?php endif; ?>
                <?php endif; ?>
                <div class="<?= $tipo === 'textarea' ? 'col-12' : 'col-md-6' ?>">
                  <?php if ($tipo === 'checkbox'): ?>
                    <div class="form-check form-switch mt-4">
                      <input class="form-check-input" id="<?= e($nombre) ?>" type="checkbox" name="<?= e($nombre) ?>" <?= $valor ? 'checked' : '' ?>>
                      <label class="form-check-label" for="<?= e($nombre) ?>"><?= e($definicion['label']) ?></label>
                    </div>
                  <?php else: ?>
                    <label class="form-label" for="<?= e($nombre) ?>"><?= e($definicion['label']) ?><?= ($definicion['required'] ?? false) ? ' *' : '' ?></label>
                    <?php if ($tipo === 'select' || $tipo === 'select_sql' || $tipo === 'multiselect_sql'): ?>
                      <select class="form-select" id="<?= e($nombre) ?>"
                              name="<?= e($nombre) ?><?= $tipo === 'multiselect_sql' ? '[]' : '' ?>"
                              <?= $tipo === 'multiselect_sql' ? 'multiple size="7"' : '' ?>
                              <?= ($definicion['required'] ?? false) ? 'required' : '' ?>>
                        <?php if ($tipo !== 'multiselect_sql'): ?><option value="">Seleccione...</option><?php endif; ?>
                        <?php
                        $opciones = [];
                        if ($tipo === 'select') {
                            foreach ($definicion['options'] as $opcion) $opciones[] = ['id'=>$opcion,'nombre'=>$opcion];
                        } else {
                            $resultadoOpciones = $conn->query($definicion['sql']);
                            while ($opcion = $resultadoOpciones->fetch_assoc()) $opciones[] = $opcion;
                        }
                        foreach ($opciones as $opcion):
                          $seleccionado = $tipo === 'multiselect_sql'
                              ? in_array((int) $opcion['id'], array_map('intval', (array) $valor), true)
                              : (string) $valor === (string) $opcion['id'];
                        ?>
                          <option value="<?= e($opcion['id']) ?>" <?= $seleccionado ? 'selected' : '' ?>><?= e($opcion['nombre']) ?></option>
                        <?php endforeach; ?>
                      </select>
                      <?php if ($tipo === 'multiselect_sql'): ?>
                        <div class="form-text">Mantenga presionada la tecla Ctrl para seleccionar varios colaboradores.</div>
                      <?php endif; ?>
                    <?php elseif ($tipo === 'textarea'): ?>
                      <textarea class="form-control" id="<?= e($nombre) ?>" name="<?= e($nombre) ?>" rows="3"><?= e($valor) ?></textarea>
                    <?php else: ?>
                      <input class="form-control <?= $tipo === 'number' ? 'numero-miles' : '' ?>" id="<?= e($nombre) ?>"
                             type="<?= $tipo === 'number' ? 'text' : e($tipo) ?>" name="<?= e($nombre) ?>"
                             value="<?= e($tipo === 'number' ? numero_py($valor) : $valor) ?>"
                             inputmode="<?= $tipo === 'number' ? 'numeric' : 'text' ?>" placeholder="<?= e($definicion['placeholder'] ?? '') ?>"
                             <?= ($definicion['required'] ?? false) ? 'required' : '' ?>>
                    <?php endif; ?>
                  <?php endif; ?>
                </div>
              <?php endforeach; ?>
            </div>
            <div class="d-flex gap-2 mt-4">
              <button class="btn btn-hm" type="submit"><i class="fa fa-save me-1"></i> Guardar</button>
              <a class="btn btn-outline-secondary" href="/HM/modules/rrhh/index.php?mod=<?= e($modulo) ?>">Cancelar</a>
            </div>
          </form>
        </div>
      </div>
    <?php endif; ?>
  </div>
</main>
<?php include __DIR__ . '/../../includes/footer.php'; ?>
