#!/usr/bin/env python3

import datetime
import os
import pprint
import shutil
import subprocess
import sys
import tempfile
import time

from library_submodules import *


__dir__ = os.path.dirname(__file__)

author = "Tim 'mithro' Ansell <tansell@google.com>"


def lib_src(src_lib_dir, l, v):
    return os.path.join(src_lib_dir, l, 'v{}.{}.{}'.format(*v))


def header(l, s, *args, **kw):
    s1 = s.format(*args, **kw)
    s2 = l*len(s1)
    return '{}\n{}\n'.format(s1, s2)


message_template = """\
Small updates to svg outputs.
"""


def main(args):
    assert len(args) == 2

    src_dir = os.path.abspath(args.pop(0))
    out_dir = os.path.abspath(args.pop(0))

    assert os.path.exists(src_dir), src_dir
    src_lib_dir = os.path.join(src_dir, "skywater-pdk", "libraries")
    assert os.path.exists(src_lib_dir), src_lib_dir

    lib_versions = {}
    for l in libraries.keys():
        lib_dir = os.path.join(src_lib_dir, l)
        assert os.path.exists(lib_dir), lib_dir
        versions = [tuple(int(x) for x in v[1:].split('.')) for v in os.listdir(lib_dir) if v.startswith('v')]
        versions.sort()
        lib_versions[l] = tuple(versions)
        print(l, versions)
        for v in versions:
            ov = out_v(v, versions)
            libv_dir = lib_src(src_lib_dir, l, v)
            assert os.path.exists(libv_dir), libv_dir
            print('  ', v, ov, libv_dir)

    print()
    print()
    assert os.path.exists(out_dir), out_dir
    git_clone_dir = os.path.join(out_dir, "skywater-pdk")
    if os.path.exists(git_clone_dir):
        print("Removing old directory.")
        print('='*75, flush=True)
        run('rm -rf {}'.format(git_clone_dir))
        print('='*75, flush=True)

    os.makedirs(git_clone_dir)

    for l in libraries.keys():
        git_out_dir = os.path.join(git_clone_dir, l)
        assert not os.path.exists(git_out_dir), git_out_dir
        print()
        print()
        print('Doing update on', l)
        print('='*75, flush=True)
        print()
        print('Cloning initial repo')
        print('-'*20, flush=True)
        git_reference = os.path.abspath(os.path.expanduser('~/gob/foss-eda-tools/skywater-pdk-libs-{0}/.git'.format(l)))
        assert os.path.exists(git_reference), git_reference
        git('clone --reference {1} https://foss-eda-tools.googlesource.com/skywater-pdk/libs/{0}.git'.format(l, git_reference), git_clone_dir)
        assert os.path.exists(os.path.join(git_out_dir, ".git")), "Git directory was not created in:"+git_out_dir
        git('fetch origin', git_out_dir)
        git('fetch origin --tags', git_out_dir)
        print('-'*20, flush=True)
        versions = lib_versions[l]
        for i, v in enumerate(versions):
            src_dir = lib_src(src_lib_dir, l, v)+'/'
            assert os.path.exists(src_dir), src_dir

            pv = previous_v(v, versions)
            ov = out_v(v, versions)

            v_branch = "branch-{}.{}.{}".format(*ov)
            v_tag = "v{}.{}.{}".format(*ov)

            print()
            print("Was:", pv, "Now creating", (v_branch, v_tag), "in", git_out_dir, "from", src_dir)
            print('-'*20, flush=True)

            # Get us back to a very clean tree.
            git('reset --hard HEAD', git_out_dir)
            git('clean -f', git_out_dir)
            git('clean -x -f', git_out_dir)

            # Checkout the right branch
            git('checkout {}'.format(v_branch), git_out_dir)
            git('branch old-{0} {0}'.format(v_branch), git_out_dir)

            diff_pos = 'branch-{}.{}.{}'.format(*pv)
            if pv != (0, 0, 0):
                git('merge {} --no-ff --no-commit --strategy=ours'.format(diff_pos), git_out_dir)
            else:
                diff_pos = 'HEAD'

            # Update the contents
            run('rm -rf {}/*'.format(git_out_dir))
            run(f'cp -arT {src_dir} {git_out_dir}/')
            if not os.path.exists(os.path.join(git_out_dir, "LICENSE")):
                git('checkout HEAD LICENSE', git_out_dir)
            if not os.path.exists(os.path.join(git_out_dir, "README.rst")):
                git('checkout HEAD README.rst', git_out_dir)
            git('add -A', git_out_dir)

            # Report if anything has changed.
            git('status', git_out_dir)
            git('diff {} --stat'.format(diff_pos), git_out_dir)
            diff_out = os.path.abspath(os.path.join(git_clone_dir, '{}-v{}.{}.{}_to_{}.patch'.format(l, *pv, v_tag)))
            git('diff {} > {} '.format(diff_pos, diff_out), git_out_dir)

            diff_changes = os.path.abspath(os.path.join(git_clone_dir, '{}-{}-changes.patch'.format(l, v_tag)))
            git('diff HEAD > {} '.format(diff_changes), git_out_dir)
            with tempfile.NamedTemporaryFile('w') as f:
                f.write(message_template.format(library=l, version=v_tag[1:]))
                f.flush()
                git("commit --signoff --allow-empty --file={}".format(f.name), git_out_dir)

        git('branch -D master', git_out_dir)
        git('branch master', git_out_dir)

        print('='*75, flush=True)



if __name__ == "__main__":
    sys.exit(main(sys.argv[1:]))
