#!/usr/bin/env python
import optparse
import os
import pprint
import re
import shlex
import subprocess
import sys

root_dir = os.path.dirname(__file__)

# parse our options
parser = optparse.OptionParser()

parser.add_option("--debug",
    action="store_true",
    dest="debug",
    help="Also build debug build")

parser.add_option("--node",
    action="store",
    dest="node",
    help="Name of the node executable (defaults to node)")

parser.add_option("--pkg-config-root",
    action="store",
    dest="pkgconfig_root",
    help="Path to pkg-config directory")

parser.add_option("--boost",
    action="store",
    dest="boost_root",
    help="Path to boost (defaults to /usr/local)")

(options, args) = parser.parse_args()

def pkg_config(pkg, pkgconfig_root):
  env = os.environ.copy()
  if pkgconfig_root:
    env["PKG_CONFIG_PATH"] = pkgconfig_root
  env["PKG_CONFIG_ALLOW_SYSTEM_CFLAGS"] = "1"
  env["PKG_CONFIG_ALLOW_SYSTEM_LIBS"] = "1"
  cmd = subprocess.Popen(['pkg-config', '--static', '--libs', pkg], stdout=subprocess.PIPE, env=env)
  libs, ret = cmd.communicate()
  if (ret): return None

  cmd = subprocess.Popen(['pkg-config', '--static', '--cflags', pkg], stdout=subprocess.PIPE, env=env)
  cflags, ret = cmd.communicate()
  if (ret): return None

  return (libs, cflags)

def configure_llmr(o):
  if options.boost_root:
      o['variables']['boost_root'] = options.boost_root
  else:
      o['variables']['boost_root'] = '/usr/local'
  if options.node:
      o['variables']['node'] = options.node
  else:
      o['variables']['node'] = 'node'
  o['target_defaults']['default_configuration'] = 'Debug' if options.debug else 'Release'


def fix_frameworks(libs):
  # don't split "-framework Foo"
  return re.split('(?<!-framework)\s+', libs.strip())

def configure_glfw3(o):
  ret = pkg_config('glfw3', options.pkgconfig_root)
  if not ret:
      sys.stderr.write('could not find glfw3 with pkg-config')
      sys.exit(-1)
  o['variables']['glfw3_libraries'] = fix_frameworks(ret[0])
  o['variables']['glfw3_cflags'] = ret[1].split()

def configure_uv(o):
  ret = pkg_config('libuv', options.pkgconfig_root)
  if not ret:
      sys.stderr.write('could not find uv with pkg-config')
      sys.exit(-1)
  o['variables']['uv_libraries'] = ret[0].split()
  o['variables']['uv_cflags'] = ret[1].split()

def configure_png(o):
  ret = pkg_config('libpng', options.pkgconfig_root)
  if not ret:
      sys.stderr.write('could not find png with pkg-config')
      sys.exit(-1)
  o['variables']['png_libraries'] = ret[0].split()
  o['variables']['png_cflags'] = ret[1].split()

def configure_curl(o):
  ret = pkg_config('libcurl', options.pkgconfig_root)
  if not ret:
      sys.stderr.write('could not find curl with pkg-config')
      sys.exit(-1)
  o['variables']['curl_libraries'] = ret[0].split()
  o['variables']['curl_cflags'] = ret[1].split()

def write(filename, data):
  filename = os.path.join(root_dir, filename)
  print "creating ", filename
  f = open(filename, 'w+')
  f.write(data)

output = {
  'variables': { 'python': sys.executable },
  'target_defaults' : {
    'include_dirs': [],
    'libraries': [],
    'defines': [],
    'cflags': []
  }
}

if __name__ == '__main__':
  configure_llmr(output)
  configure_glfw3(output)
  configure_uv(output)
  configure_png(output)
  configure_curl(output)
  pprint.pprint(output, indent=2)

  write('config.gypi', "# Do not edit. Generated by the configure script.\n" +
    pprint.pformat(output, indent=2) + "\n")

  config = {
    'BUILDTYPE': 'Debug' if options.debug else 'Release',
    'PYTHON': sys.executable,
  }
  config = '\n'.join(map('='.join, config.iteritems())) + '\n'

  write('config.mk',
        '# Do not edit. Generated by the configure script.\n' + config)
