/*
 *
 *  Wireless daemon for Linux
 *
 *  Copyright (C) 2017-2019  Intel Corporation. All rights reserved.
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License as published by the Free Software Foundation; either
 *  version 2.1 of the License, or (at your option) any later version.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 *
 */

#define COMMAND_OPTION_USERNAME		"username"
#define COMMAND_OPTION_PASSWORD		"password"
#define COMMAND_OPTION_PASSPHRASE	"passphrase"
#define COMMAND_OPTION_DONTASK		"dont-ask"

typedef char *(*command_completion_func_t) (const char *text, int state);

enum cmd_status {
	CMD_STATUS_TRIGGERED,
	CMD_STATUS_DONE,
	CMD_STATUS_INVALID_ARGS,
	CMD_STATUS_INVALID_VALUE,
	CMD_STATUS_UNSUPPORTED,
	CMD_STATUS_FAILED,
};

struct command {
	const char *entity;
	const char *cmd;
	const char *arg;
	enum cmd_status (*function)(const char *entity,
						char **argv, int argc);
	const char *desc;
	const bool refreshable;
	command_completion_func_t completion;
};

struct command_family {
	const char *caption;
	const char *name;
	const struct command *command_list;
	command_completion_func_t family_arg_completion;
	command_completion_func_t entity_arg_completion;
	void (*set_default_entity)(const char *entity);
	void (*reset_default_entity)(void);
};

bool command_option_get(const char *name, const char **value_out);
bool command_needs_no_agent(void);

bool command_line_find_token(const char *token, uint8_t num_to_inspect);
char **command_completion(const char *text, int start, int end);
char *command_entity_arg_completion(const char *text, int state,
					const struct command *command_list);

void command_process_prompt(char **argv, int argc);

void command_noninteractive_trigger(void);
bool command_is_interactive_mode(void);
int command_get_exit_status(void);
void command_set_exit_status(int status);
void command_reset_default_entities(void);

void command_family_register(const struct command_family *family);
void command_family_unregister(const struct command_family *family);

struct command_family_desc {
	const char *name;
	int (*init)(void);
	void (*exit)(void);
} __attribute__((aligned(8)));

#define COMMAND_FAMILY(name, init, exit)				\
	static struct command_family_desc __command_family_ ## name	\
		__attribute__((used, section("__command"), aligned(8))) = {\
			#name, init, exit				\
		};							\

bool command_init(char **argv, int argc);
void command_exit(void);
