#!/usr/local/bin/python3.13

import samba_utils

def generate_winexesvc_c_from_exe(t):
    '''generate a C source file with the contents of the given binary'''
    src = t.inputs[0].bldpath(t.env)
    tgt = t.outputs[0].bldpath(t.env)
    fn = t.env.SAMBA_GENERATOR_VARS['WINEXE_FN']

    try:
        with open(src, 'rb') as f:
            src_blob = f.read()
            f.close()
    except:
        print('Failed to read %s to convert to C array' % (src))
        return -1

    def c_array(src):
        result = []
        for i in range(0, len(src), 8):
            l = src[i:i+8]
            h = ' '.join(["0x%02X," % x for x in l])
            result.append(h)
        return "\n\t\t".join(result)

    src_array = c_array(src_blob)
    if len(src_array) <= 0:
        print('Failed to convert %s to C array' % (src))
        return -1

    contents = '''
#include "replace.h"
#include "lib/util/data_blob.h"

const DATA_BLOB *%s(void);
const DATA_BLOB *%s(void)
{
\tstatic const uint8_t array[] = {
\t\t%s
\t};
\tstatic const DATA_BLOB blob = {
\t\t.data = discard_const_p(uint8_t, array),
\t\t.length = ARRAY_SIZE(array),
\t};
\treturn &blob;
}
''' % (fn, fn, src_array)

    if not samba_utils.save_file(tgt, contents):
        print('Failed to write C source file %s' % (tgt))
        return -1
    return 0

winexesvc_binaries = ''

bld.SAMBA_GENERATOR(
    'winexesvc32_exe',
    source='winexesvc.c',
    target='winexesvc32.exe',
    rule='SOURCE_DATE_EPOCH=${SOURCE_DATE_EPOCH} ${WINEXE_CC_WIN32} ${SRC} -o ${TGT} ${WINEXE_LDFLAGS}',
    enabled=bld.env.build_winexe and bld.env.WINEXE_CC_WIN32)

vars = {"WINEXE_FN": "winexesvc32_exe_binary"}
bld.SAMBA_GENERATOR(
    'winexesvc32_exe_binary',
    source='winexesvc32.exe',
    target='winexesvc32_exe_binary.c',
    group='build_source',
    vars=vars,
    rule=generate_winexesvc_c_from_exe,
    enabled=bld.env.build_winexe and bld.env.WINEXE_CC_WIN32)

if bld.env.WINEXE_CC_WIN32:
    winexesvc_binaries += ' winexesvc32_exe_binary.c'

bld.SAMBA_GENERATOR(
    'winexesvc64_exe',
    source='winexesvc.c',
    target='winexesvc64.exe',
    rule='SOURCE_DATE_EPOCH=${SOURCE_DATE_EPOCH} ${WINEXE_CC_WIN64} ${SRC} -o ${TGT} ${WINEXE_LDFLAGS}',
    enabled=bld.env.build_winexe and bld.env.WINEXE_CC_WIN64)

vars = {"WINEXE_FN": "winexesvc64_exe_binary"}
bld.SAMBA_GENERATOR(
    'winexesvc64_exe_binary',
    source='winexesvc64.exe',
    target='winexesvc64_exe_binary.c',
    group='build_source',
    vars=vars,
    rule=generate_winexesvc_c_from_exe,
    enabled=bld.env.build_winexe and bld.env.WINEXE_CC_WIN64)

if bld.env.WINEXE_CC_WIN64:
    winexesvc_binaries += ' winexesvc64_exe_binary.c'

if winexesvc_binaries != '':
    bld.SAMBA3_BINARY('winexe',
                      source='winexe.c ' + winexesvc_binaries,
                      deps='''
                          CMDLINE_S3
                          samba-credentials
                          LOADPARM_CTX
                          libsmb
                          msrpc3
                      ''',
                      enabled=bld.env.build_winexe)
