#!/usr/bin/env python

import os
import sys
import subprocess

# resolve cython executable
cython = None

def resolve_cython():
    global cython
    for executable in ('cython', 'cython-2.7'):
        for path in os.environ['PATH'].split(':'):
            if not os.path.exists(path):
                continue
            if executable in os.listdir(path):
                cython = os.path.join(path, executable)
                return

def do(fn):
    print 'cythonize:', fn
    parts = fn.split('/')
    assert(parts[-1].endswith('.pyx'))
    if parts[0] == '.':
        parts.pop(0)
    modname = parts[-1][:-4]
    package = '_'.join(parts[:-1])

    # cythonize
    subprocess.Popen([cython, fn]).communicate()

    if not package:
        print 'no need to rewrite', fn
    else:
        # get the .c, and change the initXXX
        fn_c = fn[:-3] + 'c'
        with open(fn_c) as fd:
            data = fd.read()
        modname = modname.split('.')[-1]
        pat1 = 'init{}(void)'.format(modname)
        sub1 = 'init{}_{}(void)'.format(package, modname)
        pat2 = 'PyInit_{}(void)'.format(modname)
        sub2 = 'PyInit{}_{}(void)'.format(package, modname)
        pat3 = 'Pyx_NAMESTR("{}")'.format(modname)
        sub3 = 'Pyx_NAMESTR("{}_{}")'.format(package, modname)

        print '1: {} -> {}'.format(pat1, sub1)
        print '2: {} -> {}'.format(pat2, sub2)
        print '3: {} -> {}'.format(pat3, sub3)
        data = data.replace(pat1, sub1)
        data = data.replace(pat2, sub2)
        data = data.replace(pat3, sub3)

        print 'rewrite', fn_c
        with open(fn_c, 'w') as fd:
            fd.write(data)

if __name__ == '__main__':
    print '-- cythonize', sys.argv
    resolve_cython()
    for fn in sys.argv[1:]:
        do(fn)