/* SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later */

#include <assert.h>
#include <err.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/poll.h>
#include <sys/socket.h>

#include "libmctp.h"
#include "libmctp-astlpc.h"

static const mctp_eid_t local_eid = 8;
static const mctp_eid_t remote_eid = 9;

static const uint8_t echo_req = 1;
static const uint8_t echo_resp = 2;

struct ctx {
	struct mctp *mctp;
};

static void tx_message(struct ctx *ctx, mctp_eid_t eid, void *msg, size_t len)
{
	uint8_t type;

	type = len > 0 ? *(uint8_t *)(msg) : 0x00;

	fprintf(stderr, "TX: dest EID 0x%02x: %zd bytes, first byte [0x%02x]\n",
		eid, len, type);
	mctp_message_tx(ctx->mctp, eid, 0, MCTP_MESSAGE_TO_SRC, msg, len);
}

static void rx_message(uint8_t eid, uint8_t msg_tag, bool tag_owner, void *data,
		       void *msg, size_t len)
{
	struct ctx *ctx = data;
	uint8_t type;

	type = len > 0 ? *(uint8_t *)(msg) : 0x00;

	fprintf(stderr, "RX: src EID 0x%02x: %zd bytes, first byte [0x%02x]\n",
		eid, len, type);

	if (type == echo_req) {
		*(uint8_t *)(msg) = echo_resp;
		tx_message(ctx, eid, msg, len);
	}
}

int main(void)
{
	struct mctp_binding_astlpc *astlpc;
	struct mctp *mctp;
	struct ctx *ctx, _ctx;
	int rc;

	mctp = mctp_init();
	assert(mctp);

	astlpc = mctp_astlpc_init_fileio();
	assert(astlpc);

	mctp_astlpc_register_bus(astlpc, mctp, local_eid);

	ctx = &_ctx;
	ctx->mctp = mctp;

	mctp_set_rx_all(mctp, rx_message, ctx);

	for (;;) {
#if 0

		struct pollfd pollfds[2];

		pollfds[0].fd = STDIN_FILENO;
		pollfds[0].events = POLLIN;

		mctp_astlpc_init_pollfd(astlpc, &pollfds[1]);

		rc = poll(pollfds, 2, -1);
		if (rc < 0)
			err(EXIT_FAILURE, "poll");

		if (pollfds[0].revents) {
			uint8_t buf[1024];
			rc = read(STDIN_FILENO, buf, sizeof(buf));
			if (rc == 0)
				break;
			if (rc < 0)
				err(EXIT_FAILURE, "read");
			tx_message(ctx, remote_eid, buf, rc);
		}

		if (pollfds[1].revents) {
			rc = mctp_astlpc_poll(astlpc);
			if (rc)
				break;
		}
#else
		(void)remote_eid;
		rc = mctp_astlpc_poll(astlpc);
		if (rc)
			break;

#endif
	}

	return EXIT_SUCCESS;
}
