#!/bin/bash
# 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
#
#      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.

# This script generates all GAPIC clients in this repo.
# See instructions at go/yoshi-site.

set -ex

GOCLOUD_DIR="$(dirname "$0")"

microgen() {
  input=$1
  options="${@:2}"

  # see https://github.com/googleapis/gapic-generator-go/blob/master/README.md#docker-wrapper for details
  docker run \
    --user $UID \
    --mount type=bind,source=$PWD,destination=/conf,readonly \
    --mount type=bind,source=$PWD/$input,destination=/in/$input,readonly \
    --mount type=bind,source=/tmp,destination=/out \
    --rm \
    gcr.io/gapic-images/gapic-generator-go:0.7.0 \
    $options
}

for gencfg in $(cat $GOCLOUD_DIR/gapics.txt); do
  rm -rf artman-genfiles/*
  artman --config "$gencfg" generate go_gapic
  cp -r artman-genfiles/gapi-*/cloud.google.com/go/* $GOCLOUD_DIR
done

rm -rf /tmp/cloud.google.com
{
  # skip the first line with column titles
  read -r
  while IFS=, read -r input mod retrycfg apicfg
  do
    microgen $input "$mod" "$retrycfg" "$apicfg"
  done
} < $GOCLOUD_DIR/microgens.csv

# copy generated code if any was created
[ -d "/tmp/cloud.google.com/go" ] && cp -r /tmp/cloud.google.com/go/* $GOCLOUD_DIR

pushd $GOCLOUD_DIR
  gofmt -s -d -l -w . && goimports -w .

  # NOTE(pongad): `sed -i` doesn't work on Macs, because -i option needs an argument.
  # `-i ''` doesn't work on GNU, since the empty string is treated as a file name.
  # So we just create the backup and delete it after.
  ver=$(date +%Y%m%d)
  git ls-files -mo | while read modified; do
    dir=${modified%/*.*}
    find . -path "*/$dir/doc.go" -exec sed -i.backup -e "s/^const versionClient.*/const versionClient = \"$ver\"/" '{}' +
  done
popd

for manualdir in $(cat $GOCLOUD_DIR/manuals.txt); do
  find "$GOCLOUD_DIR/$manualdir" -name '*.go' -exec sed -i.backup -e 's/setGoogleClientInfo/SetGoogleClientInfo/g' '{}' '+'
done

find $GOCLOUD_DIR -name '*.backup' -delete
