//  DescriptionHere - gameDB.cpp
//  Created by John Ryland (jryland@xiaofrog.com), 02/11/2017
//  Copyright (c) 2017 InvertedLogic
//  All rights reserved.
#include <sqlite3.h>
#include "gameDB.h"

static int patternsCallback(void* user, int argc, char **argv, char **azColName)
{
  char* end;
  if (!user || argc != 5 || strcmp(azColName[0],"id") != 0)
    return -1;
  GameDB* gameDB = (GameDB*)user;
  Pattern pattern;
  pattern.m_id = atoi(argv[0]);
  pattern.m_tiles = atoi(argv[1]);
  pattern.m_score = atoi(argv[2]);
  pattern.m_offsets = strtoull(argv[3], &end, 10);
  pattern.m_lengths = strtoull(argv[4], &end, 10);
  gameDB->m_patterns.push_back(pattern);
  return 0;
}
static int assetCallback(void* user, int argc, char **argv, char **azColName)
{
  if (!user || argc != 2 || strcmp(azColName[0],"id") != 0)
    return -1;
  GameDB* gameDB = (GameDB*)user;
  Asset asset;
  asset.m_id = atoi(argv[0]);
  asset.m_name = argv[1];
  gameDB->m_assets.push_back(asset);
  return 0;
}

/*
static int tileTypeCallback(void* user, int argc, char **argv, char **azColName)
{
  if (!user || argc != 3 || strcmp(azColName[0],"id") != 0)
    return -1;
  GameDB* gameDB = (GameDB*)user;
  TileType tileType;
  tileType.m_id = atoi(argv[0]);
  //tileType.m_flags = atoi(argv[1]);
  tileType.m_assetId = atoi(argv[2]);
  gameDB->m_tileTypes.push_back(tileType);
  return 0;
}
*/

class SqlDB
{
public:
  SqlDB(const char* a_fileName)
  {
    okay = sqlite3_open(a_fileName, &db) == SQLITE_OK;
    if (!okay)
      fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
  }
  ~SqlDB()
  {
    sqlite3_close(db);
  }
  bool execute(const char* query, int (*callback)(void*,int,char**,char**), void* user)
  {
    char *zErrMsg = 0;
    int rc = sqlite3_exec(db, query, callback, user, &zErrMsg);
    if (rc != SQLITE_OK)
    {
      fprintf(stderr, "SQL error: %s\n", zErrMsg);
      sqlite3_free(zErrMsg);
      return false;
    }
    return true;
  }
  operator bool() { return okay; }
private:
  sqlite3 *db;
  bool okay;
#if 0
  int sqlite3_get_table(
      sqlite3 *db,          /* An open database */
      const char *zSql,     /* SQL to be evaluated */
      char ***pazResult,    /* Results of the query */
      int *pnRow,           /* Number of result rows written here */
      int *pnColumn,        /* Number of result columns written here */
      char **pzErrmsg       /* Error msg written here */
      );
  void sqlite3_free_table(char **result);
#endif
};

bool loadGameDB(GameDB& a_gameDB)//, const char* a_fileName)
{
  // TODO: build shouldn't be in the path here
  SqlDB db("build/gameDB.db");
  if (!db)
    return false;
  if (!db.execute("select * from patterns", patternsCallback, (void*)&a_gameDB))
    return false;
  if (!db.execute("select * from assets", assetCallback, (void*)&a_gameDB))
    return false;
  //if (!db.execute("select * from sprites", tileTypeCallback, (void*)&a_gameDB))
  //if (!db.execute("select * from tiletypes", tileTypeCallback, (void*)&a_gameDB))
    //return false;
  return true;
}

