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

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

time_t time(time_t *tloc);
string lcom, lfun, login_screen;
TID time_info;
bool fBootDb;

void init_mm args(());
void load_login_screen args(());
void load_areas();

void startup() {
  long lhour, lday, lmonth;
  fBootDb = true;
  init_mm();
  lhour	= (current_time - 650336715) / (PULSE_TICK / PPS);
  time_info.hour = lhour  % 24;
  lday = lhour / 24;
  time_info.day	= lday % 35;
  lmonth = lday  / 35;
  time_info.month = lmonth % 17;
  time_info.year = lmonth / 17;
  load_login_screen();
  load_areas();
  load_battle_areas();
//  load_shops();
//  load_global_settings();
  fBootDb = false;
  log_string("Loading complete.");
  return;
}

void load_login_screen() {
  ifstream file("../src/login");
  char c_temp[256];
  ostrstream ost;

  while(file.getline(c_temp, 256))
    ost << c_temp << endl;

  file.close();
  ost << ends;
  login_screen = ost.str();
  return;
}

void load_areas() {
  log_string("Loading areas...");
  AREA *area;
  ROOM *room;

  for(short x = 1; area_table[x].name; ++x) {
    area = new AREA;
    area->next = area_list;
    area_list = area;
    area->id = x;
    room = new ROOM;
    area->room[ROOM_OUTSIDE] = room;
    room->area = area;
    room->id = ROOM_OUTSIDE;
  }

  return;
}

void load_global_settings() {
  MYSQL mysql;
  MYSQL_RES *res;
  MYSQL_ROW row;
  extern bool wizlock, newlock;

  log_string("Loading global settings...");
  mysql_init(&mysql);

  if(!mysql_real_connect(&mysql, DB_LOC, DB_USER, DB_PASS, DB_NAME, 0, NULL, 0))
    return;
      
  mysql_query(&mysql, "SELECT * FROM globalSettings");
  res = mysql_store_result(&mysql);

  while((row = mysql_fetch_row(res)))
    wizlock = atoi(row[0]), newlock = atoi(row[1]);
  
  mysql_free_result(res);
  mysql_close(&mysql);   
  return;
}

void load_battle_area(string str) {
  BATTLE_ROOM *room;
  unsigned int size, x;
  string str_name, str_temp;
  split(str, str_name);
  short aID = atoi(str.c_str());
  ifstream file(str_name.c_str());

  if(!file.is_open()) {
    log_string("ERROR: Couldn't open " + str_name + ".area");
    return;
  }

  BATTLE_AREA *area = new BATTLE_AREA;
  area->next = battle_area_list;
  battle_area_list = area;
  getline(file, area->name);
  getline(file, area->name);
  area->id = aID;
  file >> area->width;
  file >> area->height;
  file >> area->weather;
  size = area->size();

  for(x = 1; x <= size; ++x) {
    room = new BATTLE_ROOM;
    area->room[x] = room;
    room->area = area;
    room->id = x;
    file >> room->sector >> room->type >> room->height >> room->depth;
  }
 
  file.close();
  area->set_coordinates();
  return;
}

void load_battle_areas() {
  log_string("Loading battle areas...");  
  ifstream file("../areas/battle_area.list");

  if(!file.is_open()) {
    log_string("ERROR: Couldn't open ../areas/battle_area.list");
    return;
  }

  short cnt = 0;
  string str_filename;
  ostrstream ost;
  char c_temp[30];

  while(file.getline(c_temp, 30)) {
    str_filename = c_temp;
    ost.freeze(false);
    ost.seekp(0, ios::beg);
    ost << "../areas/" << str_filename << ' ' << ++cnt << ends;
    load_battle_area(ost.str());
  }

  file.close();
  return;
}

void load_shops() {
  MYSQL mysql;
  MYSQL_RES *res;
  MYSQL_ROW row;
  ROOM *room;
  AREA *area;
  SHOP *shop;

  log_string("Loading shops...");
  mysql_init(&mysql);
 
  if(!mysql_real_connect(&mysql, DB_LOC, DB_USER, DB_PASS, DB_NAME, 0, NULL, 0))
    return;

  mysql_query(&mysql, "SELECT * FROM shop_data");
  res = mysql_store_result(&mysql);

  while((row = mysql_fetch_row(res))) {
    area = get_area(atoi(row[0]));
    room = area->room[atoi(row[1])];

    if(!room->shop) {
      shop = new SHOP;
      room->shop = shop;
    }

    room->shop->add(create_obj(atoi(row[2])));
  }

  mysql_free_result(res);
  mysql_close(&mysql);
  return;
}

long flag_convert(char letter) {
  long bitsum = 0;
  char i;

  if('A' <= letter && letter <= 'Z')  {
    bitsum = 1;
    
    for(i = letter; i > 'A'; i--)
      bitsum *= 2;
  }
  else if('a' <= letter && letter <= 'z') {
    bitsum = 67108864; // 2^26
    
    for(i = letter; i > 'a'; i --)
      bitsum *= 2;
  }
  
  return bitsum;
}

int num_range(int from, int to) {
  int power, number;
  
  if(from == 0 && to == 0)
    return 0;
  
  if((to = to - from + 1) <= 1)
    return from;
  
  for(power = 2; power < to; power <<= 1)
    ;
  
  while((number = number_mm() & (power - 1)) >= to)
    ;
  
  return from + number;
}

int num_percent() {
  int percent;
  
  while((percent = number_mm() & (128-1)) > 99)
    ;
  
  return 1 + percent;
}

void init_mm() {
  srandom(time(NULL)^getpid());
  return;
}

long number_mm() {
  return random() >> 6;
}

void append_file(CH *ch, const string str_file, const string str = "") {
  if(str.empty())
    return;

  ofstream file(str_file.c_str());

  if(!file.is_open()) {
    perror(str_file.c_str());
    ch->printf("Could not open the file!\n\r");
  }
  else {
    file << ch->name << ": " << str << ends;
    file.close();
  }

  return;
}

long db_read_flags(const string str_flags) {
  int number = 0, x = 0;
  char c = str_flags[x];
  
  if(!isdigit(c)) {
    while(('A' <= c && c <= 'Z') || ('a' <= c && c <= 'z')) {
      number += flag_convert(c);
      c = str_flags[++x];
    }
  }
  
  while(isdigit(c)) {
    number = number * 10 + c - '0';
    c = str_flags[++x];
  }
  
  return number;
}