#!/usr/bin/env python3
__doc__ = """
Script to generate asy.list file. Equivalent to Makefile's asy-list.el file's logic
to generate asy.list.
"""

import argparse
import pathlib
import subprocess as sp
from typing import Optional


def parse_args():
   parser = argparse.ArgumentParser()
   parser.add_argument("--asy-executable", required=True, help="Asymptote executable")
   parser.add_argument("--asy-base-dir", required=True, help="Asymptote base dir")
   parser.add_argument("--output-file", required=True, help="Output file")
   return parser.parse_args()


def run_asy_list(asy_exec: str, base_dir: pathlib.Path, asy_file: Optional[str] = None):
   base_args = [asy_exec, "-dir", str(base_dir), "-config", '""', "-render", "0", "-l"]
   if asy_file is not None:
       base_args.append(asy_file)
   out_data = sp.run(
       base_args,
       stdout=sp.PIPE,
       stderr=sp.PIPE,
       universal_newlines=True,
       check=True,
   )
   return out_data.stdout


def base_file_to_be_included_in_list_file(base_file_name: str):
   if base_file_name.startswith("plain") or base_file_name.startswith("three_"):
       return False
   if "map" in base_file_name:
       return False
   return True


def main():
   args = parse_args()
   base_dir = pathlib.Path(args.asy_base_dir)
   base_asy_list = run_asy_list(args.asy_executable, base_dir)

   base_file: pathlib.Path
   base_files_to_generate_list = [
       base_file
       for base_file in base_dir.glob("*.asy")
       if base_file_to_be_included_in_list_file(base_file.name)
   ]
   base_file_asy_lists = [
       run_asy_list(args.asy_executable, base_dir, str(base_file))
       for base_file in base_files_to_generate_list
   ]
   with open(args.output_file, "w", encoding="utf-8") as fil:
       fil.write(base_asy_list)
       for asy_list_info in base_file_asy_lists:
           fil.write(asy_list_info)


if __name__ == "__main__":
   main()