#!/usr/bin/env bash

function write_json_mcd {
  if [ -z "$1" ]; then
    echo "No output file passed. Use write_json path/to/file.json"
    exit 1
  fi

  echo "Publishing output into $1"
  cat > $1 <<- EOM
{
  "COL1": "$COL1",
  "COL2": "$COL2",
  "COL3": "$COL3",
  "COL4": "$COL4",
  "COL5": "$COL5",
  "CDP_MANAGER": "$CDP_MANAGER",
  "ETH": "$ETH",
  "ETH_FROM": "$ETH_FROM",
  "GET_CDPS": "$GET_CDPS",
  "MCD_ADM": "$MCD_ADM",
  "MCD_CAT": "$MCD_CAT",
  "MCD_DAI": "$MCD_DAI",
  "MCD_DAI_GUARD": "$MCD_DAI_GUARD",
  "MCD_DEPLOY": "$MCD_DEPLOY",
  "MCD_FLAP": "$MCD_FLAP",
  "MCD_FLIP_COL1_A": "$MCD_FLIP_COL1_A",
  "MCD_FLIP_COL1_B": "$MCD_FLIP_COL1_B",
  "MCD_FLIP_COL2_A": "$MCD_FLIP_COL2_A",
  "MCD_FLIP_COL3_A": "$MCD_FLIP_COL3_A",
  "MCD_FLIP_COL4_A": "$MCD_FLIP_COL4_A",
  "MCD_FLIP_COL5_A": "$MCD_FLIP_COL5_A",
  "MCD_FLIP_ETH_A": "$MCD_FLIP_ETH_A",
  "MCD_FLIP_ETH_B": "$MCD_FLIP_ETH_B",
  "MCD_FLOP": "$MCD_FLOP",
  "MCD_GOV": "$MCD_GOV",
  "MCD_JOIN_COL1_A": "$MCD_JOIN_COL1_A",
  "MCD_JOIN_COL1_B": "$MCD_JOIN_COL1_B",
  "MCD_JOIN_COL2_A": "$MCD_JOIN_COL2_A",
  "MCD_JOIN_COL3_A": "$MCD_JOIN_COL3_A",
  "MCD_JOIN_COL4_A": "$MCD_JOIN_COL4_A",
  "MCD_JOIN_COL5_A": "$MCD_JOIN_COL5_A",
  "MCD_JOIN_DAI": "$MCD_JOIN_DAI",
  "MCD_JOIN_ETH_A": "$MCD_JOIN_ETH_A",
  "MCD_JOIN_ETH_B": "$MCD_JOIN_ETH_B",
  "MCD_JUG": "$MCD_JUG",
  "MCD_MOM": "$MCD_MOM",
  "MCD_MOM_LIB": "$MCD_MOM_LIB",
  "MCD_MOVE_COL1_A": "$MCD_MOVE_COL1_A",
  "MCD_MOVE_COL1_B": "$MCD_MOVE_COL1_B",
  "MCD_MOVE_COL2_A": "$MCD_MOVE_COL2_A",
  "MCD_MOVE_COL3_A": "$MCD_MOVE_COL3_A",
  "MCD_MOVE_COL4_A": "$MCD_MOVE_COL4_A",
  "MCD_MOVE_COL5_A": "$MCD_MOVE_COL5_A",
  "MCD_MOVE_DAI": "$MCD_MOVE_DAI",
  "MCD_MOVE_ETH_A": "$MCD_MOVE_ETH_A",
  "MCD_MOVE_ETH_B": "$MCD_MOVE_ETH_B",
  "MCD_POT": "$MCD_POT",
  "MCD_SPOT": "$MCD_SPOT",
  "MCD_VAT": "$MCD_VAT",
  "MCD_VOW": "$MCD_VOW",
  "PIP_COL1": "$PIP_COL1",
  "PIP_COL2": "$PIP_COL2",
  "PIP_COL3": "$PIP_COL3",
  "PIP_COL4": "$PIP_COL4",
  "PIP_COL5": "$PIP_COL5",
  "PIP_ETH": "$PIP_ETH",
  "PROXY_ACTIONS": "$PROXY_ACTIONS"
}
EOM
}

function deploy_mcd {
  echo "Deploying MCD..."
  DPA=$LIB/testchain-dss-deployment-scripts/contracts/dss-proxy-actions
  cd $DPA/lib/dss-cdp-manager/lib/dss-deploy/
  export DAPP_SOLC_VERSION=0.5.0
  . bin/deploy-all
  . bin/deploy-ilk-col1 B
  . bin/deploy-ilk-eth B
  cd -

  cd $DPA
  if [ -n "$SKIP_BUILD_IF_ALREADY_BUILT" ] && [ -f out/DssCdpManager.abi ]; then
    echo "Skipping dapp build for CdpManager"
  else
    echo "Building CdpManager..."
    dapp --use solc:0.5.0 build
  fi
  echo "Deploying CdpManager..."
  CDP_MANAGER=$(dapp create DssCdpManager)
  PROXY_ACTIONS=$(dapp create DssProxyActions)
  MCD_MOM_LIB=$(dapp create MomLib)
  GET_CDPS=$(dapp create GetCdps)
  cd -

  write_json_mcd "$OUT/addresses-mcd.json"

  mkdir -p $OUT/mcd

  ls $DPA/out/*.abi \
    $DPA/lib/dss-cdp-manager/lib/dss-deploy/out/*.abi | \
    grep -v -E "(Fab|Dev|Test|Like|t_sol|lib_|src_)" | \
    xargs sh -c "cp \$@ $OUT/mcd" placeholder
  # for an explanation of the placeholder arg above, see:
  # https://en.wikipedia.org/wiki/Xargs#Shell_trick
}

function jq_inplace {
  TMP=$(mktemp)
  jq "$1" "$2" > $TMP && mv $TMP "$2"
}

function deploy_mcd_tdds {
  TDDS=$LIB/testchain-dss-deployment-scripts
  cd $TDDS

  # change price feeds to DSValue so we can set prices from within tests
  TMP=$(mktemp)
  jq_inplace '.tokens[].pip.type = "value"' step-1.json

  # step 1 only
  ./step-1-deploy

  # step 4
  # jq_inplace '.tokens[].pip.type = "value"' step-4.json
  # jq_inplace '.tokens.ETH.pip.price = "123.45"' step-4.json
  # jq_inplace '.tokens.COL1.pip.price = "234.56"' step-4.json
  # ./step-4-deploy

  # add median for testing
  cd $TDDS/contracts/median
  PIP_ETH_MEDIAN=$(dapp create Median "$(seth --to-bytes32 "$(seth --from-ascii "${token}USD")")")
  jq_inplace ".PIP_ETH_MEDIAN = \"${PIP_ETH_MEDIAN}\"" $TDDS/out/addresses.json

  # uncomment below to add more ilks
  # DPA=$LIB/testchain-dss-deployment-scripts/contracts/dss-proxy-actions
  # cd $DPA/lib/dss-cdp-manager/lib/dss-deploy/
  # export DAPP_SOLC_VERSION=0.5.0
  # . bin/deploy-ilk-col1 B
  # . bin/deploy-ilk-eth B

  ls \
    $TDDS/out/abi/* \
    $TDDS/contracts/dss-proxy-actions/out/*.abi \
    $TDDS/contracts/dss-proxy-actions/lib/dss-cdp-manager/lib/dss-deploy/out/*.abi | \
    grep -v -E "(Fab|Dev|Test|Like|t_sol|lib_|src_)" | \
    xargs sh -c "cp \$@ $OUT/mcd" placeholder
  # why the placeholder? see https://en.wikipedia.org/wiki/Xargs#Shell_trick

  jq -S . $TDDS/out/addresses.json > $OUT/addresses-mcd.json
  cd -
}
