db = Database::getInstance(); } /** * Obtiene un menú por su ID * @param int $menuId * @return array|null */ public function getMenu(int $menuId): ?array { $stmt = $this->db->prepare(" SELECT * FROM menus WHERE id = ? AND status = 'active' LIMIT 1 "); $stmt->execute([$menuId]); $menu = $stmt->fetch(PDO::FETCH_ASSOC); if (!$menu) { return null; } // Obtener opciones del menú $menu['options'] = $this->getMenuOptions($menuId); return $menu; } /** * Obtiene un menú por su clave * @param string $menuKey * @return array|null */ public function getMenuByKey(string $menuKey): ?array { $stmt = $this->db->prepare(" SELECT * FROM menus WHERE menu_key = ? AND status = 'active' LIMIT 1 "); $stmt->execute([$menuKey]); $menu = $stmt->fetch(PDO::FETCH_ASSOC); if (!$menu) { return null; } $menu['options'] = $this->getMenuOptions($menu['id']); return $menu; } /** * Obtiene las opciones de un menú * @param int $menuId * @return array */ public function getMenuOptions(int $menuId): array { $stmt = $this->db->prepare(" SELECT * FROM menu_options WHERE menu_id = ? AND is_active = 1 ORDER BY option_order ASC "); $stmt->execute([$menuId]); return $stmt->fetchAll(PDO::FETCH_ASSOC); } /** * Obtiene el ID del menú principal * @return int|null */ public function getMainMenuId(): ?int { $stmt = $this->db->prepare(" SELECT id FROM menus WHERE menu_key = 'lab_menu_principal' AND status = 'active' LIMIT 1 "); $stmt->execute(); $result = $stmt->fetch(PDO::FETCH_ASSOC); return $result ? (int)$result['id'] : null; } /** * Procesa una opción seleccionada del menú * @param int $menuId * @param string $optionKey * @return array|null */ public function processMenuOption(int $menuId, string $optionKey): ?array { $stmt = $this->db->prepare(" SELECT * FROM menu_options WHERE menu_id = ? AND option_key = ? AND is_active = 1 LIMIT 1 "); $stmt->execute([$menuId, $optionKey]); $option = $stmt->fetch(PDO::FETCH_ASSOC); if (!$option) { return null; } return [ 'type' => $option['response_type'], 'text' => $option['response_text'], 'next_menu_id' => $option['next_menu_id'] ]; } /** * Formatea un menú con su welcome_message y opciones * @param int $menuId * @return string */ public function formatMenuMessage(int $menuId): string { $menu = $this->getMenu($menuId); if (!$menu) { return "❌ Menú no disponible."; } $message = $menu['welcome_message']; // Si el welcome_message no incluye las opciones, agregarlas if (!empty($menu['options']) && strpos($message, '1️⃣') === false) { $message .= "\n\n"; foreach ($menu['options'] as $option) { $emoji = $this->getNumberEmoji($option['option_key']); $message .= "$emoji {$option['option_text']}\n"; } } return $message; } /** * Obtiene el emoji de número para una opción * @param string $number * @return string */ private function getNumberEmoji(string $number): string { $emojis = [ '0' => '0️⃣', '1' => '1️⃣', '2' => '2️⃣', '3' => '3️⃣', '4' => '4️⃣', '5' => '5️⃣', '6' => '6️⃣', '7' => '7️⃣', '8' => '8️⃣', '9' => '9️⃣' ]; return $emojis[$number] ?? $number; } /** * Obtiene todos los menús activos * @return array */ public function getAllMenus(): array { $stmt = $this->db->prepare(" SELECT m.*, (SELECT COUNT(*) FROM menu_options WHERE menu_id = m.id AND is_active = 1) as options_count FROM menus m WHERE m.status = 'active' ORDER BY m.created_at ASC "); $stmt->execute(); return $stmt->fetchAll(PDO::FETCH_ASSOC); } /** * Obtiene el menú padre de un menú * @param int $menuId * @return array|null */ public function getParentMenu(int $menuId): ?array { $stmt = $this->db->prepare(" SELECT parent_menu_id FROM menus WHERE id = ? LIMIT 1 "); $stmt->execute([$menuId]); $result = $stmt->fetch(PDO::FETCH_ASSOC); if (!$result || !$result['parent_menu_id']) { return null; } return $this->getMenu($result['parent_menu_id']); } }