/* Reflow Oven Controller
 *
 * Copyright (C) 2020  Mario Hüttel <mario.huettel@gmx.net>
 *
 * This file is part of the Reflow Oven Controller Project.
 *
 * The reflow oven controller is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 *
 * The Reflow Oven Control Firmware 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 General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with the reflow oven controller project.
 * If not, see <http://www.gnu.org/licenses/>.
 */

/**
 * @file config-parser.h
 * @brief Header file for the key-value pair config parser
 * @addtogroup config-parser
 * @{
 */

#ifndef _CONFIG_PARSER_H_
#define _CONFIG_PARSER_H_

#include <stdint.h>
#include <stddef.h>
#include <stdbool.h>
#include <fatfs/ff.h>

struct config_parser {
	uint32_t magic;
	bool write;
	FIL file;
	char *buffer;
	size_t buff_size;
};

typedef void * config_parser_handle_t;

enum config_parser_value_type {
	CONFIG_PARSER_TYPE_UINT = 0,
	CONFIG_PARSER_TYPE_INT,
	CONFIG_PARSER_TYPE_FLOAT,
};

enum config_parser_ret {
	CONFIG_PARSER_OK = 0,
	CONFIG_PARSER_PARAM_ERR,
	CONFIG_PARSER_GENERIC_ERR,
	CONFIG_PARSER_IOERR,
	CONFIG_PARSER_LINE_COMMENT,
	CONFIG_PARSER_LINE_TOO_LONG,
	CONFIG_PARSER_LINE_MALFORM,
	CONFIG_PARSER_END_REACHED,
	CONFIG_PARSER_WRONG_MODE,
};

struct config_parser_entry {
	const char *name;
	enum config_parser_value_type type;
	union {
		uint32_t uint_val;
		int32_t int_val;
		float float_val;
	} value;
};

config_parser_handle_t config_parser_open_file(struct config_parser *config_parser, bool write, const char *file_name,
					       char *working_buffer, size_t buff_size);

/**
 * @brief Parse the current line in the config file.
 * @param handle Config parser handle
 * @param[out] entry Entry read from config file.
 * @warning \p entry is only valid as long as no other function was called on the same \p handle. If necessary, the values
 * have to be copied
 * @return Config parser error
 */
enum config_parser_ret config_parser_get_line(config_parser_handle_t handle, struct config_parser_entry *entry, bool force_float);

enum config_parser_ret config_parser_reset_to_start(config_parser_handle_t handle);

enum config_parser_ret config_parser_write_entry(config_parser_handle_t handle, const struct config_parser_entry *entry);

enum config_parser_ret config_parser_close_file(config_parser_handle_t handle);

bool config_parser_ret_is_abort_condition(enum config_parser_ret return_val);

#endif /* _CONFIG_PARSER_H_ */

/** @} */
