#!/usr/bin/env python2
# -*- coding: utf-8 -*-
# Copyright 2017 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""Helper script to deploy the app."""

from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

import contextlib
import getpass
import fire
import os

from chromite.lib import cros_build_lib
from chromite.lib import cros_logging as logging
from chromite.lib import osutils
import jinja2
from werkzeug import security


_CIDB_CRED_DIR = 'creds/cidb'

# See "instance connection name" at
#   https://pantheon.corp.google.com/sql/instances/
#   cidb-gen2-replica2/overview?project=cosmic-strategy-646
_CIDB_INSTANCE = {  # Indexed with $DEBUG
    False: 'cosmic-strategy-646:us-central1:cidb-gen2-replica2',
    True: 'cosmic-strategy-646:us-central1:debug-cidb-gen2',
}
_CIDB_UNIX_SOCKET_CONTENTS = '/cloudsql/{instance}'


def _PrepareCreds(basedir, debug):
  """Deploy the prepared app from basedir.

  Args:
    basedir: The base directory where the app has already been prepped.
    debug: Whether to use debug creds.
  """
  suffix = '.dbg' if debug else ''
  cidb_cred_path = os.path.join(basedir, _CIDB_CRED_DIR + suffix)
  contents = _CIDB_UNIX_SOCKET_CONTENTS.format(
      instance=_CIDB_INSTANCE[debug])
  osutils.WriteFile(
      os.path.join(cidb_cred_path, 'unix_socket.txt'),
      contents)


@contextlib.contextmanager
def _PrepareAppFolder(debug):
  """Copies this folder and its symlink'd dependencies into a temporary dir.

  Args:
    debug: Whether to use debug creds

  Returns:
    A contextmanager that yields a temporary directory and cleans up afterward.
  """
  with osutils.TempDir() as tempdir:
    # This is rsync in 'archive' mode, but symlinks are followed to copy actual
    # files/directories.
    rsync_cmd = ['rsync', '-qrLgotD',
                 '--exclude', '*/*.pyc',
                 '--exclude', 'venv', # Needed to avoid infinite chromite loop
                 '--exclude', 'env',  # Our development virtualenv
                 '--exclude', 'creds/*/*.pem', # Sensitive cidb files
                 '--exclude', '*/appengine', # Appengine SDK not needed
                 '--exclude', '.git',
                 '--exclude', '*/.git']
    cros_build_lib.RunCommand(rsync_cmd + ['.', tempdir],
                              cwd=os.path.dirname(__file__))
    _PrepareCreds(tempdir, debug)
    yield tempdir


def _FillAppTemplate(tempdir, app, debug):
  """Fills the values in app.yaml template.

  Fills the ADMIN_PASSWORD_HASH value, and fills in other values depending on
  whether we're deploying to the |debug| service.

  Args:
    app: The yaml file to use.
    tempdir: The deployment directory containing the app.yaml template.
    debug: Whether to deploy as the debug service.
  """
  env = jinja2.Environment(
      loader=jinja2.FileSystemLoader(tempdir))
  contents = env.get_template(app).stream(
      instance_connection_name=_CIDB_INSTANCE[debug],
      debug=debug)
  contents.dump(os.path.join(tempdir, app))


def _GenerateRequirements():
  """Generates a requirements.txt file."""
  path = os.path.join(os.path.dirname(__file__), 'requirements.txt')
  cros_build_lib.RunCommand(
      ['pipenv', 'lock', '-r'],
      log_stdout_to_file=path)


def Main(debug=False, app='app.yaml'):
  """Deploys the app.

  Args:
    debug: Whether to deploy as the debug service.
    password_file: A path to the password file, or None for getpass().
    app: the .yaml file to deploy.
  """
  # Debug logging is needed to see output from deploy RunCommand.
  logging.basicConfig(level=logging.DEBUG)
  # This can't be generated in the tempdir because pipenv associates directory
  # paths with virtualenvs.
  _GenerateRequirements()
  with _PrepareAppFolder(debug=debug) as tempdir:
    _FillAppTemplate(
        tempdir, app=app, debug=debug)
    # Put a pdb trace here if you want to debug the app folder setup.
    cros_build_lib.RunCommand(['gcloud', 'app', 'deploy', app], cwd=tempdir)


if __name__ == '__main__':
  fire.Fire(Main)
