#pragma once
#include "binop.hpp"
#include "parse_driver.hpp" 
#include "definition.hpp" 
#include "type_env.hpp" 
#include "type.hpp"
#include "global_scope.hpp"
#include "mangler.hpp" 
#include "llvm_context.hpp"

class compiler {
    private:
        file_mgr file_m;
        definition_group global_defs;
        parse_driver driver;
        type_env_ptr global_env;
        type_mgr type_m;
        mangler mng;
        global_scope global_scp;
        llvm_context ctx;

        void add_default_types();
        void add_binop_type(binop op, type_ptr type);
        void add_default_function_types();
        void parse();
        void typecheck();
        void translate();
        void compile();
        void create_llvm_binop(binop op);
        void generate_llvm();
        void output_llvm(const std::string& into);
    public:
        compiler(const std::string& filename);
        void operator()(const std::string& into);
        file_mgr& get_file_manager();
        type_mgr& get_type_manager();
};
