#!/usr/bin/env python3

import argparse
import vyper

from vyper import (
    optimizer
)
from vyper.parser.s_expressions import parse_s_exp
from vyper.parser.parser_utils import LLLnode
from vyper import compile_lll
parser = argparse.ArgumentParser(description='Vyper LLL for Ethereum')
parser.add_argument('--version', action='version', version='{0}'.format(vyper.__version__))
parser.add_argument('input_file', help='Vyper sourcecode to compile')
parser.add_argument('-f', help='Format to print csv list of ir,opt_ir,asm,bytecode', default='bytecode', dest='format')
parser.add_argument('--show-gas-estimates', help='Show gas estimates in ir output mode.', action="store_true")

args = parser.parse_args()

if __name__ == "__main__":

    with open(args.input_file) as f:

        if args.show_gas_estimates:
            LLLnode.repr_show_gas = True

        format_set = set(dict.fromkeys(args.format.split(',')))
        s_expressions = parse_s_exp(f.read())
        lll = LLLnode.from_list(s_expressions[0])
        if 'ir' in format_set:
            print(lll)
        optimised = optimizer.optimize(lll)
        if 'opt_ir' in format_set:
            print(optimised)
        asm = compile_lll.compile_to_assembly(lll)
        if 'asm' in format_set:
            print(asm)
        bytecode = '0x' + compile_lll.assembly_to_evm(asm).hex()
        if 'bytecode' in format_set:
            print(bytecode)
