# -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-

from waflib import Logs, Utils, Task, TaskGen

top = '..'

def configure(conf):

    conf.find_program('ibtool', var='IBTOOL', mandatory=False)

    conf.check_cxx(framework_name='Foundation', uselib_store='FOUNDATION',
                   compile_filename='test.mm')
    conf.check_cxx(framework_name='AppKit',     uselib_store='APPKIT',
                   compile_filename='test.mm')
    conf.check_cxx(framework_name='Cocoa',      uselib_store='COCOA',
                   compile_filename='test.mm')

    conf.env.ARCH_OSX = 'x86_64'
    conf.env.CXXFLAGS_OSX += ['-fobjc-arc', '-mmacosx-version-min=10.7']
    conf.env.LINKFLAGS_OSX += ['-mmacosx-version-min=10.7']
    conf.env.MACOSX_DEPLOYMENT_TARGET = '10.7'

    conf.load('sparkle')

def build(bld):
    bld(
        target = "../NFD Control Center",
        features=['cxxprogram', 'cxx'],
        includes = ".. .",
        source = bld.path.ant_glob(['**/*.mm', 'MainMenu.xib']),

        mac_app = True,
        use = "OSX COCOA FOUNDATION APPKIT SPARKLE",

        mac_plist = 'Info.plist',
        mac_resources = [i.path_from(bld.path) for i in bld.path.ant_glob('Resources/**/*')],
        mac_frameworks = "Frameworks/Sparkle.framework",
        )

from waflib import TaskGen
@TaskGen.extension('.mm')
def m_hook(self, node):
    """Alias .mm files to be compiled the same as .cc files, gcc/clang will do the right thing."""
    return self.create_compiled_task('cxx', node)

@TaskGen.extension('.m')
def m_hook(self, node):
    """Alias .m files to be compiled the same as .c files, gcc/clang will do the right thing."""
    return self.create_compiled_task('c', node)


def bundle_name_for_output(name):
    return "%s.app" % name
    # k = name.rfind('.')
    # if k >= 0:
    #     name = name[:k] + '.app'
    # else:
    #     name = name + '.app'
    # return name

@TaskGen.extension('.xib')
def xib(self,node):
    out = node.change_ext('.nib')

    name = self.path.get_bld().find_or_declare(bundle_name_for_output(self.target))
    resources = name.find_or_declare(['Contents', 'Resources'])
    resources.mkdir()
    real_out = resources.make_node(out.name)

    self.create_task('xib', node, real_out)
    inst_to = getattr(self, 'install_path', '/Applications') + '/%s/Contents/Resources' % name
    self.bld.install_as(inst_to + '/%s' % real_out.name, real_out)

class xib(Task.Task):
    color='PINK'
    run_str = '${IBTOOL} --errors --warnings --notices --output-format human-readable-text --compile ${TGT} ${SRC}'
