# -*- coding: utf-8 -*-
# Copyright 2010-2015, Google Inc.
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
# met:
#
#     * Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
#     * Redistributions in binary form must reproduce the above
# copyright notice, this list of conditions and the following disclaimer
# in the documentation and/or other materials provided with the
# distribution.
#     * Neither the name of Google Inc. nor the names of its
# contributors may be used to endorse or promote products derived from
# this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

"""Script to invoke protoc with considering project root directory.

  % python protoc_wrapper.py               \
      --protoc_command=protoc              \
      --protoc_dir=/usr/bin    (optional)  \
      --proto=../protos/my_data.proto      \
      --proto_path=../protos   (optional)  \
      --cpp_out=../out/debug/gen           \
      --project_root=../
"""

__author__ = "yukawa"

import optparse
import os
import subprocess
import sys

def ParseOption():
  """Parse command line options."""
  parser = optparse.OptionParser()
  parser.add_option('--protoc_command', dest='protoc_command',
                    help='executable name of protoc')
  parser.add_option('--protoc_dir', dest='protoc_dir',
                    help='directory where protoc is located')
  parser.add_option('--proto', dest='proto', help='path of the *.proto file')
  parser.add_option('--cpp_out', dest='cpp_out', default='',
                    help='path where cpp files should be generated')
  parser.add_option('--java_out', dest='java_out', default='',
                    help='path where java files should be generated')
  parser.add_option('--project_root', dest='project_root', default='.',
                    help='run protoc after moving this directory')
  parser.add_option('--proto_path', dest='proto_path', default='',
                    help='directory to be passed to --proto_path option')

  (opts, _) = parser.parse_args()

  return opts


def main():
  """The main function."""
  opts = ParseOption()

  # Convert to absolute paths before changing the current directory.
  project_root = os.path.abspath(opts.project_root)
  proto_path = os.path.abspath(opts.proto_path) if opts.proto_path else ''
  cpp_out = os.path.abspath(opts.cpp_out) if opts.cpp_out else ''
  java_out = os.path.abspath(opts.java_out) if opts.java_out else ''

  protoc_path = opts.protoc_command
  if opts.protoc_dir:
    protoc_path = os.path.join(os.path.abspath(opts.protoc_dir), protoc_path)

  # The path of proto file should be transformed as a relative path from
  # the project root so that correct relative paths should be embedded into
  # generated files.
  proto_files = [os.path.relpath(os.path.abspath(p), project_root)
                 for p in opts.proto.split(' ')]

  # Move to the project root.
  os.chdir(project_root)

  commands = [protoc_path] + proto_files
  if cpp_out:
    commands += ['--cpp_out=' + cpp_out]
  if java_out:
    commands += ['--java_out=' + java_out]
  if proto_path:
    rel_proto_path = os.path.relpath(proto_path, project_root)
    commands += ['--proto_path=' + rel_proto_path]
  sys.exit(subprocess.call(commands))


if __name__ == '__main__':
  main()
