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

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

#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;
};

struct hawkbit_cfg {
	const char *mode;
	struct hawkbit_cfg_data data;
};

struct hawkbit_close {
	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 {
	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__ */
