/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set et sw=2 ts=2: */
/***************************************************************************
 *            macrotool.cc
 *
 *  Mon Jul  6 08:25:28 CEST 2009
 *  Copyright 2009 Bent Bisballe Nyeng
 *  deva@aasimon.org
 ****************************************************************************/

/*
 *  This file is part of Pracro.
 *
 *  Pracro is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  Pracro is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with Pracro; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA.
 */
// For ETC
#include <config.h>

#include <stdlib.h>
#include <string.h>

// For getopt_long and friends
#include <getopt.h>

#include <vector>
#include <string>

#include "configurationparser.h"
#include "configuration.h"

#include "debug.h"

#include "dump.h"
#include "fieldnames.h"
#include "filehandler.h"
#include "export.h"

static const char version_str[] =
"Pracro server v" VERSION "\n"
;

static const char copyright_str[] =
"Copyright (C) 2006-2009 Bent Bisballe Nyeng - Aasimon.org.\n"
"This is free software.  You may redistribute copies of it under the terms of\n"
"the GNU General Public License <http://www.gnu.org/licenses/gpl.html>.\n"
"There is NO WARRANTY, to the extent permitted by law.\n"
"\n"
"Written by Bent Bisballe Nyeng (deva@aasimon.org)\n"
;

static const char usage_str[] =
"Usage: %s [options] command\n"
"Options:\n"
"  -c, --config file   Read configfile from 'file'\n"
"  -x, --xml-basedir d Use 'd' as basedir for finding template- and macro-files (default "XML").\n"
"  -v, --version       Print version information and exit.\n"
"  -h, --help          Print this message and exit.\n"
"  -D, --debug ddd     Enable debug messages on 'ddd'; see documentation for details\n"
"\n"
"Commands:\n"
"  dump entity         Dumps 'entity' to screen ('dump help' to see list of entities).\n"
"  fieldnames entity   Add/delete/update entries in the fieldnames database\n"
"                       ('fieldnames help' to see list of entities).\n"
"  filehandler entity  Handle macro files ('filehandler help' to see list of entities).\n"
"  export entity       Export data from database to comma separated file ('export help' to see list of entities)\n"
;

ConfigurationParser *configparser = NULL;

int main(int argc, char *argv[])
{
  int c;
  std::string configfile;
  std::string xml_basedir;
  char *debugstr = NULL;

  debug_init(stderr);

  int option_index = 0;
  while(1) {
    static struct option long_options[] = {
      {"config", required_argument, 0, 'c'},
      {"help", no_argument, 0, 'h'},
      {"version", no_argument, 0, 'v'},
      {"xml-basedir", required_argument, 0, 'x'},
      {"debug", required_argument, 0, 'D'},
      {0, 0, 0, 0}
    };
    
    c = getopt_long (argc, argv, "D:hvc:x:", long_options, &option_index);
    
    if (c == -1)
      break;

    switch(c) {
    case 'c':
      configfile = optarg;
      break;

    case 'x':
      xml_basedir = optarg;
      break;

    case 'D':
      debugstr = strdup(optarg);
      break;

    case '?':
    case 'h':
      printf("%s", version_str);
      printf(usage_str, argv[0]);
      return 0;

    case 'v':
      printf("%s", version_str);
      printf("%s", copyright_str);
      return 0;

    default:
      break;
    }
  }

  if(optind >= argc) {
    fprintf(stderr, "Missing command\n");
    printf(usage_str, argv[0]);
    exit(EXIT_FAILURE);
  }

  if(debugstr) {
    debug_parse(debugstr);
  }

  // Load config
  if(configfile == "") configfile = ETC"/pracrod.conf";
  configparser = new ConfigurationParser(configfile);

  if(xml_basedir != "") {
    Conf::xml_basedir = xml_basedir;
  }

  std::string command = argv[optind++];
  std::vector<std::string> params;
  while(optind < argc) {
    params.push_back(argv[optind++]);
  }

  if(command == "dump") macrotool_dump(params);
  if(command == "fieldnames") macrotool_fieldnames(params);
  if(command == "filehandler") macrotool_filehandler(params);
  if(command == "export") macrotool_export(params);

  return 0;
}