-module(gen_script).
-include_lib("pbt.hrl").
-export([gen/1]).
gen_({'+', A, B}) -> ["(", gen_(A), " + ", gen_(B), ")"];
gen_({'-', A, B}) -> ["(", gen_(A), " - ", gen_(B), ")"];
gen_({'/', A, B}) -> ["(", gen_(A), " / ", gen_(B), ")"];
gen_({'*', A, B}) -> ["(", gen_(A), " * ", gen_(B), ")"];
gen_({'%', A, B}) -> ["(", gen_(A), " % ", gen_(B), ")"];
gen_({'==', A, B}) -> ["(", gen_(A), " == ", gen_(B), ")"];
gen_({'!=', A, B}) -> ["(", gen_(A), " != ", gen_(B), ")"];
gen_({'>=', A, B}) -> ["(", gen_(A), " >= ", gen_(B), ")"];
gen_({'>', A, B}) -> ["(", gen_(A), " > ", gen_(B), ")"];
gen_({'<', A, B}) -> ["(", gen_(A), " < ", gen_(B), ")"];
gen_({'<=', A, B}) -> ["(", gen_(A), " <= ", gen_(B), ")"];
gen_({'and', A, B}) -> ["(", gen_(A), " and ", gen_(B), ")"];
gen_({'or', A, B}) -> ["(", gen_(A), " or ", gen_(B), ")"];
gen_({'not', A}) -> ["not (", gen_(A), ")"];
gen_({'+', A}) -> ["(+ ", gen_(A), ")"];
gen_({'-', A}) -> ["(- ", gen_(A), ")"];
gen_({'let', Path, Expr}) -> ["let ", gen_(Path), " = ", gen_(Expr)];
gen_({local, Path}) -> Path;
gen_({emit, A}) -> ["emit (", gen_(A), ")"];
gen_(drop) -> "drop";
gen_(true) -> "true";
gen_(false) -> "false";
gen_(null) -> "null";
gen_(X) when is_number(X) -> io_lib:format("~p", [X]);
gen_(X) when is_binary(X) -> jsx:encode(X).
gen(Expr) ->
iolist_to_binary(gen_(Expr)).