/*
 * Copyright (C) 2021-2026 Alexander Borisov
 *
 * Author: Alexander Borisov <borisov@lexbor.com>
 */

#ifndef LXB_CSS_AT_RULE_H
#define LXB_CSS_AT_RULE_H

#ifdef __cplusplus
extern "C" {
#endif

#include "lexbor/css/base.h"
#include "lexbor/css/syntax/syntax.h"
#include "lexbor/css/at_rule/const.h"


typedef struct {
    lxb_css_at_rule_type_t type;
    lexbor_str_t           prelude;
    lxb_css_rule_list_t    *block;
}
lxb_css_at_rule__undef_t;

typedef struct {
    lexbor_str_t        name;
    lexbor_str_t        prelude;
    lxb_css_rule_list_t *block;
}
lxb_css_at_rule__custom_t;

typedef struct {
    lxb_css_rule_list_t *block;
}
lxb_css_at_rule_media_t;

typedef struct {
    uintptr_t reserved;
}
lxb_css_at_rule_namespace_t;

typedef struct {
    lxb_css_rule_list_t *block;
}
lxb_css_at_rule_font_face_t;


LXB_API const lxb_css_entry_at_rule_data_t *
lxb_css_at_rule_by_name(const lxb_char_t *name, size_t length);

LXB_API const lxb_css_entry_at_rule_data_t *
lxb_css_at_rule_by_id(uintptr_t id);

LXB_API lxb_css_rule_at_t *
lxb_css_at_rule_create(lxb_css_parser_t *parser,
                       const lxb_char_t *name, size_t length,
                       const lxb_css_entry_at_rule_data_t **out_entry);

LXB_API void *
lxb_css_at_rule_destroy(lxb_css_memory_t *memory, void *value,
                        lxb_css_at_rule_type_t type, bool self_destroy);

LXB_API lxb_status_t
lxb_css_at_rule_convert_to_undef(lxb_css_parser_t *parser,
                                 lxb_css_rule_at_t *at);

LXB_API lxb_status_t
lxb_css_at_rule_serialize(const void *style, lxb_css_at_rule_type_t type,
                          lexbor_serialize_cb_f cb, void *ctx);
LXB_API lxb_status_t
lxb_css_at_rule_serialize_str(const void *style, lxb_css_at_rule_type_t type,
                              lexbor_mraw_t *mraw, lexbor_str_t *str);
LXB_API lxb_status_t
lxb_css_at_rule_serialize_name(const void *style, lxb_css_at_rule_type_t type,
                               lexbor_serialize_cb_f cb, void *ctx);
LXB_API lxb_status_t
lxb_css_at_rule_serialize_name_str(const void *style, lxb_css_at_rule_type_t type,
                                   lexbor_mraw_t *mraw, lexbor_str_t *str);

/* _undef. */

LXB_API void *
lxb_css_at_rule__undef_create(lxb_css_memory_t *memory);

LXB_API void *
lxb_css_at_rule__undef_destroy(lxb_css_memory_t *memory,
                               void *style, bool self_destroy);
LXB_API lxb_status_t
lxb_css_at_rule__undef_serialize(const void *style, lexbor_serialize_cb_f cb,
                                 void *ctx);
LXB_API lxb_status_t
lxb_css_at_rule__undef_serialize_name(const void *at, lexbor_serialize_cb_f cb,
                                      void *ctx);

/* _custom. */

LXB_API void *
lxb_css_at_rule__custom_create(lxb_css_memory_t *memory);

LXB_API void *
lxb_css_at_rule__custom_destroy(lxb_css_memory_t *memory,
                                void *style, bool self_destroy);
LXB_API lxb_status_t
lxb_css_at_rule__custom_serialize(const void *style, lexbor_serialize_cb_f cb,
                                  void *ctx);
LXB_API lxb_status_t
lxb_css_at_rule__custom_serialize_name(const void *at, lexbor_serialize_cb_f cb,
                                       void *ctx);

/* Media. */

LXB_API void *
lxb_css_at_rule_media_create(lxb_css_memory_t *memory);

LXB_API void *
lxb_css_at_rule_media_destroy(lxb_css_memory_t *memory,
                              void *style, bool self_destroy);
LXB_API lxb_status_t
lxb_css_at_rule_media_serialize(const void *style, lexbor_serialize_cb_f cb,
                                void *ctx);

/* Namespace. */

LXB_API void *
lxb_css_at_rule_namespace_create(lxb_css_memory_t *memory);

LXB_API void *
lxb_css_at_rule_namespace_destroy(lxb_css_memory_t *memory,
                                  void *style, bool self_destroy);
LXB_API lxb_status_t
lxb_css_at_rule_namespace_serialize(const void *style, lexbor_serialize_cb_f cb,
                                    void *ctx);

/* Font-face. */

LXB_API void *
lxb_css_at_rule_font_face_create(lxb_css_memory_t *memory);

LXB_API void *
lxb_css_at_rule_font_face_destroy(lxb_css_memory_t *memory,
                                  void *style, bool self_destroy);

LXB_API lxb_status_t
lxb_css_at_rule_font_face_serialize(const void *style, lexbor_serialize_cb_f cb,
                                    void *ctx);

#ifdef __cplusplus
} /* extern "C" */
#endif

#endif /* LXB_CSS_AT_RULE_H */
