# -*- coding: utf-8 -*- #
# Copyright 2017 Google LLC. All Rights Reserved.
#
# 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
#
#    http://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.

"""Useful code for running emulator proxies."""

from __future__ import absolute_import
from __future__ import division
from __future__ import unicode_literals

import contextlib
import os
import subprocess
from googlecloudsdk.command_lib.emulators import util
from googlecloudsdk.core.util import files


def ReverseProxyJar():
  proxy_path = util.GetEmulatorProxyPath()
  return os.path.join(proxy_path, 'emulator-reverse-proxy.jar')


@contextlib.contextmanager
def StartEmulatorProxy(args=None):
  """Starts the emulator reverse proxy, as a context manager.

  Note that this will SIGKILL the process once the context comes back to
  the message, so the caller can and should try to shut down the process
  more gracefully.

  Args:
    args: [str], the arguments to be passed to the relevant script

  Yields:
    The proxy process.
  """
  reverse_proxy_jar = ReverseProxyJar()
  java_path = files.FindExecutableOnPath('java')
  classname = 'com.google.cloudsdk.emulators.EmulatorProxy'
  proc = subprocess.Popen(
      [java_path, '-cp', reverse_proxy_jar, classname] + args,
      stdout=subprocess.PIPE)
  yield proc
  proc.kill()
