#pragma once

#include "MissionItemProtocol.h"

class MissionItemProtocol_Rally : public MissionItemProtocol {
public:
    MissionItemProtocol_Rally(class AP_Rally &_rally) :
        rally(_rally) {}
    void truncate(const mavlink_mission_count_t &packet) override;
    MAV_MISSION_TYPE mission_type() const override { return MAV_MISSION_TYPE_RALLY; }

    MAV_MISSION_RESULT complete(const GCS_MAVLINK &_link) override;
    void timeout() override;

    /*
      static function to get rally item as mavlink_mission_item_int_t
    */
    static bool get_item_as_mission_item(uint16_t seq, mavlink_mission_item_int_t &ret_packet);
    
protected:

    ap_message next_item_ap_message_id() const override {
        return MSG_NEXT_MISSION_REQUEST_RALLY;
    }
    bool clear_all_items() override WARN_IF_UNUSED;

private:
    AP_Rally &rally;

    uint16_t item_count() const override;
    uint16_t max_items() const override;

    MAV_MISSION_RESULT replace_item(const mavlink_mission_item_int_t&) override WARN_IF_UNUSED;
    MAV_MISSION_RESULT append_item(const mavlink_mission_item_int_t&) override WARN_IF_UNUSED;

    MAV_MISSION_RESULT get_item(const GCS_MAVLINK &_link,
                                const mavlink_message_t &msg,
                                const mavlink_mission_request_int_t &packet,
                                mavlink_mission_item_int_t &ret_packet) override WARN_IF_UNUSED;

    static MAV_MISSION_RESULT convert_MISSION_ITEM_INT_to_RallyLocation(const mavlink_mission_item_int_t &cmd, class RallyLocation &ret) WARN_IF_UNUSED;

};