#!/usr/bin/python3

# Copyright 2019 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

"""Main driver program for the Emboss compiler."""

import argparse
import os
from os import path
import subprocess
import sys

def _parse_args(argv):
  parser = argparse.ArgumentParser(description="Emboss compiler")
  parser.add_argument("--color-output",
                      default="if_tty",
                      choices=["always", "never", "if_tty", "auto"],
                      help="Print error messages using color.  'auto' is a "
                           "synonym for 'if_tty'.")
  parser.add_argument("--import-dir", "-I",
                      dest="import_dirs",
                      action="append",
                      default=["."],
                      help="A directory to use when searching for imported "
                           "embs.  If no import-dirs are specified, the "
                           "current directory will be used.")
  parser.add_argument("--generate",
                      nargs=1,
                      choices=["cc"],
                      default="cc",
                      help="Which back end to use.  Currently only C++ is "
                           "supported.")
  parser.add_argument("--output-path",
                      nargs=1,
                      default=".",
                      help="Prefix to use for the generated output file.")
  parser.add_argument("input_file",
                      type=str,
                      nargs=1,
                      help=".emb file to compile.")
  return parser.parse_args(argv[1:])


def main(argv):
  flags = _parse_args(argv)
  base_path = path.dirname(__file__) or "."
  subprocess_environment = os.environ.copy()
  if subprocess_environment.get("PYTHONPATH"):
    subprocess_environment["PYTHONPATH"] = (
      base_path + ":" + subprocess_environment.get("PYTHONPATH"))
  else:
    subprocess_environment["PYTHONPATH"] = base_path
  front_end_args = [
      sys.executable,
      path.join(base_path, "compiler", "front_end", "emboss_front_end.py"),
      "--output-ir-to-stdout",
      "--color-output", flags.color_output,
  ]
  for import_dir in flags.import_dirs:
    front_end_args.extend([
        "--import-dir",
        import_dir
    ])
  front_end_args.append(flags.input_file[0])
  front_end_status = subprocess.run(front_end_args,
                                    stdout=subprocess.PIPE,
                                    env=subprocess_environment)
  if front_end_status.returncode != 0:
    return front_end_status.returncode
  back_end_status = subprocess.run(
      [
          sys.executable,
          path.join(base_path, "compiler", "back_end", "cpp",
                    "emboss_codegen_cpp.py"),
      ],
      input=front_end_status.stdout,
      stdout=subprocess.PIPE,
      env=subprocess_environment)
  if back_end_status.returncode != 0:
    return back_end_status.returncode
  output_file = path.join(flags.output_path[0], flags.input_file[0]) + ".h"
  os.makedirs(path.dirname(output_file), exist_ok=True)
  with open(output_file, "wb") as output:
    output.write(back_end_status.stdout)
  return 0


if __name__ == "__main__":
  sys.exit(main(sys.argv))
