#!/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__)

FORCE=""
#FORCE="--force"


def main(args):
    assert len(args) == 2 or len(args) == 3, args

    if len(args) == 3:
        r = args.pop(0)
        assert r == '--revert', r
        revert = 'old-'
    else:
        revert = ''

    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)
            print('  ', v, ov)

    print()
    print()
    assert os.path.exists(out_dir), out_dir
    git_clone_dir = os.path.join(out_dir, "skywater-pdk")
    assert os.path.exists(git_clone_dir), git_clone_dir

    # Check everything first
    for l in libraries.keys():
        git_out_dir = os.path.join(git_clone_dir, l)
        assert os.path.exists(git_out_dir), git_out_dir
        assert os.path.exists(os.path.join(git_out_dir, ".git")), "Git directory was not created in:"+git_out_dir

    for l in libraries.keys():
        git_out_dir = os.path.join(git_clone_dir, l)
        assert os.path.exists(git_out_dir), git_out_dir
        print()
        print()
        print('Doing push for', l)
        print('='*75, flush=True)
        versions = lib_versions[l]
        for i, v in enumerate(versions):
            pv = previous_v(v, versions)
            ov = out_v(v, versions)

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

            print("Pushing", v_branch)
            git('push origin {f} {1}{0}:{0}'.format(v_branch, revert, f=FORCE), git_out_dir)
            git('push origin --force {0}'.format(v_tag), git_out_dir)

        git('push origin {f} {1}{0}:{0}'.format(v_branch, revert, f=FORCE), git_out_dir)
        git('push origin {f} master'.format(f=FORCE), git_out_dir)
        print('='*75, flush=True)



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