#!/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):
    if '--revert' in args:
        args.remove('--revert')
        revert = 'old-'
    else:
        revert = ''

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

    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
    skip = set()
    for l in libraries.keys():
        git_out_dir = os.path.join(git_clone_dir, l)
        if not os.path.exists(git_out_dir):
            skip.add(l)
            continue
        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():
        if l in skip:
            continue
        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)
        tags = subprocess.check_output('git tag -l', shell=True, cwd=git_out_dir)
        tags = tags.decode('utf-8')
        versions = [tuple(int(i) for i in v[1:].split('.')) for v in tags.split()]
        for i, v in enumerate(versions):
            if v == (0,0,0):
                continue
            v_branch = "branch-{}.{}.{}".format(*v)
            v_tag = "v{}.{}.{}".format(*v)

            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:]))
