#!/usr/bin/env python

import os
import shutil
import subprocess
import sys
from setuptools import setup
from distutils.command.clean import clean as _clean
from distutils.command.build_py import build_py_2to3 as _build_py

# @brief Creates Protobuf python files to encode and decode messages
# @param[in] source The protobuf source file
def generateProtobuf(source):
    output = source.replace('.proto', '_pb2.py').replace('src/protobuf/', '')

    if (not os.path.exists(output) or (os.path.exists(source) and os.path.getmtime(source) > os.path.getmtime(output))):
        print('Generating %s...' % output)

        if not os.path.exists(source):
            sys.stderr.write('Cannot find %s' % source)
            sys.exit(-1)

        if not os.path.exists('external/bin/protoc.exe'):
            sys.stderr.write('Cannot find proto-compiler')
            sys.exit(-1)

        command = [ 'external/bin/protoc.exe', '-Isrc/protobuf/', '-I.', '--python_out=.', source]
        if 0 != subprocess.call(command):
            sys.exit(-1)

# @brief Cleans up all auto-generated files and folders
# @param[in] _clean Instance of setuptools to clean up the system
class clean(_clean):
    def run(self):
        for (dirpath, dirnames, filenames) in os.walk('.'):
            for filename in filenames:
                filepath = os.path.join(dirpath, filename)
                if filepath.endswith('_pb2.py') or filepath.endswith('.pyc'):
                    os.remove(filepath)
            for dirname in dirnames:
                if 'Arrival_MANager.egg-info' == dirname or 'build' == dirname:
                    shutil.rmtree(os.path.join(dirpath, dirname))
        _clean.run(self)

# @brief Generates the python files and folders to set up the development/runtime environment
# @param[in] _build_py Instance of setuptools to build the system
class build_py(_build_py):
    def run(self):
        generateProtobuf('src/protobuf/Aircraft.proto')
        generateProtobuf('src/protobuf/AircraftReport.proto')
        generateProtobuf('src/protobuf/AircraftSchedule.proto')
        generateProtobuf('src/protobuf/BaseTypes.proto')
        _build_py.run(self)

setup(
    name='Arrival MANager',
    version='0.1.0',
    packages=[ 'aman' ],
    namespace_packages=[ 'aman' ],
    description='AMAN optimization backend',
    author='Sven Czarnian',
    author_email='devel@svcz.de',
    license='GPLv3',
    cmdclass = { 'clean': clean, 'build_py': build_py },
    install_requires=[
        'setuptools',
        'pyzmq',
        'protobuf'
    ]
)
