# -*- coding: utf-8

import sys
import os
from zipfile import ZipFile, ZIP_DEFLATED


if sys.platform == 'win32':
    build_path = 'build/exe.win32-2.6'
else:
    build_path = "build/exe"


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" % (name, version)
    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()