import os
import sys


def libalgobsec_inject_patcher(env):
    libalgobsec_builder = next(
        (
            builder
            for builder in env.GetLibBuilders()
            if builder.name == "BSEC Software Library"
        ),
        None,
    )

    if libalgobsec_builder is None:
        return

    def process_archive(target, source, env):
        import subprocess

        # Allows `import espurna_utils` for external scripts, where we might not be within scons runtime
        from SCons.Script import Delete, Mkdir

        tmpdir = env.get(
            "ESPURNA_LIBALGOBSEC_PATCHER_TMPDIR",
            os.path.join(str(target[0].get_dir()), "_tmpdir"),
        )

        env.Execute(Mkdir(tmpdir))

        # XXX: $AR does not support output argument for the extraction
        #      always switch into tmpdir when running commands
        def run(cmd):
            sys.stdout.write(" ".join(cmd))
            sys.stdout.write("\n")
            subprocess.check_call(cmd, cwd=tmpdir)

        run([env.subst("$AR"), "x", source[0].abspath])

        names = []
        for infilename in os.listdir(tmpdir):
            newname = infilename
            if not infilename.endswith(".c.o"):
                newname = infilename.replace(".o", ".c.o")
            os.rename(os.path.join(tmpdir, infilename), os.path.join(tmpdir, newname))
            names.append(newname)

        pack_cmd = [env.subst("$AR"), "cr", target[0].abspath]
        pack_cmd.extend(names)
        run(pack_cmd)

        env.Execute(Delete(tmpdir))

    # Instead of replacing the file in-place, link with the patched version
    libalgobsec_dir = os.path.join(libalgobsec_builder.src_dir, "esp8266")

    target = env.File(
        "libalgobsec.a", directory=env.subst("$BUILD_DIR/libalgobsec_patched")
    )
    source = env.File("libalgobsec.a", directory=libalgobsec_dir)

    command = env.Command(target, source, process_archive)
    patcher = env.Alias("patch-libalgobsec", command)

    env.Append(LIBPATH=[target.get_dir()])
    env.Append(LIBS=["algobsec"])

    env.Depends("$BUILD_DIR/${PROGNAME}.elf", patcher)