#ifndef NAMESYS_H
    #define NAMESYS_H

    #define DefaultDepthLimit 32

    #include "ipfs/util/errs.h"

    typedef struct s_resolvers {
        char *protocol;
        int (*func)(char**, char*);
    } resolvers;

    // Resolver provides path resolution to IPFS
    // It has a pointer to a DAGService, which is uses to resolve nodes.
    // TODO: now that this is more modular, try to unify this code with the
    //       the resolvers in namesys
    typedef struct s_resolver {
        //DAGService DAG;
        //NodeLink *lnk;
        // resolveOnce looks up a name once (without recursion).
        int (*resolveOnce) (char **, char *);
    } resolver;

    //TODO ciPrivKey from c-libp2p-crypto
    typedef void* ciPrivKey;

    typedef struct s_publishers {
        char *protocol;
        int (*func) (ciPrivKey, char*);
        int (*func_eol) (ciPrivKey, char*, time_t);
    } publishers;

    typedef struct s_mpns {
        resolvers  *resolver;
        publishers *publisher;
    } mpns;

    typedef struct s_tlds {
        char *str;
        int  condition;
    } tlds;

    int ipfs_namesys_resolve(char **path, char *name);
    int ipfs_namesys_resolve_n(char **path, char *name, int depth);
    int ipfs_namesys_resolve_once (char **path, char *name);
    int ipfs_namesys_publish (char *proto, ciPrivKey name, char *value);
    int ipfs_namesys_publish_with_eol (char *proto, ciPrivKey name, char *value, time_t eol);

    int ipfs_proquint_is_proquint(char *str);
    char *ipfs_proquint_encode(char *buf, int size);
    char *ipfs_proquint_decode(char *str);
    int ipfs_proquint_resolve_once (char **p, char *name);

    int ipfs_isdomain_match_string (char *d);
    int ipfs_isdomain_is_icann_tld(char *s);
    int ipfs_isdomain_is_extended_tld (char *s);
    int ipfs_isdomain_is_tld (char *s);
    int ipfs_isdomain_is_domain (char *s);

    typedef struct s_DNSResolver {
        // TODO
        int (*lookupTXT) (char ***, char *);
    } DNSResolver;

    int ipfs_dns_resolver_resolve_once (char **path, char *name);
    int ipfs_dns_work_domain (int output, DNSResolver *r, char *name);
    int ipfs_dns_parse_entry (char **path, char *txt);
    int ipfs_dns_try_parse_dns_link(char **path, char *txt);
#endif //NAMESYS_H