import urllib.request
from os import listdir, makedirs
from os.path import isdir, isfile, join, exists, dirname


def download_file(url, archive_filename):
    def progress(blocknum, bs, size):
        total_sz_mb = '%.2f MB' % (size / 1e6)
        current_sz_mb = '%.2f MB' % ((blocknum * bs) / 1e6)
        print('\rdownloaded %s / %s' % (current_sz_mb, total_sz_mb), end='')
    print("Downloading %s" % url)
    urllib.request.urlretrieve(url, filename=archive_filename, reporthook=progress)
    print("")


def download_file_if_not_exists(url, archive_path):
    if exists(archive_path): return
    create_if_not_exist(dirname(archive_path))
    download_file(url,archive_path)


def ls(dir, typecheck):
    el = [f for f in listdir(dir) if typecheck(join(dir, f))]
    el.sort()
    return el


def list_dirs(dir):
    return ls(dir, typecheck=isdir)


def list_files(dir):
    return ls(dir, typecheck=isfile)


def create_if_not_exist(path):
    if not exists(path): makedirs(path)