/*
 * Copyright (c) 2020 Linumiz
 *
 * SPDX-License-Identifier: Apache-2.0
 */

/** @file
 *
 * @brief This file contains structures representing JSON messages
 * exchanged with a hawkbit
 */

#ifndef __HAWKBIT_PRIV_H__
#define __HAWKBIT_PRIV_H__

#include <zephyr/data/json.h>

#define HAWKBIT_SLEEP_LENGTH 8

enum hawkbit_http_request {
	HAWKBIT_PROBE,
	HAWKBIT_CONFIG_DEVICE,
	HAWKBIT_CLOSE,
	HAWKBIT_PROBE_DEPLOYMENT_BASE,
	HAWKBIT_REPORT,
	HAWKBIT_DOWNLOAD,
};

enum hawkbit_status_fini {
	HAWKBIT_STATUS_FINISHED_SUCCESS,
	HAWKBIT_STATUS_FINISHED_FAILURE,
	HAWKBIT_STATUS_FINISHED_NONE,
};

enum hawkbit_status_exec {
	HAWKBIT_STATUS_EXEC_CLOSED = 0,
	HAWKBIT_STATUS_EXEC_PROCEEDING,
	HAWKBIT_STATUS_EXEC_CANCELED,
	HAWKBIT_STATUS_EXEC_SCHEDULED,
	HAWKBIT_STATUS_EXEC_REJECTED,
	HAWKBIT_STATUS_EXEC_RESUMED,
	HAWKBIT_STATUS_EXEC_NONE,
};

enum hawkbit_dev_acid_t {
	HAWKBIT_ACTION_ID_CURRENT = 0,
	HAWKBIT_ACTION_ID_UPDATE,
};

struct hawkbit_href {
	const char *href;
};

struct hawkbit_status_result {
	const char *finished;
};

struct hawkbit_status {
	struct hawkbit_status_result result;
	const char *execution;
};

struct hawkbit_ctl_res_sleep {
	const char *sleep;
};

struct hawkbit_ctl_res_polling {
	struct hawkbit_ctl_res_sleep polling;
};

struct hawkbit_ctl_res_links {
	struct hawkbit_href deploymentBase;
	struct hawkbit_href configData;
	struct hawkbit_href cancelAction;
};

struct hawkbit_ctl_res {
	struct hawkbit_ctl_res_polling config;
	struct hawkbit_ctl_res_links _links;
};

struct hawkbit_cfg_data {
	const char *VIN;
	const char *hwRevision;
};

struct hawkbit_cfg {
	const char *mode;
	struct hawkbit_cfg_data data;
	const char *id;
	const char *time;
	struct hawkbit_status status;
};

struct hawkbit_close {
	char *id;
	const char *time;
	struct hawkbit_status status;
};

/* Maximum number of chunks we support */
#define HAWKBIT_DEP_MAX_CHUNKS 1
/* Maximum number of artifacts per chunk. */
#define HAWKBIT_DEP_MAX_CHUNK_ARTS 1

struct hawkbit_dep_res_hashes {
	const char *sha1;
	const char *md5;
	const char *sha256;
};

struct hawkbit_dep_res_links {
	struct hawkbit_href download_http;
	struct hawkbit_href md5sum_http;
};

struct hawkbit_dep_res_arts {
	const char *filename;
	struct hawkbit_dep_res_hashes hashes;
	struct hawkbit_dep_res_links _links;
	int size;
};

struct hawkbit_dep_res_chunk {
	const char *part;
	const char *name;
	const char *version;
	struct hawkbit_dep_res_arts artifacts[HAWKBIT_DEP_MAX_CHUNK_ARTS];
	size_t num_artifacts;
};

struct hawkbit_dep_res_deploy {
	const char *download;
	const char *update;
	struct hawkbit_dep_res_chunk chunks[HAWKBIT_DEP_MAX_CHUNKS];
	size_t num_chunks;
};

struct hawkbit_dep_res {
	const char *id;
	struct hawkbit_dep_res_deploy deployment;
};

struct hawkbit_dep_fbk {
	const char *id;
	struct hawkbit_status status;
};

struct hawkbit_cancel {
	struct hawkbit_href cancelBase;
};

struct entry {
	char *http_req_str;
	int n;
};

struct entry http_request[] = {
	{"HAWKBIT_PROBE", 0},
	{"HAWKBIT_CONFIG_DEVICE", 1},
	{"HAWKBIT_CLOSE", 2},
	{"HAWKBIT_PROBE_DEPLOYMENT_BASE", 3},
	{"HAWKBIT_REPORT", 4},
	{"HAWKBIT_DOWNLOAD", 5},
};

#endif /* __HAWKBIT_PRIV_H__ */
