#!/bin/bash

# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you 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.

#End to End Test of Services using curl/bash

apiVersion="v1"
defaultURL="http://localhost:5556"
apiURL="${1:-$defaultURL}"


status () {
  #Determine if an extension is running
  statusOutput=$(curl -s -X GET "$apiURL/$apiVersion/status" -H "accept: */*" -H "Content-Type: application/json")
  identity=$(echo $statusOutput | jq .nodeCID)
  extensionVendor=$(echo $statusOutput | jq -r .extensionVendor)
  plugin=$(echo $statusOutput | jq -r .plugin)
  echo "Plugin $plugin"

  if [ -z "${extensionVendor}" ]; then
      echo "Server Not Running"
      exit 1
  fi
}

###############################################################################################################################

execute_bitcoin () {
  # #Run 4 Tests against the Bitcoin Extension
  echo "Bitcoin Plugin Tests [4 Tests]"
  output1=$(curl -s -X POST "$apiURL/$apiVersion/order" -H "accept: */*" -H "Content-Type: application/json" -d "{\"beneficiaryIDDocumentCID\":\"\",\"extension\":{\"coin\":\"0\"}}")
  #echo $output1
  op1=$(echo $output1 | jq .orderReference)
  commitment1=$(echo $output1 | jq .commitment)
  address1=$(echo $output1 | jq .extension.address)
  output2=$(curl -s -X POST "$apiURL/$apiVersion/order/secret" -H "accept: */*" -H "Content-Type: application/json" -d "{\"orderReference\":$op1,\"beneficiaryIDDocumentCID\":$identity}")
  address2=$(echo $output2 | jq .extension.address)
  commitment2=$(echo $output2 | jq .commitment)

  echo "Committment1 $commitment1 $address1"
  echo "Committment2 $commitment2 $address2"

  if [ -z $commitment2 ]; then
      echo "Failed Commitment is empty"
      exit 1
  fi

  if [ $commitment1 == $commitment2 ]; then
    echo "Pass - Id, Order & OrderSecret(Beneficiary)"
  else
    echo "Fail"
    exit 1
  fi

  output3=$(curl -s -X POST "$apiURL/$apiVersion/order" -H "accept: */*" -H "Content-Type: application/json" -d "{\"beneficiaryIDDocumentCID\":$identity,\"extension\":{\"coin\":\"0\"}}")

  op3=$(echo $output3 | jq .orderReference)
  commitment3=$(echo $output3 | jq .commitment)
  address3=$(echo $output3 | jq .extension.address)
  output4=$(curl -s -X POST "$apiURL/$apiVersion/order/secret" -H "accept: */*" -H "Content-Type: application/json" -d "{\"orderReference\":$op3}")
  commitment4=$(echo $output4 | jq .commitment)
  address4=$(echo $output4 | jq .extension.address)
  orderReference=$(echo $output4 | jq .orderReference)
  orderIndex=1

  echo "Committment3 $commitment3 $address3"
  echo "Committment4 $commitment4 $address4"

  if [ -z $commitment4 ]; then
      echo "Failed Commitment is empty"
      exit 1
  fi

  if [ $commitment3 == $commitment4 ]; then
    echo "Pass - Id, Order(Beneficiary) & OrderSecret"
  else
      echo "Fail"
      exit 1
  fi


   #make another BeneficiaryID
  #  output5=$(curl -s -X POST "http://localhost:5556/$apiVersion/identity" -H "accept: */*" -H       "Content-Type: application/json" -d "{\"Name\":\"AA\"}")
  #  benid=$(echo $output5 | jq -r .idDocumentCID)

  #  #Tests against the Bitcoin Extension - different befificary
  #  output6=$(curl -s -X POST "http://localhost:5556/$apiVersion/order" -H "accept: */*" -H "Content-Type: application/json" -d "{\"beneficiaryIDDocumentCID\":\"\",\"extension\":{\"coin\":\"0\"}}")
  #  #echo $output6
  #  op6=$(echo $output6 | jq .orderReference)
  #  commitment6=$(echo $output6 | jq .commitment)
  #  address6=$(echo $output6 | jq .extension.address)

  #  output7=$(curl -s -X POST "http://localhost:5556/$apiVersion/order/secret" -H "accept: */*" -H "Content-Type: application/json" -d "{\"orderReference\":$op6,\"beneficiaryIDDocumentCID\":\"$benid\"}")
  #  address7=$(echo $output7 | jq .extension.address)
  #  commitment7=$(echo $output7 | jq .commitment)

  #  echo "Committment5 $commitment6 $address6"
  #  echo "Committment6 $commitment7 $address7"

  #  if [ -z $commitment7 ]; then
  #      echo "Failed Commitment is empty"
  #      exit 1
  #  fi

  #  if [ $commitment6 == $commitment7 ]; then
  #    echo "Pass - Id, Order & OrderSecret(Beneficiary)"
  #  else
  #    echo "Fail"
  #    exit 1
  #  fi

  # output8=$(curl -s -X POST "http://localhost:5556/$apiVersion/order" -H "accept: */*" -H "Content-Type: application/json" -d "{\"beneficiaryIDDocumentCID\":\"$benid\",\"extension\":{\"coin\":\"0\"}}")
  # op8=$(echo $output8 | jq .orderReference)
  # commitment8=$(echo $output8 | jq .commitment)
  # address8=$(echo $output8 | jq .extension.address)


  # output9=$(curl -s -X POST "http://localhost:5556/$apiVersion/order/secret" -H "accept: */*" -H "Content-Type: application/json" -d "{\"orderReference\":$op8}")
  # commitment9=$(echo $output9 | jq .commitment)
  # address9=$(echo $output9 | jq .extension.address)
  # orderReference=$(echo $output9 | jq .orderReference)
  # orderIndex=1

  # echo "Committment7 $commitment8 $address8"
  # echo "Committment8 $commitment9 $address9"

  # if [ -z $commitment9 ]; then
  #     echo "Failed Commitment is empty"
  #     exit 1
  # fi

  # if [ $commitment8 == $commitment9 ]; then
  #   echo "Pass - Id, Order(Beneficiary) & OrderSecret"
  # else
  #     echo "Fail"
  #     exit 1
  # fi

}


###############################################################################################################################

execute_safeguardsecret () {
  inputString="This is some random test text 1234567890!"
  echo "Encrypt a String [1 Test]"
  echo $output1
  output1=$(curl -s -X POST "$apiURL/$apiVersion/order" -H "accept: */*" -H "Content-Type: application/json" -d "{\"beneficiaryIDDocumentCID\":$identity,\"extension\":{\"plainText\":\"$inputString\"}}")
  echo $output1
  op1=$(echo $output1 | jq .orderReference)
  cipherText=$(echo $output1 | jq .extension.cypherText)
  tvalue=$(echo $output1 | jq .extension.t)
  vvalue=$(echo $output1 | jq .extension.v)
  commitment1=$(echo $output1 | jq .commitment)
  output2=$(curl -s -X POST "$apiURL/$apiVersion/order/secret" -H "accept: */*" -H "Content-Type: application/json" -d "{\"orderReference\":$op1,\"beneficiaryIDDocumentCID\":$identity,\"extension\":{\"cypherText\":$cipherText,\"t\":$tvalue,\"v\":$vvalue}}")
  result=$(echo $output2 | jq -r .extension.plainText)

  orderReference=$(echo $output2 | jq .orderReference)
  orderIndex=0


  if [ "$inputString" == "$result" ]; then
    echo "Pass"
  else
    echo "Fail"
    exit 1
  fi
}

# #############################################################################


execute_milagro () {
  echo "Milagro Tests [1 Test]"
  output1=$(curl -s -X POST "$apiURL/$apiVersion/order" -H "accept: */*" -H "Content-Type: application/json" -d "{\"beneficiaryIDDocumentCID\":$identity}")
  echo $output1
  op1=$(echo $output1 | jq .orderReference)


  commitment1=$(echo $output1 | jq .commitment)
  output2=$(curl -s -X POST "$apiURL/$apiVersion/order/secret" -H "accept: */*" -H "Content-Type: application/json" -d "{\"orderReference\":$op1,\"beneficiaryIDDocumentCID\":$identity}")
  commitment2=$(echo $output2 | jq .commitment)

  orderReference=$(echo $output2 | jq .orderReference)
  orderIndex=0


  echo "Committment1 $commitment1"
  echo "Committment2 $commitment2"

  if [ -z $commitment2 ]; then
      echo "Failed Commitment is empty"
      exit 1
  fi

  if [ $commitment1 == $commitment2 ]; then
    echo "Order Create/Retrieve Pass"
  else
    echo "Order Create/Retrieve Fail"
    exit 1
  fi
}






# #############################################################################

execute_orderlist () {
  echo "Milagro Tests [1 Test]"
  commitment2=$(echo $output2 | jq .commitment)
  outputList=$(curl -s -X GET "$apiURL/$apiVersion/order?page=0&perPage=2&sortBy=dateCreatedDsc" -H "accept: */*")
  orderReference=$(echo $outputList | jq -r ".orderReference | .[$orderIndex]")
  outputOrder=$(curl -s -X GET "$apiURL/$apiVersion/order/$orderReference" -H "accept: */*")

  #A simple smoke test to ensure some sort of order is returned
  hasSecret=`echo $outputOrder | grep "Secret"`

  if [ -z $hasSecret ]; then
      echo "Failed Order has error"
      exit 1
  else
     echo "Passed orderList & get"
  fi
}

# #############################################################################

status

if [ $plugin == "bitcoinwallet" ]; then
   execute_bitcoin
fi

if [ $plugin == "qredoplugin" ]; then
   execute_bitcoin
fi

if [ $plugin == "milagro"  ]; then
   execute_milagro
fi

if [ $plugin == "safeguardsecret" ]; then
    execute_safeguardsecret
fi
execute_orderlist

