/* SPDX-License-Identifier: LGPL-2.1-or-later */
#pragma once

typedef struct DnsQuestion DnsQuestion;
typedef struct DnsQuestionItem DnsQuestionItem;

#include "macro.h"
#include "resolved-dns-rr.h"

/* A simple array of resource keys */

typedef enum DnsQuestionFlags {
        DNS_QUESTION_WANTS_UNICAST_REPLY = 1 << 0, /* For mDNS: sender is willing to accept unicast replies */
} DnsQuestionFlags;

struct DnsQuestionItem {
        DnsResourceKey *key;
        DnsQuestionFlags flags;
};

struct DnsQuestion {
        unsigned n_ref;
        size_t n_keys, n_allocated;
        DnsQuestionItem items[0];
};

DnsQuestion *dns_question_new(size_t n);
DnsQuestion *dns_question_ref(DnsQuestion *q);
DnsQuestion *dns_question_unref(DnsQuestion *q);

int dns_question_new_address(DnsQuestion **ret, int family, const char *name, bool convert_idna);
int dns_question_new_reverse(DnsQuestion **ret, int family, const union in_addr_union *a);
int dns_question_new_service(DnsQuestion **ret, const char *service, const char *type, const char *domain, bool with_txt, bool convert_idna);

int dns_question_add_raw(DnsQuestion *q, DnsResourceKey *key, DnsQuestionFlags flags);
int dns_question_add(DnsQuestion *q, DnsResourceKey *key, DnsQuestionFlags flags);

int dns_question_matches_rr(DnsQuestion *q, DnsResourceRecord *rr, const char *search_domain);
int dns_question_matches_cname_or_dname(DnsQuestion *q, DnsResourceRecord *rr, const char* search_domain);
int dns_question_is_valid_for_query(DnsQuestion *q);
int dns_question_contains_key(DnsQuestion *q, const DnsResourceKey *k);
int dns_question_is_equal(DnsQuestion *a, DnsQuestion *b);

int dns_question_cname_redirect(DnsQuestion *q, const DnsResourceRecord *cname, DnsQuestion **ret);

void dns_question_dump(DnsQuestion *q, FILE *f);

const char *dns_question_first_name(DnsQuestion *q);

static inline DnsResourceKey *dns_question_first_key(DnsQuestion *q) {
        return (q && q->n_keys > 0) ? q->items[0].key : NULL;
}

static inline size_t dns_question_size(DnsQuestion *q) {
        return q ? q->n_keys : 0;
}

static inline bool dns_question_isempty(DnsQuestion *q) {
        return dns_question_size(q) <= 0;
}

DEFINE_TRIVIAL_CLEANUP_FUNC(DnsQuestion*, dns_question_unref);

#define _DNS_QUESTION_FOREACH(u, k, q)                                     \
        for (size_t UNIQ_T(i, u) = ({                                      \
                                (k) = ((q) && (q)->n_keys > 0) ? (q)->items[0].key : NULL; \
                                0;                                         \
                        });                                                \
             (q) && (UNIQ_T(i, u) < (q)->n_keys);                          \
             UNIQ_T(i, u)++, (k) = (UNIQ_T(i, u) < (q)->n_keys ? (q)->items[UNIQ_T(i, u)].key : NULL))

#define DNS_QUESTION_FOREACH(key, q) _DNS_QUESTION_FOREACH(UNIQ, key, q)

#define _DNS_QUESTION_FOREACH_ITEM(u, item, q)                             \
        for (size_t UNIQ_T(i, u) = ({                                      \
                     (item) = dns_question_isempty(q) ? NULL : (q)->items; \
                     0;                                                    \
             });                                                           \
             UNIQ_T(i, u) < dns_question_size(q);                          \
             UNIQ_T(i, u)++, (item) = (UNIQ_T(i, u) < dns_question_size(q) ? (q)->items + UNIQ_T(i, u) : NULL))

#define DNS_QUESTION_FOREACH_ITEM(item, q) _DNS_QUESTION_FOREACH_ITEM(UNIQ, item, q)
