#!/usr/bin/env python

# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.

import subprocess
import os
import re
from email.utils import formatdate


dirpath = os.path.join(os.path.dirname(os.path.realpath(__file__)),"..")

git_describe_version = subprocess.check_output(["git", "describe", "--tags", "--dirty", "--match", "v*"]).decode('utf-8').strip()

# v1.2
# v1.2.3
# v1.2.3-rc1
# v1.2.3-rc1-dirty
# v1.2.3-5-g4538abcd
# v1.2.3-5-g4538abcd-dirty
# git_describe_version = "v1.2.3"

m = re.match(r"^v([0-9]+)(\.[0-9]+)?(\.[0-9]+)?(-(.*)+)?$", git_describe_version)
version_major = m.group(1) if m.group(1) is not None else "0"
version_minor = m.group(2).replace(".", "") if m.group(2) is not None else "0"
version_patch = m.group(3).replace(".", "") if m.group(3) is not None else "0"
version_label = m.group(4) if m.group(4) is not None else ""
#print("major {} minor {} patch {} label {}".format(version_major, version_minor, version_patch, version_label))

debian_distribution = "unstable"
if version_label is not "":
    debian_distribution = "UNRELEASED"

debian_path = os.path.join(dirpath, "debian")
changelog_file = os.path.join(debian_path, "changelog")

# remove leading 'v'
changelog_version = git_describe_version[1:] if git_describe_version[0] == 'v' else git_describe_version

with open(changelog_file, 'r') as original: data = original.read()
with open(changelog_file, 'w') as modified:
    new_entry = """open62541 ({version}) {distribution}; urgency=medium

  * Full changelog is available here: https://github.com/open62541/open62541/blob/master/CHANGELOG

 -- open62541 Team <open62541-core@googlegroups.com>  {time}
""".format(version=changelog_version, time=formatdate(), distribution = debian_distribution)

    modified.write(new_entry + "\n" + data)

# Create control file and replace template variables
control_file_template = os.path.join(debian_path, "control-template")
control_file = os.path.join(debian_path, "control")
os.rename(control_file_template, control_file)

with open(control_file, 'r+') as f:
    content = f.read()
    f.seek(0)
    f.truncate()
    f.write(content.replace('<soname>', "{}".format(version_major)))


# rename the install template to match the soname
install_file_template = os.path.join(debian_path, "libopen62541.install-template")
install_file = os.path.join(debian_path, "libopen62541-{}.install".format(version_major))
os.rename(install_file_template, install_file)

install_file_template = os.path.join(debian_path, "libopen62541-dev.install-template")
install_file = os.path.join(debian_path, "libopen62541-{}-dev.install".format(version_major))
os.rename(install_file_template, install_file)


# Create rule file and replace template variables
rule_file_template = os.path.join(debian_path, "rules-template")
rule_file = os.path.join(debian_path, "rules")
os.rename(rule_file_template, rule_file)

with open(rule_file, 'r+') as f:
    content = f.read()
    f.seek(0)
    f.truncate()
    content = content.replace('<soname>', "{}".format(version_major))
    f.write(content)

# Update CMakeLists.txt to include full version string

with open(os.path.join(dirpath,"CMakeLists.txt"), 'r+') as f:
    lines = f.readlines()
    f.seek(0)
    f.truncate()
    for idx, line in enumerate(lines):
        if idx == 2:
            f.write('set(OPEN62541_VERSION "{}")\n'.format(git_describe_version))
        f.write(line)
