<?php
session_start();
header('Content-Type: application/json');
require_once __DIR__ . '/../../db/conexion.php';
require_once __DIR__ . '/../../phpmailer/configuracion_correo_movimientos.php';

function responderError($mensaje, $error = '') {
  $erroresUsuario = [
    'Acceso denegado',
    'ID inválido',
    'Movimiento no encontrado',
    'No hay posiciones'
  ];

  foreach ($erroresUsuario as $e) {
    if (str_starts_with($mensaje, $e)) {
      echo json_encode(['success' => false, 'message' => $mensaje, 'debug' => $error]);
      exit;
    }
  }

  // Si no es error de usuario, mandamos 500 real
  http_response_code(500);
  echo json_encode(['success' => false, 'message' => $mensaje, 'debug' => $error]);
  exit;
}


// Validar sesión admin
if (!isset($_SESSION['rol']) || $_SESSION['rol'] !== 'admin') {
  echo json_encode(['success' => false, 'message' => 'Acceso denegado']);
  exit;
}

// Extraer ID recibido desde JS
$data = json_decode(file_get_contents("php://input"), true);
$id = isset($data['id']) ? intval($data['id']) : 0;
if ($id <= 0) {
  echo json_encode(['success' => false, 'message' => 'ID inválido']);
  exit;
}

// Obtener datos completos del movimiento
$stmt = $conn->prepare("SELECT * FROM PlantillaSolicitMovim WHERE ID = ?");
$stmt->bind_param("i", $id);
if (!$stmt->execute()) {
  responderError('Error al obtener el movimiento.', $conn->error);
}
$res = $stmt->get_result();
$values = $res->fetch_assoc();

if (!$values) {
  echo json_encode(['success' => false, 'message' => 'Movimiento no encontrado']);
  exit;
}

// Validación inteligente de sueldos
$sueldo_actual = floatval($values['actualSueldo'] ?? 0);
$nuevo_sueldo = floatval($values['nuevoSueldo'] ?? 0);
$tipo_movimiento = trim($values['Movimiento'] ?? '');

$esCambioSueldo = str_contains($tipo_movimiento, 'Cambio de sueldo');
$esCambioTurno = str_contains($tipo_movimiento, 'Cambio de turno');

// Si incluye cambio de sueldo (solo o junto con otros), validar que realmente cambie el monto
if ($esCambioSueldo) {
  if ($sueldo_actual == $nuevo_sueldo) {
    responderError('El nuevo sueldo debe ser diferente al actual para un cambio de sueldo.');
  }
}

// Si NO incluye cambio de sueldo, pero el sueldo es diferente, bloquear
if (!$esCambioSueldo && !$esCambioTurno && $sueldo_actual != $nuevo_sueldo && $nuevo_sueldo > 0) {
  responderError('Se especificó un nuevo sueldo sin que sea un movimiento de tipo "Cambio de sueldo" o "Cambio de turno".');
}



// ✅ Validar disponibilidad de vacante si cambia PDV o puesto
if ($values['nuevoPDV'] !== $values['actualPDV'] || $values['nuevoPuesto'] !== $values['actualPuesto']) {
  if (!hayVacanteDisponible($values['nuevoPDV'], $values['nuevoPuesto'], $conn)) {
    responderError("No hay posiciones disponibles para el puesto '{$values['nuevoPuesto']}' en el PDV '{$values['nuevoPDV']}'.");
  }
}

// Registrar autorización
$fechaActual = date('Y-m-d H:i:s');
$nombreCompleto = trim($_SESSION['nombre'] . ' ' . $_SESSION['apellido_paterno'] . ' ' . $_SESSION['apellido_materno']);
$update = $conn->prepare("UPDATE PlantillaSolicitMovim SET EstatusRH = 1, fechaAutorizacionRH = ?, autorizadoPor = ? WHERE ID = ?");
$update->bind_param("ssi", $fechaActual, $nombreCompleto, $id);
if (!$update->execute()) {
  responderError('No se pudo actualizar el estatus de autorización.', $conn->error);
}

// ✅ CAMBIO DE UBICACIÓN
error_log("DEBUG - Movimiento: " . $values['Movimiento']);
error_log("DEBUG - ATTUID: " . $values['ATTUID']);
error_log("DEBUG - CURP: " . $values['CURP']);
error_log("DEBUG - nuevoPDV: " . $values['nuevoPDV']);
error_log("DEBUG - nuevoPuesto: " . $values['nuevoPuesto']);

// ✅ NUEVA FUNCIÓN: Validar si hay vacante disponible en nuevo PDV/puesto
function hayVacanteDisponible($nuevoPDVNombre, &$puestoSugerido, $conn) {
  // 1. Obtener ORGPDV desde Tiendas
  $stmtPDV = $conn->prepare("SELECT `ORGanizacionSOC` FROM Tiendas WHERE PDV = ?");
  $stmtPDV->bind_param("s", $nuevoPDVNombre);
  $stmtPDV->execute();
  $resPDV = $stmtPDV->get_result();
  $orgPDV = $resPDV->fetch_assoc()['ORGanizacionSOC'] ?? null;

  if (!$orgPDV) return false;

  // 2. Buscar códigos y puestos que contengan EJECUTIVO o GERENTE
  $stmt = $conn->prepare("SELECT codigo, NombrePuesto FROM Posiciones WHERE ORGPDV = ? AND (NombrePuesto LIKE '%EJECUTIVO%' OR NombrePuesto LIKE '%GERENTE%')");
  $stmt->bind_param("s", $orgPDV);
  $stmt->execute();
  $res = $stmt->get_result();

  $codigos = [];
  $nombres = [];
  while ($row = $res->fetch_assoc()) {
    $codigos[] = $row['codigo'];
    $nombres[$row['codigo']] = $row['NombrePuesto'];
  }

  if (empty($codigos)) return false;

  // 3. Validar ocupación en Plantilla
  $placeholders = implode(',', array_fill(0, count($codigos), '?'));
  $types = str_repeat('s', count($codigos));
  $stmt2 = $conn->prepare("SELECT posicionCode FROM Plantilla WHERE posicionCode IN ($placeholders)");
  $stmt2->bind_param($types, ...$codigos);
  $stmt2->execute();
  $res2 = $stmt2->get_result();
  $ocupados = [];
  while ($row = $res2->fetch_assoc()) {
    $ocupados[] = $row['posicionCode'];
  }

  // 4. Retornar el primero que esté libre
    foreach ($codigos as $codigo) {
     if (!in_array($codigo, $ocupados)) {
      $puestoSugerido = $nombres[$codigo];
      $codigoLibre = $codigo;
      return true;
    }
  }
  return false;
}

$puestoSugerido = '';
$codigoLibre = '';
// Validar si hay vacante disponible en nuevo PDV/puesto
if (str_contains($values['Movimiento'], 'Cambio de ubicación')) {
  if (!hayVacanteDisponible($values['nuevoPDV'], $puestoSugerido, $codigoLibre, $conn)) {
    responderError("No hay posiciones disponibles para EJECUTIVO o GERENTE en el PDV '{$values['nuevoPDV']}'.");
  }

  // Reemplazar el puesto automáticamente
  $values['nuevoPuesto'] = $puestoSugerido;
  $stmtPos = $conn->prepare("UPDATE Plantilla SET posicionCode = ? WHERE CURP = ?");
  $stmtPos->bind_param("ss", $codigoLibre, $values['CURP']);
  if (!$stmtPos->execute()) {
    responderError('Error al actualizar el código de posición en Plantilla.', $conn->error);
  }

   // Enviar correo
  $destinatarios = 'msaldivarc@rocasamexico.com' /* 'eocampov@rocasamexico.com,rh@rocasamexico.com' */;
  $asunto = "Nuevo Cambio de ubicación";
  $mensaje = "Se realizó un nuevo cambio de ubicación desde el sistema de Movimientos para el colaborador <b>{$values['Nombre']}</b>.<br><br>";
  $mensaje .= "Favor de solicitar el PRM correspondiente.";
  if ($values['temporalidadMovimiento'] === 'TEMPORAL') {
    $mensaje .= "<br><br>Vigente hasta la fecha: <b>{$values['fechaFin']}</b>";
  }
  enviarCorreo($destinatarios, $asunto, $mensaje);
}


// ✅ CAMBIO DE PERFIL / PUESTO
if (str_contains($values['Movimiento'], 'Cambio de perfil/puesto')) {
  $fechaActual = date('Y-m-d');
  $names = separaNombreCompleto($values['Nombre']);

  // Insertar en cambiosDePuesto
  $stmt1 = $conn->prepare("INSERT INTO cambiosDePuesto (queSeSolicita, noEmpleado, ATTUID, Nombre, `Apellido Paterno`, `Apellido Materno`, jefeInmediatoInterno, `Puesto NUEVO`, responsable_jefeExterno, `E-mail Proveedor`, `Tipo de Acceso`, Distribuidor)
                          VALUES ('Cambio de puesto', ?, ?, ?, ?, ?, 'Miguel Angel Medina Garcia', ?, 'Eduardo Rafael Ocampo Valladares', 'eocampov@rocasamexico.com', 2, 'GRUPO ROCASA PENINSULAR SA DE CV')");
  $noEmpleado = obtenerNoEmpleado($values['ATTUID'], $conn);
  $stmt1->bind_param("ssssss", $noEmpleado, $values['ATTUID'], $names['nombres'], $names['paterno'], $names['materno'], $values['nuevoPuesto']);
  if (!$stmt1->execute()) {
    responderError('Error al insertar en cambiosDePuesto.', $conn->error);
  }

  // Insertar en cambiosPerfilDetails
  $stmt2 = $conn->prepare("INSERT INTO cambiosPerfilDetails (ATTUID, Fecha, queSeHizo)
                          VALUES (?, ?, 'Se añadió el cambio de perfil')");
  $stmt2->bind_param("ss", $values['ATTUID'], $fechaActual);
  if (!$stmt2->execute()) {
    responderError('Error al insertar en cambiosPerfilDetails.', $conn->error);
  }

  // Actualizar PUESTO en tabla Plantilla
  $stmt3 = $conn->prepare("UPDATE Plantilla SET PUESTO = ? WHERE CURP = ?");
  $stmt3->bind_param("ss", $values['nuevoPuesto'], $values['CURP']);
  if (!$stmt3->execute()) {
    responderError('Error al actualizar puesto en Plantilla.', $conn->error);
  }

  // Enviar correo
  $destinatarios = 'msaldivarc@rocasamexico.com' /* 'eocampov@rocasamexico.com,rh@rocasamexico.com' */;
  $asunto = "Nuevo Cambio de perfil/puesto";
  $mensaje = "Se realizó un nuevo cambio de perfil/puesto desde el sistema de Movimientos para el colaborador <b>{$values['Nombre']}</b>.<br><br>";
  $mensaje .= "Favor de ver el cambio en Movimientos POC y solicitar el PRM correspondiente.";
  if ($values['temporalidadMovimiento'] === 'TEMPORAL') {
    $mensaje .= "<br><br>Vigente hasta la fecha: <b>{$values['fechaFin']}</b>";
  }
  enviarCorreo($destinatarios, $asunto, $mensaje);
}

// ✅ CAMBIO DE SUELDO
if (str_contains($values['Movimiento'], 'Cambio de sueldo')) {
  if (empty($values['nuevoSueldo']) || !is_numeric($values['nuevoSueldo'])) {
    responderError('Movimiento tipo "Cambio de sueldo" sin sueldo definido correctamente.');
  }

  $stmt1 = $conn->prepare("UPDATE Plantilla SET `SUELDO MENSUAL` = ? WHERE CURP = ?");
  $stmt1->bind_param("ds", $values['nuevoSueldo'], $values['CURP']);
  if (!$stmt1->execute()) {
    responderError('Error al actualizar el sueldo en Plantilla.', $conn->error);
  }

  $destinatarios = 'msaldivarc@rocasamexico.com'; /* 'rh@rocasamexico.com,contadores@rocasamexico.com' */
  $asunto = "Nuevo Cambio de sueldo";
  $mensaje = "Se realizó un cambio de sueldo desde el sistema de Movimientos para el colaborador <b>{$values['Nombre']}</b>.";

  if ($values['temporalidadMovimiento'] === 'TEMPORAL') {
    $mensaje .= "<br><br>Vigente hasta la fecha: <b>{$values['fechaFin']}</b>";
  }

  $mensaje .= "<br><br>Favor de ver el cambio reflejado en la Plantilla.";
  enviarCorreo($destinatarios, $asunto, $mensaje);

  // 1. Actualizar sueldo en la tabla Plantilla
  $stmt1 = $conn->prepare("UPDATE Plantilla SET `SUELDO MENSUAL` = ? WHERE CURP = ?");
  $stmt1->bind_param("ds", $values['nuevoSueldo'], $values['CURP']);
  if (!$stmt1->execute()) {
    responderError('Error al actualizar el sueldo en Plantilla.', $conn->error);
  }

  // 2. Enviar correo
  $destinatarios = 'msaldivarc@rocasamexico.com' /* 'rh@rocasamexico.com,contadores@rocasamexico.com' */;
  $asunto = "Nuevo Cambio de sueldo";
  $mensaje = "Se realizó un cambio de sueldo desde el sistema de Movimientos para el colaborador <b>{$values['Nombre']}</b>.";

  if ($values['temporalidadMovimiento'] === 'TEMPORAL') {
    $mensaje .= "<br><br>Vigente hasta la fecha: <b>{$values['fechaFin']}</b>";
  }

  $mensaje .= "<br><br>Favor de ver el cambio reflejado en la Plantilla.";
  enviarCorreo($destinatarios, $asunto, $mensaje);
}

echo json_encode(['success' => true]);

// ✅ CAMBIO DE TURNO (siempre viene con CAMBIO DE SUELDO)
if (str_contains($values['Movimiento'], 'Cambio de turno')) {
    $horasTexto = trim($values['horasMedTiemp'] ?? '');
    $horas = is_numeric($horasTexto) ? intval($horasTexto) : null;

    if (in_array($horas, [4, 5, 6])) {
        $horasMedTiemp = $horas;
        $modalidad = 'Medio tiempo';
    } else {
        $horasMedTiemp = null;
        $modalidad = 'Tiempo completo';
    }

    // Validar que venga el nuevo sueldo
    if (empty($values['nuevoSueldo'])) {
        responderError('Movimiento de cambio de turno requiere un nuevo sueldo, pero no fue especificado.');
    }

    // Actualizar Plantilla: sueldo, horas y modalidad
    $stmtTurno = $conn->prepare("UPDATE Plantilla SET `SUELDO MENSUAL` = ?, horasMedTiemp = ?, MODALIDAD = ? WHERE CURP = ?");
    $stmtTurno->bind_param("diss", $values['nuevoSueldo'], $horasMedTiemp, $modalidad, $values['CURP']);
    if (!$stmtTurno->execute()) {
        responderError('Error al actualizar sueldo y turno en Plantilla.', $conn->error);
    }

    // Envío de correo si deseas notificarlo
    $destinatarios = 'msaldivarc@rocasamexico.com';
    $asunto = "Cambio de turno y sueldo autorizado";
    $mensaje = "Se autorizó un <b>cambio de turno</b> para <b>{$values['Nombre']}</b>.<br>";
    $mensaje .= "Modalidad: <b>$modalidad</b>" . ($horasMedTiemp ? " ({$horasMedTiemp} horas)" : "") . ".<br>";
    $mensaje .= "Nuevo sueldo mensual: <b>$" . number_format($values['nuevoSueldo'], 2) . "</b><br>";
    $mensaje .= "Favor de reflejar el cambio en POC.";
    enviarCorreo($destinatarios, $asunto, $mensaje);
}


// ✅ BAJA
if (str_contains($values['Movimiento'], 'Baja')) {
  $fechaActual = date('Y-m-d');

  // Separar nombre completo
  $names = separaNombreCompleto($values['Nombre']);

  // Obtener datos necesarios de otras tablas
  $stmt = $conn->prepare("SELECT `RFC` FROM Plantilla WHERE CURP = ?");
  $stmt->bind_param("s", $values['CURP']);
  if (!$stmt->execute()) {
    responderError('Error al obtener RFC del colaborador.', $conn->error);
  }
  $res = $stmt->get_result();
  $row = $res->fetch_assoc();
  $rfc = $row['RFC'] ?? '';

  $noEmpleado = obtenerNoEmpleado($values['ATTUID'], $conn);

  // 1. Insertar en tabla Bajas
  $stmt1 = $conn->prepare("INSERT INTO Bajas (ATTUID, `LOGIN PVS`, `Numero de Empleado`, `Nombre (s)`, `Apellido Paterno`, `Apellido Materno`, Puesto, RFC, CURP, `Fecha de Alta`, `Fecha de Baja`, `Motivo de Baja`, Submotivo)
                          VALUES (?, 'NA', ?, ?, ?, ?, ?, ?, ?, ?, ?, 'Despido', '15-Falta de probidad y Honradez')");
  $stmt1->bind_param("ssssssssss",
    $values['ATTUID'],
    $noEmpleado,
    $names['nombres'],
    $names['paterno'],
    $names['materno'],
    $values['nuevoPuesto'],
    $rfc,
    $values['CURP'],
    $values['fechaIngreso'],
    $values['Fecha']
  );
  if (!$stmt1->execute()) {
    responderError('Error al insertar en tabla Bajas.', $conn->error);
  }

  // 2. Insertar en bajasDetails
  $stmt2 = $conn->prepare("INSERT INTO bajasDetails (ATTUID, Fecha, queSeHizo)
                          VALUES (?, ?, 'Se añadió la pre-baja')");
  $stmt2->bind_param("ss", $values['ATTUID'], $fechaActual);
  if (!$stmt2->execute()) {
    responderError('Error al insertar en bajasDetails.', $conn->error);
  }

  // 3. Actualizar plantilla: INACTIVO
  $stmt3 = $conn->prepare("UPDATE Plantilla SET Estatus = 'INACTIVO', posicionCode = NULL, `Fecha Baja` = ? WHERE CURP = ?");
  $stmt3->bind_param("ss", $values['Fecha'], $values['CURP']);
  if (!$stmt3->execute()) {
    responderError('Error al actualizar Plantilla en baja.', $conn->error);
  }

  // 4. Enviar correo a RH
  $destinatarios = 'msaldivarc@rocasamexico.com'/* 'recursoshumanos@rocasamexico.com' */;
  $asunto = "Pre-Baja en Intranet";
  $mensaje = "Se realizó la pre baja desde el sistema de Movimientos del siguiente usuario:<br><br>";
  $mensaje .= "<b>ATTUID:</b> {$values['ATTUID']}<br>";
  $mensaje .= "<b>Nombre:</b> {$values['Nombre']}<br><br>";
  $mensaje .= "Para ver el listado de bajas, favor de entrar al apartado correspondiente.<br>";
  $mensaje .= "Lo anterior, para la revisión y el envío al POC.";

  enviarCorreo($destinatarios, $asunto, $mensaje);
}

// ===================== FUNCIONES AUXILIARES ===================== */

function obtenerClavePDV($pdv, $conn) {
  $stmt = $conn->prepare("SELECT `Clave PDV` FROM Tiendas WHERE PDV = ?");
  $stmt->bind_param("s", $pdv);
  if (!$stmt->execute()) {
    responderError('Error al obtener clave PDV.', $conn->error);
  }
  $res = $stmt->get_result();
  $row = $res->fetch_assoc();
  return $row['Clave PDV'] ?? '';
}

function separaNombreCompleto($nombreCompleto) {
  $partes = array_values(array_filter(explode(' ', trim($nombreCompleto))));
  $resultado = ['paterno' => '', 'materno' => '', 'nombres' => ''];
  if (count($partes) < 3) {
    $resultado['nombres'] = implode(' ', $partes);
    return $resultado;
  }
  $resultado['paterno'] = $partes[0];
  $resultado['materno'] = $partes[1];
  $resultado['nombres'] = implode(' ', array_slice($partes, 2));
  return $resultado;
}

function obtenerNoEmpleado($attuid, $conn) {
  $stmt = $conn->prepare("SELECT `No Empleado` FROM users WHERE ATTUID = ?");
  $stmt->bind_param("s", $attuid);
  if (!$stmt->execute()) {
    responderError('Error al obtener número de empleado.', $conn->error);
  }
  $res = $stmt->get_result();
  $row = $res->fetch_assoc();
  return $row['No Empleado'] ?? '';
}



