#pragma once

#include "report.h"
#include <stdint.h>

typedef enum {
    IdentResolTy_None,
    IdentResolTy_Label,
    IdentResolTy_SubLabel,
    IdentResolTy_Const,
    IdentResolTy_Extern,
} IdentResolTy;

typedef struct IdentResol IdentResol;
struct IdentResol {
    char* ident;
    Loc loc;
    const IdentResol* parent;
    IdentResolTy ty;
    union {
        uint16_t ip;
        struct {
            uint16_t value;
            char* src_filename;
        };
        size_t extern_id;
    };
};

void ident_resol_destroy(IdentResol* resol);

typedef struct IdentResolver IdentResolver;

struct IdentResolver {
    IdentResol* resols;
    size_t resols_capacity;
    size_t resols_size;
    const IdentResol* current_parent;
};
void ident_resolver_construct(IdentResolver* resolver);
void ident_resolver_destroy(IdentResolver* resolver);
void ident_resolver_define_label(
    IdentResolver* resolver, char* ident, Loc loc, uint16_t asm_ip);
void ident_resolver_define_sublabel(
    IdentResolver* resolver, char* ident, Loc loc, uint16_t asm_ip);
void ident_resolver_define_const(IdentResolver* resolver,
    char* ident,
    Loc loc,
    uint16_t value,
    char* src_filename);
void ident_resolver_define_extern(
    IdentResolver* resolver, char* ident, Loc loc, size_t extern_id);
const IdentResol* ident_resolver_resolve(
    const IdentResolver* resolver, const char* ident);