#!/usr/bin/env python

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


tb_user = '''CREATE TABLE 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', 'user_name', 1)'''

tb_request = '''CREATE TABLE 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, user=root_name, passwd=root_passwd)
	else:
		db = MySQLdb.connect(host=host, user=root_name)
	cur = db.cursor()
	if cur.execute('show databases'):
		bases = [a[0] for a in cur.fetchall()]
	else: bases = []
	if basename not in bases: 
		cur.execute('CREATE DATABASE %s' % basename)
		cur.execute('GRANT ALL on %s.* to %s@%s IDENTIFIED BY "%s"' % (basename, user, host, passwd) )
		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 = []
	if 'users' not in tbs: 
		cur.execute(tb_user)
		cur.execute(guest_acc)
	if 'requests' not in tbs: cur.execute(tb_request)
	
	cur.close()
	db.close()

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

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

	try:
		exec open('DBSRC').read()
		mkBase(root_name = root_name, root_passwd = root_passwd, basename=db, user=user, passwd=passwd)
		encodeDB()
	except:
		print 'You need MySQL manager privilege to create database!\n\n'
		raise
