#!/usr/bin/env python

import sys, MySQLdb, getpass
from getopt import getopt
from tools import *


tb_user = '''CREATE TABLE IF NOT EXISTS users (
	id int(10) unsigned not null auto_increment primary key,
	first_name varchar(20) not null,
	last_name varchar(20) not null,
	register_time datetime,
	email varchar(100),
	street varchar(255),
	city varchar(50),
	state varchar(50),
	zip varchar(10),
	phone varchar(20),
	logon_num int(10) unsigned not null default 0,
	user_name varchar(50),
	user_passwd varchar(32),
	logon_state tinyint(3) unsigned not null default 0,
	company varchar(50),
	country varchar(20),
	logon_time datetime,
	logoff_time datetime,
	act_state tinyint(4) default 0,
	INDEX user (user_name)
	)
'''
#guest_acc = '''INSERT INTO users (first_name, last_name, user_name, act_state) VALUES ('guest', 'guest', 'guest', 1)'''
#demo_acc = '''INSERT INTO users (first_name, last_name, user_name, act_state) VALUES ('demo', 'demo', 'demo', 1)'''
sql_fmt = '''INSERT INTO users (first_name, last_name, user_name, act_state) VALUES ('%s', '%s', '%s', 1)'''
reserved_sqls = {}
map(lambda a:reserved_sqls.setdefault(a, sql_fmt % (a,a,a)), RESERVED_USERNAME)

tb_request = '''CREATE TABLE IF NOT EXISTS requests (
	user_id int(10) unsigned not null default 0,
	req_id int(15) unsigned not null auto_increment primary key,
	req_time datetime,
	solve_time datetime,
	req_state tinyint(3) unsigned default 0,
	req_name varchar(100) not null,
	req_info blob,
	availability tinyint(3) unsigned default 1,
	category smallint(6) default 1,
	error_msg text,
	INDEX ui (user_id),
	INDEX nm (req_name)
	)
'''

		
def mkBase(host='localhost', port=3306, root_name='', root_passwd='', basename='webarray', user='webarray', passwd='webarray_password'):
	if root_passwd:
		db = MySQLdb.connect(host=host, port=port, user=root_name, passwd=root_passwd)
	else:
		db = MySQLdb.connect(host=host, port=port, user=root_name)
	cur = db.cursor()
	if cur.execute('show databases'):
		bases = [a[0] for a in cur.fetchall()]
	else: bases = []
	if True or basename not in bases: 
		cur.execute('CREATE DATABASE IF NOT EXISTS %s' % basename)
		# grant all on *.* to user_name identified by 'xxxxxxx';
		#cur.execute('GRANT ALL on %s.* to %s@%s IDENTIFIED BY "%s"' % (basename, user, host, passwd) )
		cur.execute('GRANT ALL on %s.* to %s IDENTIFIED BY "%s"' % (basename, user, passwd) ) # allow write from other computer
		cur.execute('UPDATE mysql.user SET File_priv="Y" where User="%s" and Host="%s"' % (user, host) )

		if os.path.exists(DB_OBJ):
			bak = DB_OBJ+'.bak'
			if os.path.exists(bak): os.unlink(bak)
			os.rename(DB_OBJ, bak)
		open(DB_OBJ, 'wt').write(encodeStr('''host = '%s'\nport = %d\nuser = '%s'\npasswd = '%s'\ndb = '%s' ''' % (host, port, user, passwd, basename)))

	cur.execute('USE %s' % basename)
	#if cur.execute('show tables'):
	#	tbs = [a[0] for a in cur.fetchall()]
	#else: tbs = []
	tbs = [a[0] for a in inquireDB('show tables', fetch=True)]
	if 'users' not in tbs: 
		cur.execute(tb_user)
		#cur.execute(guest_acc)
		#cur.execute(demo_acc)
		for sql in reserved_sqls.values(): cur.execute(sql)
	else:
		#cur.execute('SELECT id FROM users WHERE user_name="guest"')
		#if cur.rowcount == 0: cur.execute(guest_acc)
		#cur.execute('SELECT id FROM users WHERE user_name="demo"')
		#if cur.rowcount == 0: cur.execute(demo_acc)
		for unm, sql in reserved_sqls.items():
			cur.execute('SELECT id FROM users WHERE user_name="%s"' % unm)
			if cur.rowcount == 0: cur.execute(sql)
	if 'requests' not in tbs: cur.execute(tb_request)
	
	db.commit()
	cur.close()
	db.close()

def exitUsage(s=None):
	print 'Usage: %s -u MySQL_Manager_Name -p [-d data_file_directory] \nnote: use "-p" only if password is needed' % sys.argv[0]
	if s: print s
	sys.exit(0)

if __name__ == '__main__': 
	optlist, args = getopt(sys.argv[1:], 'u:pd:')
	optdict = dict(optlist)
	if not optdict.get('-u', ''): exitUsage('No administrator name, nothing done!')
	else: root_name = optdict['-u']
	if optdict.has_key('-p'): root_passwd = getpass.getpass()
	else: root_passwd = ''

	# get data_file folder
	if optdict.has_key('-d'): data_dir = '-d %s' % optdict['-d']
	else: data_dir = ''

	try:
		host='localhost'
		port = 3306
		if False: #os.path.exists('DBSRC'):
			exec open('DBSRC').read()
		else: exec get_dbstr()
		mkBase(host=host, port=port, root_name = root_name, root_passwd = root_passwd, basename=db, user=user, passwd=passwd)

		if os.name == 'posix':
			os.system('./mkmpmdb -n %s -t TABLES.txt -u %s -P "%s" %s' % (db, root_name, root_passwd, data_dir))
		else:
			os.system('python mkmpmdb -n %s -t TABLES.txt -u %s -P "%s" %s' % (db, root_name, root_passwd, data_dir))
		encodeDB()
	except:
		print 'You need MySQL manager privilege to create database!\nNothing done!\n\n'
		
