# -*- coding: utf-8

import sys
import os
from zipfile import ZipFile, ZIP_DEFLATED
import distutils.util


def get_build_path():
    os_name = distutils.util.get_platform()
    version = sys.version_info
    if isinstance(version, tuple):
        os_ver = '%d.%d' % (version[0], version[1])
    else:
        os_ver = '%d.%d' % (version.major, version.minor)
    return os.path.join('build', 'exe.%s-%s' % (os_name, os_ver))


build_path = get_build_path()


def _make_zip_file(args, dirname, names):
    zip, build_dir, dist_version_name = args
    # print "build dir : %s, %s" % (build_dir, dirname)
    for file_name in names:
        full_name = os.path.join(dirname, file_name)
        if build_dir == dirname:
            arcname = os.path.join(dist_version_name, file_name)
        else:
            d = dirname[len(build_dir) + 1:]
            temp = os.path.join(dist_version_name, d)
            arcname = os.path.join(temp, file_name)
        zip.write(full_name, arcname)
        print "zip file %s to %s" % (full_name, arcname)


def make_dist(name, version, dist_dir='dist'):

    dist_version_name = "%s-%s-%s" % (name, version, distutils.util.get_platform())
    dist_name = os.path.join(dist_dir, dist_version_name + '.zip')
    print "Make zip file ...[%s]" % os.path.relpath(dist_name)
    zip_file_name = os.path.basename(dist_name)
    zip_file_name = os.path.join(dist_dir, zip_file_name)
    if not os.path.exists(dist_dir):
        os.mkdir(dist_dir)
    zip = ZipFile(zip_file_name, 'w', ZIP_DEFLATED)
    build_dir = os.path.realpath(build_path)
    os.path.walk(build_dir, _make_zip_file, (zip, build_dir, dist_version_name))
    zip.close()
