import os
import sys

BLOCK_SIZE = 4  # Number of data values per line in output file

def process_asc_file(input_path, block_size):
    formatted_lines = []

    with open(input_path, 'r', encoding='ascii', errors='ignore') as file:
        for line in file:
            tokens = line.strip().split()
            if not tokens:
                continue

            base_addr_str = tokens[0]
            data_tokens = tokens[1:]

            try:
                base_addr = int(base_addr_str, 16)
            except ValueError:
                print("ERROR: could not convert HEX value")
                sys.exit(1)

            # If line has no data after address skip
            if not data_tokens:
                formatted_lines.append(f"{base_addr_str}:\r")
                continue

            for i in range(0, len(data_tokens), block_size):
                chunk = data_tokens[i:i + block_size]
                current_addr = base_addr + i
                addr = f"{current_addr:04X}"
                
                # Format: Address:data1 data2 data3 ... CR
                joined_data = " ".join(chunk)
                formatted_lines.append(f"{addr}:{joined_data}\r")

    return formatted_lines


def convert_file():
    if len(sys.argv) < 2:
        print("Usage: python3 convert-asc-2-txt.py <input_file>")
        sys.exit(1)

    input_file = sys.argv[1]

    if not os.path.exists(input_file):
        print(f"ERROR: Input file '{input_file}' not found.")
        sys.exit(1)

    file_root, _ = os.path.splitext(input_file)
    output_file = f"{file_root}.txt"

    try:
        lines = process_asc_file(input_file, BLOCK_SIZE)

        with open(output_file, 'wb') as file:
            for line in lines:
                file.write(line.encode('ascii'))

        print(f"Converted '{input_file}' to '{output_file}'")
        print(f"Number of lines: {len(lines)}")

    except Exception as e:
        print(f"ERROR: An error occurred: {e}")


if __name__ == '__main__':
    convert_file()
