/** @file
 * @brief DNS cache
 *
 * An cache holding dns records for faster dns resolving.
 */

/*
 * Copyright (c) 2024 Endress+Hauser AG
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#ifndef ZEPHYR_INCLUDE_NET_DNS_CACHE_H_
#define ZEPHYR_INCLUDE_NET_DNS_CACHE_H_

#include <stdint.h>
#include <zephyr/net/dns_resolve.h>
#include <zephyr/kernel.h>
#include <zephyr/sys_clock.h>

struct dns_cache_entry {
	char query[CONFIG_DNS_RESOLVER_MAX_QUERY_LEN];
	struct dns_addrinfo data;
	k_timepoint_t expiry;
	bool in_use;
};

struct dns_cache {
	size_t size;
	struct dns_cache_entry *entries;
	struct k_mutex *lock;
};

/**
 * @brief Statically define and initialize a DNS queue.
 *
 * The cache can be accessed outside the module where it is defined using:
 *
 * @code extern struct dns_cache <name>; @endcode
 *
 * @param name Name of the cache.
 */
#define DNS_CACHE_DEFINE(name, cache_size)                                                         \
	static K_MUTEX_DEFINE(name##_mutex);                                                       \
	static struct dns_cache_entry name##_entries[cache_size];                                  \
	static struct dns_cache name = {                                                           \
		.entries = name##_entries, .size = cache_size, .lock = &name##_mutex};

/**
 * @brief Flushes the dns cache removing all its entries.
 *
 * @param cache Cache to be flushed
 * @retval 0 on success
 * @retval On error, a negative value is returned.
 */
int dns_cache_flush(struct dns_cache *cache);

/**
 * @brief Adds a new entry to the dns cache removing the one closest to expiry
 * if no free space is available.
 *
 * @param cache Cache where the entry should be added.
 * @param query Query which should be persisted in the cache.
 * @param addrinfo Addrinfo resulting from the query which will be returned
 * upon cache hit.
 * @param ttl Time to live for the entry in seconds. This usually represents
 * the TTL of the RR.
 * @retval 0 on success
 * @retval On error, a negative value is returned.
 */
int dns_cache_add(struct dns_cache *cache, char const *query, struct dns_addrinfo const *addrinfo,
		  uint32_t ttl);

/**
 * @brief Removes all entries with the given query
 *
 * @param cache Cache where the entries should be removed.
 * @param query Query which should be searched for.
 * @retval 0 on success
 * @retval On error, a negative value is returned.
 */
int dns_cache_remove(struct dns_cache *cache, char const *query);

/**
 * @brief Tries to find the specified query entry within the cache.
 *
 * @param cache Cache where the entry should be searched.
 * @param query Query which should be searched for.
 * @param addrinfo dns_addrinfo array which will be written if the query was found.
 * @param addrinfo_array_len Array size of the dns_addrinfo array
 * @retval on success the amount of dns_addrinfo written into the addrinfo array will be returned.
 * A cache miss will therefore return a 0.
 * @retval On error a negative value is returned.
 * -ENOSR means there was not enough space in the addrinfo array to accommodate all cache hits the
 * array will however be filled with valid data.
 */
int dns_cache_find(struct dns_cache const *cache, const char *query, struct dns_addrinfo *addrinfo,
		   size_t addrinfo_array_len);

#endif /* ZEPHYR_INCLUDE_NET_DNS_CACHE_H_ */
