#include <stdio.h>
#include <string.h>

#include "ast.h"
#include "dep.h"
#include "eval.h"
#include "exec.h"
#include "file.h"
#include "file_cache.h"
#include "fileutil.h"
#include "func.h"
#include "log.h"
#include "string_piece.h"
#include "strutil.h"
#include "var.h"

static const char* g_makefile;

static void ParseCommandLine(int argc, char* argv[],
                             vector<StringPiece>* targets) {
  for (int i = 1; i < argc; i++) {
    const char* arg = argv[i];
    if (!strcmp(arg, "-f")) {
      g_makefile = argv[++i];
    } else if (arg[0] == '-') {
      ERROR("Unknown flag: %s", arg);
    } else {
      targets->push_back(Intern(arg));
    }
  }
}

static void Init() {
  InitSymtab();
  InitFuncTable();
  InitDepNodePool();

  if (g_makefile == NULL) {
    if (Exists("GNUmakefile")) {
      g_makefile = "GNUmakefile";
    } else if (Exists("makefile")) {
      g_makefile = "makefile";
    } else if (Exists("Makefile")) {
      g_makefile = "Makefile";
    } else {
      ERROR("*** No targets specified and no makefile found.");
    }
  }
}

static void Quit() {
  QuitDepNodePool();
  QuitFuncTable();
  QuitSymtab();
}

static int Run(const vector<StringPiece>& targets) {
  MakefileCacheManager* cache_mgr = NewMakefileCacheManager();
  Makefile* mk = cache_mgr->ReadMakefile(g_makefile);

  // TODO: Fill env, etc.
  Vars* vars = new Vars();
  Evaluator* ev = new Evaluator(vars);
  for (AST* ast : mk->asts()) {
    LOG("%s", ast->DebugString().c_str());

    ast->Eval(ev);
  }

  EvalResult* er = ev->GetEvalResult();
  for (auto p : *er->vars) {
    vars->Assign(p.first, p.second);
  }
  er->vars->clear();

  vector<DepNode*> nodes;
  MakeDep(er->rules, *vars, er->rule_vars, targets, &nodes);

  Exec(nodes, vars);

  delete er;
  delete ev;
  delete vars;
  delete cache_mgr;

  return mk != 0;
}

int main(int argc, char* argv[]) {
  Init();
  vector<StringPiece> targets;
  ParseCommandLine(argc, argv, &targets);
  int r = Run(targets);
  Quit();
  return r;
}
