#!/usr/bin/python

import os
import subprocess
import re
import sys
from time import gmtime, strftime

esc_seq = '\x1b['

codes={}
codes['reset']     = esc_seq + '39;49;00m'
codes['red']       = esc_seq + '31;01m'
codes['green']     = esc_seq + '32;01m'
codes['yellow']    = esc_seq + '33;01m'
codes['turquoise'] = esc_seq + '36;01m'

try:
	def setvar(file, var, value):
		lines = ""
		found = False
		try:
			f = open(file, "r")
		except:
			f = open(file, "w")
			f.close()
			f = open(file, "r")
	
		for line in f:
			if re.match("^"+var, line):
				lines += var + " = " + '"' + value + '"\n'
				found = True
			else:
				lines += line
			
		if not found:
			lines += var + " = " + '"' + value + '"\n'		
		
			
		f.close()
		f = open(file, "w")
		f.write(lines)
		f.close()
	
	def getvar(file, var):

		try:
			f = open(file, "r")
		except:
			return
	
		for line in f:
			if re.match("^"+var, line):
				return line.split("=")[1].strip().strip("\"")
	
		f.close()
	
	APPNAME = "blueman"
	VERSION = getvar("../src/blueman/constants.py", "VERSION")
	DISTRO = "unstable"
	
	

	def verify_existing_changelog():
		global APPNAME, VERSION, DISTRO, revision, existing_chlog
	
		f = open("changelog", "r")
		existing_chlog = f.read()
		f.close()

		if re.search("%s-%s" % (VERSION, revision.strip()), existing_chlog):
			print "This revision is already in the changelog"
			exit(0)

		
	def load_settings():
		global maintainer, maintainer_email
		try:
			f = open("maintainer", "r")
			maintainer = f.readline()
			maintainer_email = f.readline()
			f.close()
		
		except:
			f = open("maintainer", "w")
			f.write("\n")
			maintainer = ""
			maintainer_email = ""
			f.close()
		
		maintainer = maintainer.replace("\n","")
		maintainer_email = maintainer_email.replace("\n","")
		
	def save_settings():
		global maintainer, maintainer_email
		f = open("maintainer", "w")
		f.write(maintainer+"\n"+maintainer_email)
		f.close()
		
	load_settings()


	def say(color, text, line=1):
		if line:
			print codes[color] + text + codes["reset"]
		else:
			sys.stdout.write(codes[color] + text + codes["reset"])
		
	
	def get_desc():	
		global desc		
	
		desc = ""
		say("green", "Please enter a changelog description:")
		sys.stdout.write("Empty line to finish, ")
		say("yellow", "* is added automatically, - seperates entries with *")
	
		while(1):
			line = sys.stdin.readline()
			if len(line) == 1:
				if len(desc) == 0:
					say("red", "Nothing entered")
					get_desc()
					return
				else:
					verify_desc()
					return
			else:
				if len(desc) > 0:
					if line[0] == "-":
						desc += "  * "
					else:
						if desc[len(desc)-2] == "*":
							desc += line
						else:
							desc += "    " +line
				else:
					desc += "  * "+line

	def verify_desc():
		global desc
		say("yellow", "Changelog Description")
		say("green", "--------------------")
		sys.stdout.write(desc)
		say("green", "--------------------")
		say("yellow", "Change? [y,n]:",0)
		if not get_confirmation():
		
			return
		else:
			get_desc()

	def get_confirmation():

		line = sys.stdin.readline()
		if line[0] == "y":
			return True
		elif line[0] == "n":
			return False
		else:
			return get_confirmation()
	
	def ask(q):
		say("green", q)
		return sys.stdin.readline().replace("\n","")


	def append_changelog_entry():
		global desc, chlog_entry, existing_chlog
	

	
		f = open("changelog", "w")
		f.write(chlog_entry+"\n\n")
		f.write(existing_chlog)
		f.close()
	




	def verify_chlog():
		global chlog_entry, APPNAME,VERSION,revision,DISTRO,desc,maintainer,maintainer_email
	
		chlog_entry = """%(appname)s (%(version)s%(revision_suffix)s) %(distro)s; urgency=low
	  
%(changelog)s
 -- %(maintainer)s <%(maint_email)s>  %(date)s""" % {"appname": APPNAME,
		 						    "version": VERSION,
		 						    "revision_suffix": "-"+revision.strip(),
		 						    "distro": DISTRO,
		 						    "changelog": desc,
		 						    "maintainer": maintainer,
		 						    "maint_email": maintainer_email,
		 						    "date": strftime("%a, %d %b %Y %H:%M:%S +0000", gmtime())}
		 
		say("green", "--------------------")
		say("turquoise", chlog_entry)
		say("green", "--------------------")
	
		say("yellow", "Is this OK? [y,n]")
		if get_confirmation():
			append_changelog_entry()
		else:
			while(1):
				say("yellow", "Change:")
				say("turquoise", "[0] ", 0)	 
				print "Changelog"
			
				say("turquoise", "[1] ", 0)	
				print "Maintainer's name"
			
				say("turquoise", "[2] ", 0)
				print "Maintainer's email"
			
				line = sys.stdin.readline()
				if line[0] == "0":
					get_desc()
					verify_chlog()
					return
				elif line[0] == "1":
					maintainer = ask("Maintainer's Name eg. John Doe:")
					save_settings()	
					verify_chlog()
					return
				elif line[0] == "2":
					maintainer_email = ask("Maintainer's email address eg. john@mail.com:")
					save_settings()
					verify_chlog()
					return


	if os.path.exists("../.svn"):
		os.system("cd .. && svn up")
		pipe = subprocess.Popen('cd .. && svn log -r HEAD', shell=True, stdout=subprocess.PIPE).stdout
	
		r1 = re.compile("^-*$")
		r2 = re.compile("^(.*\|)")
	
		desc = ""

		for line in pipe:
			if not r1.match(line):
				if r2.match(line):
					info = line.split("|")
					revision = info[0].strip()
					setvar("../src/blueman/constants.py", "SVN_REVISION", revision)
					dev = info[1]
					data = info[2]
					verify_existing_changelog()
				else:
			
					if len(desc) > 0:
						desc += "    " +line
					else:
						desc += "  * "+line
	
	
	
		if len(desc) == 0:		
			get_desc()
		else:
			verify_desc()

		if len(maintainer) == 0:
			maintainer = ask("Maintainer's Name eg. John Doe:")
			save_settings()
		if len(maintainer_email) == 0:
			maintainer_email = ask("Maintainer's email address eg. john@mail.com:")
			save_settings()
		
		verify_chlog()
		
except KeyboardInterrupt:
	print "exiting"
	exit(1)
	

		

	


