#! /usr/bin/env python
# encoding: utf-8
# mittorn, 2018

from waflib import Logs
import os

top = '.'

VGUI_SUPPORTED_OS = ['win32', 'darwin', 'linux']

def options(opt):
	grp = opt.add_option_group('VGUI options')
	grp.add_option('--vgui', action = 'store', dest = 'VGUI_DEV',
		help = 'path to vgui-dev repo(default: "vgui-dev")', default='' )

	grp.add_option('--disable-vgui', action = 'store_true', dest = 'NO_VGUI',
		help = 'disable vgui_support(default: enabled only on supported platforms)', default=False )

	grp.add_option('--skip-vgui-sanity-check', action = 'store_false', dest = 'VGUI_SANITY_CHECK',
		help = 'skip checking VGUI sanity', default=True )
	return

def configure(conf):
	conf.env.NO_VGUI = conf.options.NO_VGUI
	if conf.options.NO_VGUI:
		return

	conf.start_msg('Does this architecture support VGUI?')

	if conf.env.DEST_CPU != 'x86' and not (conf.env.DEST_CPU == 'x86_64' and not conf.options.ALLOW64):
		conf.end_msg('no')
		Logs.warn('vgui is not supported on this CPU: ' + str(conf.env.DEST_CPU))
		conf.env.NO_VGUI = True
		return
	else:
		conf.end_msg('yes')

	conf.start_msg('Does this OS support VGUI?')
	if conf.env.DEST_OS not in VGUI_SUPPORTED_OS:
		conf.end_msg('no')
		Logs.warn('vgui is not supported on this OS: ' + str(conf.env.DEST_OS))
		conf.env.NO_VGUI = True
		return
	else:
		conf.end_msg('yes')

	conf.start_msg('Does this toolchain able to link VGUI?')
	if conf.env.DEST_OS == 'win32' and conf.env.COMPILER_CXX == 'g++':
		conf.end_msg('no')
		# we have ABI incompatibility ONLY on MinGW
		Logs.warn('vgui_support can\'t be built with MinGW')
		conf.env.NO_VGUI = True
		return
	else:
		conf.end_msg('yes')

	if conf.env.NO_VGUI:
		return

	if conf.options.VGUI_DEV:
		conf.start_msg('Configuring VGUI by provided path')
		conf.env.VGUI_DEV = conf.options.VGUI_DEV
	else:
		conf.start_msg('Configuring VGUI by default path')
		conf.env.VGUI_DEV = 'vgui-dev'

	if conf.env.DEST_OS == 'win32':
		conf.env.LIB_VGUI = ['vgui']
		conf.env.LIBPATH_VGUI = [os.path.abspath(os.path.join(conf.env.VGUI_DEV, 'lib/win32_vc6/'))]
	else:
		libpath = os.path.abspath(os.path.join(conf.env.VGUI_DEV, 'lib'))
		if conf.env.DEST_OS == 'linux':
			conf.env.LIB_VGUI = [':vgui.so']
			conf.env.LIBPATH_VGUI = [libpath]
		elif conf.env.DEST_OS == 'darwin':
			conf.env.LDFLAGS_VGUI = [os.path.join(libpath, 'vgui.dylib')]
		else:
			conf.fatal('vgui is not supported on this OS: ' + conf.env.DEST_OS)
	conf.env.INCLUDES_VGUI = [os.path.abspath(os.path.join(conf.env.VGUI_DEV, 'include'))]

	conf.env.HAVE_VGUI = 1
	conf.end_msg('yes: {0}, {1}, {2}'.format(conf.env.LIB_VGUI, conf.env.LIBPATH_VGUI, conf.env.INCLUDES_VGUI))

	if conf.env.HAVE_VGUI and conf.options.VGUI_SANITY_CHECK:
		try:
			conf.check_cxx(
				fragment='''
				#include <VGUI.h>
				int main( int argc, char **argv )
				{
					return 0;
				}''',
				msg	= 'Checking for library VGUI sanity',
				use = 'VGUI',
				execute = False)
		except conf.errors.ConfigurationError:
			conf.fatal("Can't compile simple program. Check your path to vgui-dev repository.")

def build(bld):
	if bld.env.NO_VGUI:
		return

	libs = []

	# basic build: dedicated only, no dependencies
	if bld.env.DEST_OS != 'win32':
		libs += ['DL','M']

	libs.append('VGUI')

	source = bld.path.ant_glob(['*.cpp', 'miniutl/utlvector.cpp', 'miniutl/utlmemory.cpp'])

	includes = [ '.', 'miniutl/', '../common', '../engine' ]

	bld.shlib(
		source   = source,
		target   = 'vgui_support',
		features = 'cxx',
		includes = includes,
		use      = libs,
		install_path = bld.env.LIBDIR,
		subsystem = bld.env.MSVC_SUBSYSTEM
	)