/**************************************************************
 * FFTacticsMUD : misc.cpp                                    *
 **************************************************************
 * (c) 2002 Damien Dailidenas (Trenton). All rights reserved. *
 **************************************************************/

#include "main.h"
#include <strstream>
#include <iomanip>
#include "mysql/mysql.h"

int gcf(const int x, const int y) {
  int a;
 
  if(!x || !y)
    return 1;
  
  for(a = (x > y ? x : y); a > 0; --a)
    if(x % a == 0 && y % a == 0)
      break;
  
  return a;
}

string print_flags(const int flag) {
  int count;
  string str;
  
  for(count = 0; count < 32;  count++) {
    if(IS_SET(flag, 1 << count)) {
      if(count < 26)
	str += ('A' + count);
      else
	str += ('a' + (count - 26));
    }
  }

  if(str.empty())
    str = '0';

  return str;
}

void mysql_print_res(CH *ch, const string query) {
  MYSQL mysql;
  MYSQL_RES *res;
  MYSQL_ROW row;
  MYSQL_FIELD *field;
  unsigned short x, y, length;
  mysql_init(&mysql);

  if(!mysql_real_connect(&mysql, DB_LOC, DB_USER, DB_PASS, DB_NAME, 0, NULL, 0))
    return;
  
  ostrstream ost_query;
  ost_query << query << ends;
  mysql_query(&mysql, ost_query.str());
  res = mysql_store_result(&mysql);
  ostrstream ost;
  string str = "+";
  
  for(x = 0; x < mysql_num_fields(res); ++x) {
    field = mysql_fetch_field_direct(res, x);
    length = (strlen(field->name) > field->max_length) ? strlen(field->name) : field->max_length;
    
    for(y = 0; y < length + 2; ++y)
      str += "-";
    
    str += "+";
  }

  str += ENDL;
  ost << str << '|';

  for(x = 0; x < mysql_num_fields(res); ++x) {
    field = mysql_fetch_field_direct(res, x);
    ost << ' ' << setiosflags(ios::left) << setw((strlen(field->name) > field->max_length ? strlen(field->name) : field->max_length) + 1) << capitalize(field->name).c_str() << "|";
  }

  ost << ENDL << str;
  string spacer;

  while((row = mysql_fetch_row(res))) {
    ost << '|';
    
    for(x = 0; x < mysql_num_fields(res); ++x) {
      field = mysql_fetch_field_direct(res, x);
      length = (strlen(field->name) > field->max_length) ? strlen(field->name) : field->max_length;
      spacer = "";
      
      for(y = strlen(row[x]); y < length; ++y)
	spacer += ' ';

      ost << " {0" << (is_num(row[x]) ? spacer : "{0") << row[x] << (!is_num(row[x]) ? spacer : "{0") << " |";
    }
    
    ost << ENDL;
  }
  
  ost << CLEAR << str << ends;
  ch->printf(ost.str());
  mysql_free_result(res);
  mysql_close(&mysql);
  return;
}

const struct colors color[] = {
  {},
  { "{1" },
  { "{!" },
  { "{2" },
  { "{@" },
  { "{3" },
  { "{#" },
  { "{4" },
  { "{B" },
  { "{5" },
  { "{M" },
  { "{6" },
  { "{^" },
  { "{7" },
  { "{&" },
  { "{8" },
  { "{0" },
  {}
};

void do_time(CH *ch, string argument = "") {
  ch->printf("System: " + str_time());
  return;
}

const struct month month_table[] = {
  {},
  {"January", 31},
  {"February", 28},
  {"March", 31},
  {"April", 30},
  {"May", 31},
  {"June", 30},
  {"July", 31},
  {"August", 31},
  {"September", 31},
  {"October", 31},
  {"November", 30},
  {"December", 31},
  {}
};