/********************************************************************************
 * Copyright (c) 2025-2026 ZF Friedrichshafen AG
 *
 * This program and the accompanying materials are made available under the 
 * terms of the Apache License Version 2.0 which is available at
 * https://www.apache.org/licenses/LICENSE-2.0
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 * Contributors:
 *   Erik Verhoeven - initial API and implementation
 ********************************************************************************/

#ifndef LIST_ELEMENTS_H
#define LIST_ELEMENTS_H

#include "context.h"
#include <support/sequence.h>
#include <support/string.h>
#include <support/interface_ptr.h>

/**
 * @brief Help for listing elements.
 * @param[in] rsContext Reference to the context.
 */
void ListHelp(const SContext& rsContext);

/**
 * @brief List elements in a table. Base function. The elements to list are to be parsed from the arguments. The context could
 * indicate additional flags.
 * @param[in] rsContext Reference to the context.
 * @param[in] rstream The output stream to use for printing (table only).
 * @return The application exit code. 0 is no error.
 */
int ListElements(const SContext& rsContext, std::ostream& rstream = std::cout);

/**
 * @brief List the loaded server modules.
 * @param[in] rsContext Reference to the context.
 * @param[in] rptrRepository Reference to the saerver repository.
 * @param[in] rstream The output stream to use for printing (table only).
 * @return The application exit code. 0 is no error.
 */
int ListModules(const SContext& rsContext, const sdv::TObjectPtr& rptrRepository, std::ostream& rstream);

/**
 * @brief List the available component classes.
 * @param[in] rsContext Reference to the context.
 * @param[in] rptrRepository Reference to the saerver repository.
 * @param[in] rstream The output stream to use for printing (table only).
 * @return The application exit code. 0 is no error.
 */
int ListClasses(const SContext& rsContext, const sdv::TObjectPtr& rptrRepository, std::ostream& rstream);

/**
 * @brief List the instantiated server components.
 * @param[in] rsContext Reference to the context.
 * @param[in] rptrRepository Reference to the saerver repository.
 * @param[in] rstream The output stream to use for printing (table only).
 * @return The application exit code. 0 is no error.
 */
int ListComponents(const SContext& rsContext, const sdv::TObjectPtr& rptrRepository, std::ostream& rstream);

/**
* @brief List the installations.
* @param[in] rsContext Reference to the context.
* @param[in] rptrRepository Reference to the saerver repository.
* @param[in] rstream The output stream to use for printing (table only).
* @return The application exit code. 0 is no error.
*/
int ListInstallations(const SContext& rsContext, const sdv::TObjectPtr& rptrRepository, std::ostream& rstream);

/**
 * @brief List the current configured listeners.
 * @param[in] rsContext Reference to the context.
 * @param[in] rstream The output stream to use for printing (table only).
 * @return The application exit code. 0 is no error.
 */
int ListListeners(const SContext& rsContext, std::ostream& rstream);

/**
 * @brief List the current connections.
 * @param[in] rsContext Reference to the context.
 * @param[in] rstream The output stream to use for printing (table only).
 * @return The application exit code. 0 is no error.
 */
int ListConnections(const SContext& rsContext, std::ostream& rstream);

#endif // !defined LIST_ELEMENTS_H