/*********************************************************************
 *
 * Software License Agreement (BSD License)
 *
 * Tham số vận hành của mission layer.
 *
 * Author: DuongTD
 *********************************************************************/
#ifndef MISSION_ADAPTERS_MISSION_CONFIG_H_
#define MISSION_ADAPTERS_MISSION_CONFIG_H_

#include <string>

#include <robot/node_handle.h>

namespace mission_adapters
{
    /**
     * @struct MissionConfig
     * @brief Tham số vận hành, nạp từ `mission_adapters_params.yaml`.
     *
     * Bản runtime của file nằm ở `pnkx_nav_core/config/`; bản trong `test/config/` chỉ dùng cho test
     * và phải chạy kèm PNKX_NAV_CORE_CONFIG_DIR trỏ vào đó.
     */
    struct MissionConfig
    {
        /**
         * Trần thời gian cho MỘT chặng (nav + action), tính từ lúc chặng được giao. [s]
         *
         * 0 = tắt. Quá hạn thì chặng bị đánh dấu thất bại và navigation được bảo dừng — lưới cuối
         * cho trường hợp navigation không bao giờ báo kết quả về.
         */
        double mission_timeout = 0.0;

        /**
         * Một chặng thất bại thì xử lý phần còn lại của hàng đợi thế nào.
         *
         * `true` (mặc định) = xoá sạch hàng đợi. Đây là hành vi an toàn cho tuyến đường tuần tự
         * kiểu VDA5050: chặng 2 hỏng nghĩa là robot không tới được node 2, nên chạy tiếp chặng 3 là
         * cắt ngang qua đoạn đường mà fleet manager chưa cho phép đi.
         *
         * `false` = chỉ bỏ chặng lỗi rồi chạy tiếp chặng sau. Chỉ đặt false khi các mission trong
         * hàng đợi ĐỘC LẬP với nhau (nhiều goal rời rạc), không phải các chặng của cùng một tuyến.
         */
        bool clear_queue_on_failure = true;

        /**
         * @brief Nạp tham số từ namespace @p ns.
         * @return false nếu giá trị nạp được không qua @ref validate.
         *
         * Thiếu khoá không phải lỗi: giá trị mặc định trong struct này là hợp lệ và an toàn.
         */
        bool loadFromParams(robot::NodeHandle& nh, const std::string& ns = "mission_adapters");

        /// @brief Kiểm miền giá trị. Trả false kèm log nêu đích danh tham số sai.
        bool validate() const;

        /// @brief In cấu hình đang dùng — để log khởi động nói được vì sao robot hành xử như vậy.
        void print() const;
    };

} // namespace mission_adapters

#endif  // MISSION_ADAPTERS_MISSION_CONFIG_H_
