"""Utility for parsing STL file header

.. moduleauthor:: xlanro00

"""

# Import basic libraries
import argparse as ap
import sys
from os.path import exists
import log


def stl_parser():
    """Parses stl file header.
    Prints command for running main.py with preformatted arguments.
    """

    # Parse arguments
    parser = ap.ArgumentParser(
        description='Command line utility for parsing fingerprint STL file header into working command')
    parser.add_argument('file', type=str, help='STL file')
    args = parser.parse_args()

    # Check if file exists
    if not exists(args.file):
        log.error_exit('File does not exist')
    with open(args.file, "rb") as f:
        header = f.read(80).decode('UTF-8')

    # Parse header
    # First, split header by new line, which serves as header ending character
    header = header.split('\n')[0]
    # Then, split header by backslash, which separates arguments
    header_arr = header.split('\\')
    input_file = header_arr[0]
    header_arr = header_arr[1:]
    # Create output file name to match input file name
    output_file = input_file.split('.')[0] + "_mod.png"
    dpi = header_arr[0]
    header_arr = header_arr[1:]

    # Create command string, later append arguments
    arg_string = "python3 src/main.py " + input_file + " " + output_file + " " + dpi

    if exists(header_arr[0]):
        config_file = header_arr[0]
        header_arr = header_arr[1:]
        preset = header_arr[0]
        arg_string += " -c " + config_file + " " + preset + " --stl "
    else:
        # This will not work, as filters are stored as shortcuts
        # This is done in order to have fewer chars in stl header which is limited to 80
        filters = header_arr[0]
        arg_string += " -f " + filters

    # Check if the last argument is numeric, if not, it is generation mode
    header_arr = header_arr[1:]
    last_arg = header_arr[-1]

    # Append mode and stl arguments
    if last_arg.isnumeric():
        if len(header_arr) == 2:
            mode = "p"
            height_line = header_arr[0]
            height_base = header_arr[1]
            arg_string += mode + " " + height_line + " " + height_base
        elif len(header_arr) == 4:
            mode = "c"
            height_line = header_arr[0]
            height_base = header_arr[1]
            curv_rate_x = header_arr[2]
            curv_rate_y = header_arr[3]
            arg_string += mode + " " + height_line + \
                " " + height_base + " " + curv_rate_x + " " + curv_rate_y
        elif len(header_arr) == 3:
            mode = "m"
            height_line = header_arr[0]
            iter = header_arr[1]
            finger_x = header_arr[2]
            finger_y = header_arr[3]
            finger_z = header_arr[4]
            finger_model = header_arr[5]
            arg_string += mode + " " + height_line + \
                " " + iter + " " + finger_x + " " + finger_y + " " + finger_z + " " + finger_model
        else:
            # Print unfinished command
            print(arg_string, file=sys.stdout)
            log.error_exit('Corrupted file header')
    else:
        mode = last_arg.lower()
        arg_string += mode + " "

        if mode == "p":
            height_line = header_arr[0]
            height_base = header_arr[1]
            arg_string += height_line + " " + height_base
        elif mode == "c":
            height_line = header_arr[0]
            height_base = header_arr[1]
            curv_rate_x = header_arr[2]
            curv_rate_y = header_arr[3]
            arg_string += height_line + " " + height_base + \
                " " + curv_rate_x + " " + curv_rate_y
        elif mode == "m":
            height_line = header_arr[0]
            iter = header_arr[1]
            finger_x = header_arr[2]
            finger_y = header_arr[3]
            finger_z = header_arr[4]
            finger_model = header_arr[5]
            arg_string += height_line + " " + iter + \
                " " + finger_x + " " + finger_y + " " + finger_z + " " + finger_model
            pass
        else:
            # Print unfinished command
            print(arg_string, file=sys.stdout)
            log.error_exit('Corrupted file header')

    # Print finished command
    print(arg_string, file=sys.stdout)


stl_parser()
