#!/bin/bash

set -e

manifest_generation=$(dirname $0)/../manifest-generation

usage() {
  >&2 cat <<EOF
SYNOPSIS:
    Generate a manifest for a Diego deployment to accompany an existing cf-release deployment.

USAGE:
    $0 <MANDATORY ARGUMENTS> [OPTIONAL ARGUMENTS]

MANDATORY ARGUMENTS:
    -c <cf-path>        Path to CF manifest file.
    -i <iaas-path>      Path to IaaS-settings stub file.
    -p <property-path>  Path to property-overrides stub file.

OPTIONAL ARGUMENTS:
    -n <count-path>             Path to instance-count-overrides stub file.
    -v <versions-path>          Path to release-versions stub file.
    -s <sql-db-path>            Path to SQL stub file.
    -x                          Opt out of deploying etcd with the database vms (requires sql)
    -b                          Opt into using capi-release for bridge components.
    -d <voldriver-path>         Path to voldriver stub file.
    -N <cf-networking-path>     Path to CF Networking stub file
    -B                          Opt out of deprecated CC bridge components.
    -R                          Opt into using local route-emitter configuration for cells.
    -Q                          Opt into using sql locket service.
    -G                          Opt into using grootfs release (EXPERIMENTAL).
    -L                          Opt into using garden-linux-release for cells. (DEPRECATED)

EXAMPLE:
    $0 \\
      -c ../cf-release/bosh-lite/deployments/cf.yml \\
      -i manifest-generation/bosh-lite-stubs/iaas-settings.yml \\
      -p manifest-generation/bosh-lite-stubs/property-overrides.yml \\
      -n manifest-generation/bosh-lite-stubs/instance-count-overrides.yml \\
      -v manifest-generation/bosh-lite-stubs/release-versions.yml \\
      -s manifest-generation/bosh-lite-stubs/postgres/diego-sql.yml \\
      -x \\
      -d manifest-generation/bosh-lite-stubs/experimental/voldriver/drivers.yml \\
      -b \\
      -R
EOF
  exit 1
}

base_releases="${manifest_generation}/base-releases.yml"
garden_properties=""
bridge_properties=""
local_route_emitter_properties=""
bridge_jobs=""

while getopts "c:i:p:n:k:v:s:d:N:QkrbgxLBRG" opt; do
  case $opt in
    c)
      cf_deployment_manifest=$OPTARG
      ;;
    i)
      iaas_settings=$OPTARG
      ;;
    p)
      property_overrides=$OPTARG
      ;;
    n)
      instance_counts=$OPTARG
      ;;
    g)
      >&2 echo "DEPRECATED -g flag: garden-runc is now the default backend and -g is not needed."
      dash_g_provided="true"
      ;;
    b)
      bridge_properties="${manifest_generation}/capi-bridge-properties.yml";
      ;;
    v)
      release_versions=$OPTARG
      ;;
    s)
      sql_settings=$OPTARG
      ;;
    k)
      >&2 echo "DEPRECATED -k flag: Persistent disk configuration moved to IaaS-settings stub."
      ;;
    r)
      ;;
    d)
      voldriver_settings=$OPTARG
      ;;
    N)
      cf_networking_settings=$OPTARG
      ;;
    L)
      >&2 echo "DEPRECATED -L flag: Support for garden-linux is being deprecated. Please migrate to garden-runc."
      garden_properties="${manifest_generation}/garden-linux-properties.yml";
      ;;
    x)
      bbs_properties="${manifest_generation}/bbs-overrides-no-etcd.yml"
      ;;
    B)
      bridge_jobs="${manifest_generation}/disable-deprecated-bridge-jobs.yml";
      ;;
    R)
      local_route_emitter_properties="${manifest_generation}/enable-local-route-emitters.yml";
      ;;
    Q)
      sql_lock_overrides="${manifest_generation}/enable-sql-lock.yml"
      ;;
    G)
      >&2 echo "DEPRECATED -G flag: grootfs is the default since version 1.11.0 of garden-runc and cannot be disabled."
      ;;
    *)
      echo "Unknown arguments"
      usage
      ;;
  esac
done

grootfs_properties="${manifest_generation}/enable-grootfs.yml"

if [ "${dash_g_provided}x" != "x" ]; then
  if [ "${garden_properties}x" != "x" ]; then
    >&2 echo "ERROR: Only one of -g or -L may be specified."
    >&2 echo
    usage
  fi
fi

if [ -z ${cf_deployment_manifest} ]; then
  >&2 echo "ERROR: CF manifest file is missing"
  argument_error=true
else
  if [ ! -f "${cf_deployment_manifest}" ]; then
    >&2 echo "ERROR: CF manifest '${cf_deployment_manifest}' is not a regular file"
    argument_error=true
  fi
fi

if [ -z ${iaas_settings} ]; then
  >&2 echo "ERROR: IaaS-settings stub file is missing"
  argument_error=true
else
  if [ ! -f "${iaas_settings}" ]; then
    >&2 echo "ERROR: IaaS Setting stub '${iaas_settings}' is not a regular file"
    argument_error=true
  fi
fi

if [ -z ${property_overrides} ]; then
  >&2 echo "ERROR: Property-overrides stub file is missing"
  argument_error=true

else
  if [ ! -f "${property_overrides}" ]; then
    >&2 echo "ERROR: Property-overrides stub '${property_overrides}' is not a regular file"
    argument_error=true
  fi
fi

if [[ -z "${sql_settings}" ]]; then
  >&2 echo "ERROR: SQL Setting stub is missing"
  argument_error=true
fi

if [[ ! -z "${sql_settings}" && ! -f "${sql_settings}" ]]; then
  >&2 echo "ERROR: SQL Setting stub '${sql_settings}' is not a regular file"
  argument_error=true
fi

if [[ ! -z "${sql_lock_overrides}" && ! -f "${sql_lock_overrides}" ]]; then
  >&2 echo "ERROR: SQL Setting stub '${sql_lock_overrides}' is not a regular file"
  argument_error=true
fi

if [[ ! -z "${voldriver_settings}" && ! -f "${voldriver_settings}" ]]; then
  >&2 echo "ERROR: Voldriver Setting stub '${voldriver_settings}' is not a regular file"
  argument_error=true
fi

if [[ ! -z "${cf_networking_settings}" && ! -f "${cf_networking_settings}" ]]; then
  >&2 echo "ERROR: CF Networking Setting stub '${cf_networking_settings}' is not a regular file"
  argument_error=true
fi

if [[ ! -z "${cf_networking_settings}" && "${garden_properties}x" != "x" ]]; then
  >&2 echo "ERROR: CF Networking Setting stub '${cf_networking_settings}' is set but Garden-Runc not selected"
  argument_error=true
fi

if [[ ! -z "${instance_counts}" && ! -f "${instance_counts}" ]]; then
  >&2 echo "ERROR: Instance-count-overrides stub '${instance_counts}' is not a regular file"
  argument_error=true
fi

if [[ ! -z "${release_versions}" && ! -f "${release_versions}" ]]; then
  >&2 echo "ERROR: Release-versions stub '${release_versions}' is not a regular file"
  argument_error=true
fi

if [ ! -z $argument_error ]; then
  echo
  usage
fi

tmpdir=$(mktemp -d /tmp/diego-manifest.XXXXX)

spiff merge \
  ${manifest_generation}/config-from-cf.yml \
  ${manifest_generation}/config-from-cf-internal.yml \
  ${cf_deployment_manifest} \
  > ${tmpdir}/config-from-cf.yml

spiff merge \
  ${cf_networking_settings} \
  ${tmpdir}/config-from-cf.yml \
  > ${tmpdir}/cf-networking-merged.yml

spiff merge \
  ${manifest_generation}/diego.yml \
  ${garden_properties} \
  ${grootfs_properties} \
  ${release_versions} \
  ${bbs_properties} \
  ${bridge_jobs} \
  ${bridge_properties} \
  ${local_route_emitter_properties} \
  ${property_overrides} \
  ${instance_counts} \
  ${sql_settings} \
  ${voldriver_settings} \
  ${sql_lock_overrides} \
  ${tmpdir}/cf-networking-merged.yml \
  ${iaas_settings} \
  ${tmpdir}/config-from-cf.yml \
  > ${tmpdir}/diego.yml

spiff merge \
  ${manifest_generation}/misc-templates/bosh.yml \
  ${tmpdir}/diego.yml

rm -r $tmpdir
