#include "sat/sat_solver.h"
#include "sat/sat_watched.h"
#include "util/statistics.h"
#include "sat/sat_lookahead.h"
#include "sat/dimacs.h"
#include <iostream>

static void display_model(sat::model const & m) {
    for (unsigned i = 1; i < m.size(); i++) {
        switch (m[i]) {
        case l_false: std::cout << "-" << i << " ";  break;
        case l_undef: break;
        case l_true: std::cout << i << " ";  break;
        }
    }
    std::cout << "\n";
}


void tst_sat_lookahead(char ** argv, int argc, int& i) {
    if (argc != i + 2) {
        std::cout << "require dimacs file name\n";
        return;
    }
//    enable_trace("sat");
    reslimit limit;
    params_ref params;
    sat::solver solver(params, limit);
    char const* file_name = argv[i + 1];
    ++i;

    {
        std::ifstream in(file_name);
        if (in.bad() || in.fail()) {
            std::cerr << "(error \"failed to open file '" << file_name << "'\")" << std::endl;
            exit(ERR_OPEN_FILE);
        }
        if (!parse_dimacs(in, std::cerr, solver))
            return;
    }
   
    sat::lookahead lh(solver);

    IF_VERBOSE(20, solver.display_status(verbose_stream()););

    lbool is_sat = lh.check();
    std::cout << is_sat << "\n";

    statistics st;
    lh.collect_statistics(st);
    st.display(std::cout);
    if (is_sat == l_true) {
        display_model(lh.get_model());
    }
}
