#!/usr/bin/env python
# -*- coding: utf-8 -*-
import shutil
import sys
import tarfile
import tempfile
from sh import wget
import os
import yaml

FILE_PATH = os.path.dirname(os.path.realpath(__file__))


def read_yaml(path):
    with open(path, 'rt') as f:
        data = yaml.safe_load(f)
    return data


def write_yaml(path, data):
    with open(path, 'wt') as f:
        yaml.safe_dump(data, f, default_flow_style=False)


def extract_github_tar_gz(data):
    for entry in data:
        if 'tar' not in entry:
            continue
        tar = entry['tar']
        if 'github.com' not in tar['uri'] or not tar['uri'].endswith('.tar.gz'):
            continue
        version = tar['uri'][tar['uri'].rindex('/') + 1: -len('.tar.gz')]
        if not tar['version'].endswith(version):
            continue
        yield tar, version


def download_file(url, path):
    wget(
        '--progress=dot:meg', '-O', path, url, _out=sys.stdout, _err=sys.stderr
    )


def check_tar_gz_version(path, version):
    with tarfile.open(path, 'r:gz') as f:
        name = f.getmembers()[0].name
    return name.endswith(version)


def github_bug_workaround(rosinstall, rosinstall_out):
    tmp_dir = tempfile.mkdtemp()
    data = read_yaml(rosinstall)
    for entry, version in extract_github_tar_gz(data):
        file_name = os.path.join(tmp_dir, 'tmp.tar.gz')
        download_file(entry['uri'], file_name)
        has_version = check_tar_gz_version(file_name, version)
        os.remove(file_name)
        if not has_version:
            entry['version'] = entry['version'][: -(len(version) + 1)]

    write_yaml(rosinstall_out, data)

    shutil.rmtree(tmp_dir)


if __name__ == '__main__':
    rosinstall_out = os.path.join(FILE_PATH, 'docker', 'kinetic.rosinstall')
    rosinstall = rosinstall_out + '.vanilla'
    github_bug_workaround(rosinstall, rosinstall_out)