#!/usr/bin/env python
# -*- coding: utf-8 -*-
from django.core.management.base import copy_helper
from django.core.management.color import color_style
import sys, os, re, stat
from random import choice

INVALID_PROJECT_NAMES = ('django', 'site', 'test')

APP_NAME = 'www'
ADMIN_NAME = 'intranet'

SETTINGS_TEMPLATE = """# -*- coding: utf-8 -*-
import os
from env_settings import *

PROJECT = os.path.split(os.path.dirname(os.path.abspath(__file__)))[-1]

TIME_ZONE = 'Europe/Andorra'
USE_I18N = True
LANGUAGES = (
  ('en', u'English'),
  ('ca', u'Català'),
  ('es', u'Español'),
)
LANGUAGE_CODE = 'en'
MEDIA_ROOT = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'media/')
MEDIA_URL = '/media/'
ADMIN_MEDIA_PREFIX = '/media/""" + ADMIN_NAME + """/'
SECRET_KEY = ''
TEMPLATE_CONTEXT_PROCESSORS = (
    'django.core.context_processors.auth',
    'django.core.context_processors.debug',
    'django.core.context_processors.i18n',
    'django.core.context_processors.media',
    'django.core.context_processors.request',
)
TEMPLATE_LOADERS = (
    'django.template.loaders.app_directories.load_template_source',
)
MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.middleware.doc.XViewMiddleware',
    'django.middleware.locale.LocaleMiddleware',
)
ROOT_URLCONF = '%s.urls' % PROJECT
TEMPLATE_DIRS = ()
INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    '%s.""" + APP_NAME + """' % PROJECT,
    'django.contrib.admin',
)

"""

ENV_SETTINGS_TEMPLATE = """import os

DEBUG = True
TEMPLATE_DEBUG = True
ADMINS = (
	# ('Your Name', 'your_email@domain.com'),
)
MANAGERS = ADMINS
DATABASE_ENGINE = 'sqlite3'
DATABASE_NAME = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'db', '%s.db')
DATABASE_USER = ''
DATABASE_PASSWORD = ''
DATABASE_HOST = ''
DATABASE_PORT = ''
"""

URLS_PROJECT_TEMPLATE = """from django.conf.urls.defaults import *
from django.conf import settings
from django.contrib import admin

urlpatterns = patterns('',
	('^""" + ADMIN_NAME + """/(.*)', admin.site.root),
	(r'', include('%s.""" + APP_NAME + """.urls' % settings.PROJECT)),
)
if settings.DEBUG:
	urlpatterns += patterns('django.views.static',
		(r'^media/(?P<path>.*)$', 'serve', {'document_root': settings.MEDIA_ROOT}),
	)
"""

URLS_APP_TEMPLATE = """from django.conf.urls.defaults import *
from django.conf import settings
from models import *

urlpatterns = patterns('',
	(r'^i18n/', include('django.conf.urls.i18n')),
)
urlpatterns += patterns('django.views.generic.simple',
	(r'^$', 'direct_to_template', {'template': 'base.html'}),
)
#urlpatterns += patterns('django.views.generic.list_detail',
#)
#urlpatterns += patterns('%s.""" + APP_NAME + """.views' % settings.PROJECT,
#)

"""

BASE_TEMPLATE = """<?xml version="1.0" encoding="utf-8"?>
{% load i18n %}
{% get_current_language as LANGUAGE_CODE %}
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
	"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="{{ LANGUAGE_CODE }}" lang="{{ LANGUAGE_CODE }}">
	<head>
		<title>{% block title %}{% trans '[[ PLACE YOUR WEBSITE TITLE HERE ]]' %}{% endblock %}</title>
		<link rel="stylesheet" type="text/css" href="/css/screen.css"/>
		<link rel="shortcut icon" href="/favicon.ico"/>
		{% block head %}{% endblock %}
	</head>
	<body>
		{% block body %}
			<!-- REMOVE THIS LINE --><h1>Your new Django project has succesfully created. Thanks DSNP!</h1>
		{% endblock %}
		<script type="text/javascript">
			var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
			document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
		</script>
		<script type="text/javascript">
			var pageTracker = _gat._getTracker("[[ PLACE YOUR GOOGLE ANALYTICS KEY HERE ]]");
			pageTracker._initData();
			pageTracker._trackPageview();
		</script>
	</body>
</html>
"""

def startproject(project_name):
	directory = os.getcwd()

	if project_name in INVALID_PROJECT_NAMES:
		raise CommandError("%r conflicts with the name of an existing Python module and cannot be used as a project name. Please try another name." % project_name)

	# copy project temaplate files
	copy_helper(color_style(), 'project', project_name, directory)

	# copy custom settings.py (creating random secret key)
	main_settings_file = os.path.join(directory, project_name, 'settings.py')
	settings_contents = SETTINGS_TEMPLATE
	fp = open(main_settings_file, 'w')
	secret_key = ''.join([choice('abcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*(-_=+)') for i in range(50)])
	settings_contents = re.sub(r"(?<=SECRET_KEY = ')'", secret_key + "'", settings_contents)
	fp.write(settings_contents)
	fp.close()

	# creates sqlite database directory, and allow all users write on it (apache user needs writting permissions on this directory)
	db_dir = os.path.join(directory, project_name, 'db')
	db_file = os.path.join(db_dir, '%s.db' % project_name)
	os.mkdir(db_dir)
	os.chmod(db_dir, stat.S_IRWXU + stat.S_IRWXG + stat.S_IRWXO)
	fp = open(db_file, 'w')
	fp.close()
	os.chmod(db_file, stat.S_IRUSR + stat.S_IWUSR + stat.S_IRGRP + stat.S_IWGRP + stat.S_IROTH + stat.S_IWOTH)

	# copy env_settings with environemt specific settings
	env_settings_file = os.path.join(directory, project_name, 'env_settings.py')
	env_settings_contents = ENV_SETTINGS_TEMPLATE % project_name
	fp = open(env_settings_file, 'w')
	fp.write(env_settings_contents)
	fp.close()

	# copy custom urls.py (for project)
	project_urls_file = os.path.join(directory, project_name, 'urls.py')
	project_urls_contents = URLS_PROJECT_TEMPLATE
	fp = open(project_urls_file, 'w')
	fp.write(project_urls_contents)
	fp.close()

	# copy application template files
	copy_helper(color_style(), 'app', APP_NAME, os.path.join(directory, project_name), project_name)

	# copy custom urls.py (for application)
	app_urls_file = os.path.join(directory, project_name, APP_NAME, 'urls.py')
	app_urls_contents = URLS_APP_TEMPLATE
	fp = open(app_urls_file, 'w')
	fp.write(app_urls_contents)
	fp.close()

	# use admin.py to register models to admin
	models_file = os.path.join(directory, project_name, APP_NAME, 'models.py')
	fp = open(models_file, 'a')
	fp.write('%simport admin # This line must be at the end of the file' % (os.linesep * 4))
	fp.close()
	admin_file = os.path.join(directory, project_name, APP_NAME, 'admin.py')
	fp = open(admin_file, 'w')
	fp.write('from django.contrib import admin%s' % os.linesep)
	fp.write('from models import *%s%s' % ((os.linesep,) * 2))
	fp.write('# admin.site.register(YourModel)%s' % os.linesep)
	fp.close()


	# extra tasks
	os.mkdir(os.path.join(directory, project_name, APP_NAME, 'templates'))

	# copy base template
	main_base_file = os.path.join(directory, project_name, APP_NAME, 'templates', 'base.html')
	base_contents = BASE_TEMPLATE
	fp = open(main_base_file, 'w')
	fp.write(base_contents)
	fp.close()

	# create media directories and copy admin media
	os.mkdir(os.path.join(directory, project_name, 'media'))
	os.mkdir(os.path.join(directory, project_name, 'media', 'css'))
	os.mkdir(os.path.join(directory, project_name, 'media', 'img'))
	os.mkdir(os.path.join(directory, project_name, 'media', 'js'))
	os.mkdir(os.path.join(directory, project_name, 'media', 'model-media'))
	import django
	django_dir = os.path.dirname(str(django).split("'")[3])
	import shutil
	shutil.copytree(os.path.join(django_dir, 'contrib', 'admin', 'media'), os.path.join(directory, project_name, 'media', ADMIN_NAME))

def syncdb(prog_name, project_name):
	sys.path.append(os.path.join(os.getcwd(), project_name))
	import settings
	from django.core.management import execute_manager
	execute_manager(settings, [prog_name, 'syncdb'])
	os.chdir(os.path.join(os.getcwd(), project_name))

if __name__ == '__main__':
	if len(sys.argv) == 2:	
		startproject(sys.argv[1])
		syncdb(sys.argv[0], sys.argv[1])
		print '\nYour project has been succesfully created.\n\n\tExecute "python manage.py runserver" to test your application.\n'
	else:
		sys.stderr.write('Usage: %s <new_project_name>\n' % sys.argv[0])
		sys.exit(1)

