#include "lamp_ticket_dispatch.h"

#include "ai_wire.h"

#include <string.h>

lamp_ticket_dispatch_status lamp_ticket_dispatch_issue(
    lg_guard *guard, uint32_t now_ms, lamp_ticket_send_fn send_packet,
    void *send_context)
{
    lg_frame guard_ticket;
    aiw_ticket wire_ticket;
    uint8_t packet[AIW_HEADER_BYTES + AIW_TICKET_PAYLOAD_BYTES + AIW_CRC_BYTES];
    size_t packet_length = 0u;

    if (guard == NULL || send_packet == NULL) {
        return LAMP_TICKET_DISPATCH_INVALID_ARGUMENT;
    }
    if (!lg_issue_ticket(guard, now_ms, &guard_ticket)) {
        return LAMP_TICKET_DISPATCH_NOT_READY;
    }

    memset(&wire_ticket, 0, sizeof(wire_ticket));
    wire_ticket.session_id = guard_ticket.session_id;
    wire_ticket.ticket_id = guard_ticket.ticket_id;
    wire_ticket.calibration_id = guard_ticket.calibration_id;
    wire_ticket.channels = guard_ticket.channels;
    wire_ticket.min_source_frame_seq = guard_ticket.min_source_frame_seq;
    if (!aiw_encode_ticket(&wire_ticket, packet, sizeof(packet), &packet_length) ||
        packet_length == 0u || !send_packet(send_context, packet, packet_length)) {
        lg_stop(guard);
        return LAMP_TICKET_DISPATCH_SEND_FAILED;
    }
    return LAMP_TICKET_DISPATCH_QUEUED;
}
