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

from waflib import Task, Options, Logs
import shutil, os, os.path 

def options(opt):
    pass

def configure(conf):
    LD = conf.find_program('ld')

def need_rebuild(bld, sources):
    need_run = False
    for f in sources:
        if not os.path.isfile('%s/src/LV2/xputty/resources/%s.o' % (bld.out_dir, os.path.splitext(f.name)[0])):
            need_run = True
    return need_run

def img2h(task):
    src = " ".join(["'%s_png'" % os.path.splitext(v.name)[0] for v in task.inputs[0:]])
    cmd = ("rm -f ../src/LV2/xputty/resources/xresources.h && \
    for f in %s; do echo 'EXTLD('$f')' >> ../src/LV2/xputty/resources/xresources.h; done" % src)
    # win32: dont use cmd.exe as shell
    if task.env['OS'] == 'win32':
        cmd = 'bash -c "%s"' % cmd
    ret = task.exec_command(cmd, shell=True)
    return ret

def copyimg(task):
    task.no_errcheck_out = True
    img2h(task)
    before = ['xcairo']
    src = " ".join(["'%s'" % v.bldpath() for v in task.inputs[0:]])
    cmd = (" cp %s src/LV2/xputty/resources/ " % src )
    ret = task.exec_command(cmd, shell=True)
    return ret

def img2obj(task):
    import os
    import platform

    env = task.env
    task.no_errcheck_out = True
    copyimg(task)

    if env['OS'] == 'darwin':
        # Determine compiler (clang)
        if isinstance(env['CC'], list) and len(env['CC']) > 0:
            clang = env['CC'][0]
        elif isinstance(env['CC'], str):
            clang = env['CC']
        else:
            clang = 'clang'  # default fallback

        # Get list of source file basenames (without extension)
        src_files = [os.path.splitext(v.name)[0] for v in task.inputs[0:]]
        src_list = " ".join(src_files)

        # Compose shell command for macOS: generate .c from .png using xxd, then compile to .o
        cmd = (
            "cd src/LV2/xputty/resources/ && "
            "for f in {src}; do "
            "xxd -i ${{f}}.png > ${{f}}_png.c && "
            "{clang} -c ${{f}}_png.c -o ${{f}}.o; "
            "done"
        ).format(src=src_list, clang=clang)

        return task.exec_command(cmd, shell=True)
       
    else:
        before = ['xcairo']
        src = " ".join(["'%s'" % os.path.splitext(v.name)[0] for v in task.inputs])
        ld_cmd = env.LD[0]
        noexecstack = env['OS_RESOURCES_LDFLAGS']

        if env['OS'] == 'win32':
            ld_cmd = ld_cmd.replace('\\','/')

        cmd = ("cd src/LV2/xputty/resources/ \
        && for f in %s; do\
         %s -r -b binary %s ${f}.png -o  ${f}.o; \
         done " % (src, ld_cmd, noexecstack))

        if env['OS'] == 'win32':
            cmd = 'bash -c "%s"' % cmd

    return task.exec_command(cmd, shell=True)

def build(bld):
    if not (bld.env.LV2GUI):
        return None
    resources = bld.path.ant_glob('*.png')

    if not (need_rebuild(bld, resources)):
        return None

    targ = (''.join([' %s.o'% os.path.splitext(v.name)[0] for v in resources]))
    re_sources = targ.split()

    res = bld(name = 'resources',
        rule = img2obj,
        source = resources,
        target = re_sources
        )
    res.install_path = None
    bld.add_group()
