#!/usr/bin/env python3

# usage gce mirror --axis x translate --y -200 file.gcode
# usage gce
arg_mirror_axis = 'y'
arg_translation=[200, 0, 0]
arg_file_path='file.gcode'


from os import remove, rename
from re import sub, findall, match, IGNORECASE
# import click


# modify_instructions = 'G0, G1, G2, G3, G90, G91, S, F, M3, M4'.split(', ')
modify_instructions = '(G(0|1|2|3|90|91)|S|F|M(3|4))'
temp_file_path = '.file.gcode.tmp'
out_file_path = 'file_modified.gcode'

# @click.command()
# @click.option('--axis', default='x', help='mirror axis')
# @click.argument('mirror')
def mirror(instruction, axis='Y'):
    return instruction.replace(axis, f'{axis}-')


def translate(instruction, translation=[0, 0, 0]):
    pattern = 'X[-0-9.]+'
    x = findall(pattern, instruction, IGNORECASE)
    if not x:
        return instruction
    try:
        x = float(x[0][1:])
    except ValueError:
        return instruction
    x = round(x + translation[0], 3)
    return sub(pattern, f'X{x}', instruction, IGNORECASE)


with open(arg_file_path, 'r') as gcode:

    try:
        remove(temp_file_path)
    except IOError:
        pass

    with open(temp_file_path, 'w') as tmp_gcode:

        instructions = gcode.readlines()
        instructions_length = len(instructions)
        instructions_count = 0
        for instruction in instructions:

            instructions_count += 1
            print(f'\rparsing instruction {instructions_count}/{instructions_length})',
                  end='')
            instruction = instruction.strip()
            if match(modify_instructions, instruction, IGNORECASE):
#             if any(map(instruction.__contains__, modify_instructions)):

#                 import pudb; pudb.set_trace()
                instruction = mirror(instruction, axis=arg_mirror_axis)
                instruction = translate(instruction, translation=arg_translation)
            tmp_gcode.write(f'{instruction}\n')

rename(temp_file_path, out_file_path)
