#include <errno.h>
#include <string.h>

#include <netlink/genl/genl.h>
#include <netlink/msg.h>
#include <netlink/attr.h>

#include "nl80211.h"
#include "iw.h"

static int set_power_save(struct nl80211_state *state,
			  struct nl_cb *cb,
			  struct nl_msg *msg,
			  int argc, char **argv)
{
	enum nl80211_ps_state ps_state;

	if (argc != 1) {
		printf("Invalid parameters!\n");
		return 2;
	}

	if (strcmp(argv[0], "on") == 0)
		ps_state = NL80211_PS_ENABLED;
	else if (strcmp(argv[0], "off") == 0)
		ps_state = NL80211_PS_DISABLED;
	else {
		printf("Invalid parameter: %s\n", argv[0]);
		return 2;
	}

	NLA_PUT_U32(msg, NL80211_ATTR_PS_STATE, ps_state);

	return 0;

 nla_put_failure:
	return -ENOBUFS;
}

COMMAND(set, power_save, "<on|off>",
	NL80211_CMD_SET_POWER_SAVE, 0, CIB_NETDEV, set_power_save,
	"Set power save state to on or off.");

static int print_power_save_handler(struct nl_msg *msg, void *arg)
{
	struct nlattr *attrs[NL80211_ATTR_MAX + 1];
	struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg));
	const char *s;

	nla_parse(attrs, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0),
		  genlmsg_attrlen(gnlh, 0), NULL);

	if (!attrs[NL80211_ATTR_PS_STATE])
		return NL_SKIP;

	switch (nla_get_u32(attrs[NL80211_ATTR_PS_STATE])) {
	case NL80211_PS_ENABLED:
		s = "on";
		break;
	case NL80211_PS_DISABLED:
	default:
		s = "off";
		break;
	}

	printf("Power save: %s\n", s);

	return NL_SKIP;
}

static int get_power_save(struct nl80211_state *state,
				   struct nl_cb *cb,
				   struct nl_msg *msg,
				   int argc, char **argv)
{
	nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM,
		  print_power_save_handler, NULL);
	return 0;
}

COMMAND(get, power_save, "<param>",
	NL80211_CMD_GET_POWER_SAVE, 0, CIB_NETDEV, get_power_save,
	"Retrieve power save state.");
