#!/usr/bin/python
from __future__ import unicode_literals
import os, commands

# ask for root mysql password
import getpass

root_pwd = None
while not root_pwd:
	root_pwd = getpass.getpass("MySQL Root user's Password: ")
	
# test root connection
op = commands.getoutput("mysql -u root -p%s -e 'exit'" % \
	root_pwd.replace('$', '\$').replace(' ', '\ '))
if "access denied" in op.lower():
	raise Exception("Incorrect MySQL Root user's password")

# ask for new dbname
new_dbname = None
while not new_dbname:
	new_dbname = raw_input("New ERPNext Database Name: ")

# ask for new dbpassword
new_dbpassword = None
while not new_dbpassword:
	new_dbpassword = raw_input("New ERPNext Database's Password: ")

# get erpnext path
erpnext_path = os.path.dirname(os.path.abspath(__file__))
os.chdir(erpnext_path)

# setup backups
if not os.path.exists(os.path.join(erpnext_path, 'backups')):
	os.makedirs('backups')
	os.symlink(os.path.join(erpnext_path, 'backups'),
		os.path.join(erpnext_path, 'public', 'backups'))
	
# setup files
if not os.path.exists(os.path.join(erpnext_path, 'files')):
	os.makedirs('files')
	os.symlink(os.path.join(erpnext_path, 'files'),
		os.path.join(erpnext_path, 'public', 'files'))

# setup logs
if not os.path.exists(os.path.join(erpnext_path, 'logs')):
	os.makedirs('logs')
	os.system('touch logs/error_log.txt')

# setup lib -- framework repo with read only access
# change this if you have your own fork
if not os.path.exists(os.path.join(erpnext_path, 'lib')):
	os.system('git clone https://github.com/webnotes/wnframework.git lib')

# setup symlinks in public
if not os.path.exists(os.path.join(erpnext_path, 'public', 'js', 'lib')):
	os.symlink(os.path.join(erpnext_path, 'lib', 'js', 'lib'),
		os.path.join(erpnext_path, 'public', 'js', 'lib'))
if not os.path.exists(os.path.join(erpnext_path, 'public', 'images', 'lib')):
	os.symlink(os.path.join(erpnext_path, 'lib', 'images'),
		os.path.join(erpnext_path, 'public', 'images', 'lib'))

# extract master
if os.path.exists(os.path.join(erpnext_path, 'data', 'master.sql.gz')):
	os.system('gunzip data/master.sql.gz')

# setup conf
if not os.path.exists(os.path.join(erpnext_path, 'conf.py')):
	# read template conf file
	with open(os.path.join(erpnext_path, 'lib', 'conf', 'conf.py'), 'r') as template:
		content = template.read()
	
	# manipulate content
	import re
	
	# set new_dbname, new_dbpassword, files_path, backup_path, log_file_name
	content = re.sub("db_name.*", "db_name = '%s'" % new_dbname, content)
	content = re.sub("db_password.*", "db_password = '%s'" % new_dbpassword, content)
	content = re.sub("files_path.*", "files_path = '%s'" % \
		os.path.join(erpnext_path, 'files'), content)
	content = re.sub("backup_path.*", "backup_path = '%s'" % \
		os.path.join(erpnext_path, 'backups'), content)
	content = re.sub("log_file_name.*", "log_file_name = '%s'" % \
		os.path.join(erpnext_path, 'logs', 'error_log.txt'), content)
		
	
	# write conf file
	with open(os.path.join(erpnext_path, 'conf.py'), 'w') as new_conf:
		new_conf.write(content)	

# install db
import sys
sys.path.append('.')
sys.path.append('lib')
sys.path.append('app')

from webnotes.install_lib.install import Installer
inst = Installer('root', root_pwd)
inst.import_from_db(new_dbname, source_path=os.path.join(erpnext_path, 'data', 'master.sql'), verbose = 1)

# apply patches
os.chdir(erpnext_path)
os.system("lib/wnf.py --update origin master")

# set filemode false
os.system("git config core.filemode false")
os.chdir(os.path.join(erpnext_path, 'lib'))
os.system("git config core.filemode false")

steps_remaining = """
Notes:
------

sample apache conf file
#-----------------------------------------------------------
SetEnv PYTHON_EGG_CACHE /var/www

# you can change 99 to any other port

Listen 99
NameVirtualHost *:99
<VirtualHost *:99>
	ServerName localhost
	DocumentRoot {path to erpnext's folder}/public
    AddHandler cgi-script .cgi .xml .py

	<Directory {path to erpnext's folder}/public/>
		# directory specific options
		Options -Indexes +FollowSymLinks +ExecCGI
		
		# directory's index file
		DirectoryIndex web.py

		# rewrite rule
		RewriteEngine on
		
		# condition 1:
		# ignore login-page.html, app.html, blank.html, unsupported.html
		RewriteCond %{REQUEST_URI} ^((?!app\.html|blank\.html|unsupported\.html).)*$
		
		# condition 2: if there are no slashes
		# and file is .html or does not containt a .
		RewriteCond %{REQUEST_URI} ^(?!.+/)((.+\.html)|([^.]+))$

		# rewrite if both of the above conditions are true
		RewriteRule ^(.+)$ web.py?page=$1 [NC,L]
		
		AllowOverride all
		Order Allow,Deny
		Allow from all
	</Directory>
</VirtualHost>
#-----------------------------------------------------------

To Do:

* Configure apache/http conf file to point to public folder
* chown recursively all files in your folder to apache user
* login using: user="Administrator" and password="admin"

"""

print steps_remaining

