#!/usr/bin/env python3
#####
# keywords.py
# Translated from keywords.pl
#
#  Extract keywords from camp.l and list them in a keywords file. These
#  keywords are used in autocompletion at the interactive prompt.
#####

import argparse
import re
import textwrap
from typing import List

parser = argparse.ArgumentParser()
parser.add_argument("--camplfile", required=True)
parser.add_argument("--output", required=True)
parser.add_argument("--process-file", required=True)
args = parser.parse_args()

camplfile = args.camplfile
output_keywords_file = args.output
process_file = args.process_file

# Extra keywords to add that aren't automatically extracted, currently none.
extrawords: List[str] = []

with open(output_keywords_file, "w", encoding="utf-8") as keywords:

   keywords.write(
       textwrap.dedent(
           """\
           /*****
            * This file is automatically generated by keywords.py.
            * Changes will be overwritten.
            *****/

           """
       )
   )

   def add(word):  # pylint: disable=redefined-outer-name
       keywords.write(f"ADD({word});\n")

   for word in extrawords:
       add(word)

   with open(camplfile, encoding="utf-8") as camp:
       # Search for the %% separator, after which the definitions start.
       for line in camp:
           if re.search(r"^%%\s*$", line):
               break

       # Grab simple keyword definitions from camp.l
       for line in camp:
           if re.search(r"^%%\s*$", line):
               break  # A second %% indicates the end of definitions.
           match = re.search(r"^([A-Za-z_][A-Za-z0-9_]*)\s*\{", line)
           if match:
               add(match.group(1))

   # Grab the special commands from the interactive prompt.
   with open(process_file, encoding="utf-8") as process:
       for line in process:
           match = re.search(
               r"^\s*ADDCOMMAND\(\s*([A-Za-z_][A-Za-z0-9_]*),",
               line,
           )
           if match:
               add(match.group(1))