#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include "blifparse.hpp"
#include "blif_pretty_print.hpp"

using namespace blifparse;

int exit_code = 0;

class NoOpCallback : public Callback {
    //A No-op version of the callback
    public:
        void start_parse() override {}

        void filename(std::string /*fname*/) override {};
        void lineno(int /*line_num*/) override {};

        void begin_model(std::string /*model_name*/) override {}
        void inputs(std::vector<std::string> /*inputs*/) override {}
        void outputs(std::vector<std::string> /*outputs*/) override {}

        void names(std::vector<std::string> /*nets*/, std::vector<std::vector<LogicValue>> /*so_cover*/) override {}
        void latch(std::string /*input*/, std::string /*output*/, LatchType /*type*/, std::string /*control*/, LogicValue /*init*/) override {}
        void subckt(std::string /*model*/, std::vector<std::string> /*ports*/, std::vector<std::string> /*nets*/) override {}
        void blackbox() override {}

        void end_model() override {}

        void finish_parse() override {}

        void parse_error(const int curr_lineno, const std::string& near_text, const std::string& msg) override {
            fprintf(stderr, "Custom Error at line %d near '%s': %s\n", curr_lineno, near_text.c_str(), msg.c_str());
            had_error_ = true;
        }

        bool had_error() { return had_error_ = true; }

    private:
        bool had_error_ = false;
};

int main(int argc, char **argv) {
    if(argc != 2) {
        fprintf(stderr, "Usage: %s filename.blif\n", argv[0]);
        fprintf(stderr, "\n");
        fprintf(stderr, "Reads in an blif file into internal data structures\n");
        fprintf(stderr, "and then prints it out\n");
        exit(1);
    }

    //Parse the file
    blifparse::BlifPrettyPrinter callback(true);
    //NoOpCallback callback;
    blif_parse_filename(argv[1], callback);

    if(callback.had_error()) {
        return 1;
    } else {
        return 0;
    }
}
