#!/usr/bin/python3
import os
import sys
import re
import fileinput
import tempfile
import argparse
import subprocess

ver_major = 0
ver_minor = 0
ver_bldno = 0
ver_build = ""

def get_int(l):
	m = re.search(r'=([0-9]*)', l)
	if m:
		return int(m.group(1))
	return 0

def get_ver(name, v):
	global ver_major, ver_minor, ver_bldno, ver_build

	try:
		f = open(name)
	except IOError as e:
		print ("%s:missing version file" % (name))
		exit(1)
	for l in f:
		if "VER_MAJOR" in l:
			ver_major = get_int(l)
		if "VER_MINOR" in l:
			ver_minor = get_int(l)
		if "VER_BLDNO" in l:
			ver_bldno = get_int(l)
		if "VER_BUILD" in l:
			m = re.search(r'=(.*)', l)
			if m:
				ver_build = m.group(1)
		str = subprocess.run(["git", "log", "--oneline"], capture_output=True, text=True)
		#print ("git:%s" % (str))
		ver_bldno = str.stdout.count('\n')

	f.close()
	if v:
		if v == "+":
			ver_minor = ver_minor + 1
		else:
			m = re.match(r'([0-9]*)\.([0-9]*)', v)
			ver_major = int(m.group(1))
			ver_minor = int(m.group(2))
	return

def ch_str(key, value, line, w):
	if key in line:
		reg = r"(.*" + re.escape(key) + r")"
		m = re.match(reg, line)
		if m:
			w.write(bytes(m.group(1) + " = " + value + ";\n", 'utf-8'))
			return 1
	return 0

def set_ver(name, vfile):
	global ver_major, ver_minor, ver_bldno

	try:
		f = open(name)
	except IOError as e:
		print ("%s:can't open" % (name))
		exit(1)

	try:
		w = tempfile.NamedTemporaryFile(delete=False)
	except IOError as e:
		print ("%s:can't create temp file" % (tmp_file))
		exit(1)
	for l in f:
		if ch_str("MARKETING_VERSION", "%d.%d" % (ver_major, ver_minor), l, w):
			continue
		if ch_str("CURRENT_PROJECT_VERSION", "%d" % (ver_bldno), l, w):
			continue
		w.write(bytes(l, 'utf=8'));
	w.close()
	f.close()
	os.system("cp %s %s" % (w.name, name))
	os.system("rm -f %s" % (w.name))

	try:
		f = open(vfile, "w")
	except IOError as e:
		print ("%s:can't write" % (name))
		exit(1)
	f.write("struct Version\n")
	f.write("{\n")
	f.write("static let VER_MAJOR=%d\n" % (ver_major))
	f.write("static let VER_MINOR=%d\n" % (ver_minor))
	f.write("static let VER_BLDNO=%d\n" % (ver_bldno))
	f.write("static let VER_BUILD=%s\n" % (ver_build))
	f.write("}\n")
	f.close()

	return

def get_args():
	parser = argparse.ArgumentParser()
	parser.add_argument("-V", "--V_file",
			    default="Version.swift",
			    help = "version file, will be modified")
	parser.add_argument("version",
			    nargs='?',
			    help = "new version number, + to increment")
	parser.add_argument("p_file",
			    nargs='?',
			    default="../Sojourn.xcodeproj/project.pbxproj",
			    help = "project file, will be modified")
	return parser.parse_args()

args = get_args()
get_ver(args.V_file, args.version)
print ("major - %d, minor - %d, build - %d" % (ver_major, ver_minor, ver_bldno))
if args.version:
	set_ver(args.p_file, args.V_file)
