#!/usr/bin/env python2

import urllib
import hashlib
import sys
import os
from optparse import OptionParser


class AppURLopener(urllib.FancyURLopener):
    version = "Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-US; rv:1.8.0.7) Gecko/20060909 Firefox/1.5.0.7"

    def prompt_user_passwd(self, host, realm):
        raise Exception()


urllib._urlopener = AppURLopener()


def file_md5(file):
    m = hashlib.md5()
    m.update(open(file).read())
    return m.hexdigest()


def main():
    parser = OptionParser(
        usage="usage: %prog URI dest [md5sum]",
        prog=sys.argv[0])
    options, args = parser.parse_args()
    md5sum = None

    if len(args) == 2:
        uri, dest = args
    elif len(args) == 3:
        uri, dest, md5 = args
    else:
        parser.error("Wrong arguments")

    fresh = False
    if not os.path.exists(dest):
        print("Downloading from %s to %s..." % (uri, dest),)
        sys.stdout.flush()
        urllib.urlretrieve(uri, dest)
        print("done")
        fresh = True

    if md5sum:
        print("Computing md5sum on downloaded file",)
        sys.stdout.flush()
        checksum = file_md5(dest)
        print("done")

        if checksum != md5sum:
            if not fresh:
                print("Checksum mismatch (%s != %s), re-downloading file %s" % (checksum, md5sum, dest),)
                sys.stdout.flush()
                os.remove(dest)
                urllib.urlretrieve(uri, dest)
                print("done")

                print("Computing md5sum on downloaded file",)
                sys.stdout.flush()
                checksum = file_md5(dest)
                print("done")

                if checksum != md5sum:
                    print("ERROR, checksum mismatch (%s != %s) on %d", (checksum, md5sum, dest))
                    return 1
    return 0


if __name__ == '__main__':
    try:
        sys.exit(main())
    except Exception as e:
        print("ERROR, ", e)
        sys.exit(1)
