#!/usr/bin/env python
import asyncio
import sys
from subprocess import Popen, PIPE

import lummao

LSL_HEADER = rb"""
integer argc;
list argv;
// $?
integer cashquery;

system(string command) {}
string exec(list command_parts) {return "";}
"""


class ShelLSLWrapper:
    script: lummao.BaseLSLScript

    def __init__(self, script, new_argv):
        self.script = script
        self.script.exec = self._exec_wrapper
        self.script.system = self._system_wrapper
        self.script.argc = len(new_argv)
        self.script.argv = new_argv

    async def execute(self):
        await self.script.execute()

    async def _system_wrapper(self, command: str):
        p = Popen(command, shell=True)
        p.wait()
        self.script.cashquery = p.returncode

    async def _exec_wrapper(self, command: list):
        p = Popen(command, stdout=PIPE, stdin=PIPE)
        stdout, stderr = p.communicate()
        if stderr:
            print(stderr.decode("utf8"), file=sys.stderr)
        self.script.cashquery = p.returncode
        return stdout.decode("utf8").rstrip("\n")


async def main():
    with open(sys.argv[1], "rb") as f:
        lsl_bytes = f.read()
    # strip shebang if present
    if lsl_bytes.startswith(b"#!"):
        lsl_bytes = b"\n".join(lsl_bytes.split(b"\n")[1:])
    script = lummao.compile_script(LSL_HEADER + lsl_bytes)
    script.builtin_funcs["llOwnerSay"] = print
    wrapped = ShelLSLWrapper(script, sys.argv[1:])
    await wrapped.execute()


if __name__ == "__main__":
    asyncio.run(main())
