script({
    title: "Invoke LLM code update",
    files: "src/muz/spacer/spacer_qe_project.cpp"
})


async function invokeLLMUpdate(code) {
    const answer = await runPrompt(
        (_) => {
            _.def("CODE", code);
            _.$`
            You are a highly experienced compiler engineer with over 20 years of expertise, 
        specializing in C and C++ programming. Your deep knowledge of best coding practices 
        and software engineering principles enables you to produce robust, efficient, and 
        maintainable code in any scenario.

        Please modify the original code in <CODE> to ensure that it enforces the following:
      - do not use pointer arithmetic.
      - do not introduce uses of std::vector.
      - do not remove comments from the code.
      - do not replace for loops over unsigned by for loops over 'auto'.
      - keep comments in the same place. Please.
      - only make replacements that are compatible with the ones listed next:
      - add white space between operators:
        For example:
             i=0 
        by 
             i = 0
        For example
             a+b
        by
            a + b
      - remove brackets around single statements:
        For example:
              { break; }
        by 
              break;    
        for example replace:
            else { 
               result = 0; 
            }
        by
            else 
                result = 0; 
        for example replace:
            if (a) { 
                result = 0; 
            }
        by 
            if (a) 
                result = 0;  
      - start else statements on a new line.       
      - replaces uses of for loops using begin(), end() iterator patterns by C++21 style for loops
        For example replace 
            for (auto it = x.begin(), end = x.end(); it != end; ++it) 
        by
            for (auto e : x) 
        or 
            for (auto const& e : x)

        For example, replace
            for (unsigned i = 0; i < a->get_num_args(); ++i) {
                expr* arg = a->get_arg(i);
                ...
            }
         by
            for (auto arg : *a) {
                ...
            }
    `
        }, {
            system: [],
            systemSafety: false
        }
    )
    console.log(answer.text);
    return answer.text;
}


const inputFile = env.files[0];
const file = await workspace.readText(inputFile);
const answer = await invokeLLMUpdate(file.content);
// Extract the code from the answer by removing ```cpp and ```:
let code = answer.replace(/```cpp/g, "").replace(/```/g, "");
const outputFile = inputFile.filename + ".patch";
await workspace.writeText(outputFile, code);