#!/usr/bin/env bash
# This file is part of TALER
# Copyright (C) 2014-2023 Taler Systems SA
#
# TALER is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as
# published by the Free Software Foundation; either version 3, or
# (at your option) any later version.
#
# TALER is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public
# License along with TALER; see the file COPYING.  If not, see
# <http://www.gnu.org/licenses/>
#

# Cleanup to run whenever we exit
function my_cleanup()
{
    for n in $(jobs -p)
    do
        kill "$n" 2> /dev/null || true
    done
    wait
    if [ -n "${LAST_RESPONSE+x}" ]
    then
        rm -f "${LAST_RESPONSE}"
    fi
}

. setup.sh

setup -c test_template.conf -m
CONF="test_template.conf.edited"
LAST_RESPONSE=$(mktemp -p "${TMPDIR:-/tmp}" test_response.conf-XXXXXX)

echo -n "Configuring 'admin' instance ..." >&2

STATUS=$(curl -H "Content-Type: application/json" -X POST \
    http://localhost:9966/management/instances \
    -d '{"auth":{"method":"token","password":"secret-token:new_value"},"id":"admin","name":"default","user_type":"business","address":{},"jurisdiction":{},"use_stefan":true,"default_wire_transfer_delay":{"d_us" : 3600000000},"default_pay_delay":{"d_us": 3600000000}}' \
    -w "%{http_code}" -s -o "$LAST_RESPONSE")

if [ "$STATUS" != "204" ]
then
    cat "$LAST_RESPONSE" >&2
    exit_fail "Expected 204, instance created. got: $STATUS" >&2
fi

echo "OK" >&2

##
# Test deleting and creating the account again.
# it should bring the account active again
##

echo -n "creating first account ..." >&2

STATUS=$(curl -H "Content-Type: application/json" -X POST \
    -H 'Authorization: Bearer secret-token:new_value' \
    http://localhost:9966/private/accounts \
    -d '{"payto_uri":"payto://x-taler-bank/localhost:8082/43?receiver-name=user43"}' \
    -w "%{http_code}" -s -o "$LAST_RESPONSE")


if [ "$STATUS" != "200" ]
then
    cat "$LAST_RESPONSE" >&2
    exit_fail "Expected 200 OK. Got: $STATUS"
fi

echo "OK" >&2


ACCOUNT_ID=$(jq -r .h_wire $LAST_RESPONSE)

STATUS=$(curl -H "Content-Type: application/json" -X GET \
    -H 'Authorization: Bearer secret-token:new_value' \
    http://localhost:9966/private/accounts/$ACCOUNT_ID \
    -w "%{http_code}" -s -o "$LAST_RESPONSE")

if [ "$STATUS" != "200" ]
then
    cat "$LAST_RESPONSE" >&2
    exit_fail "Expected 200 OK. Got: $STATUS"
fi

ACTIVE=$(jq -r .active $LAST_RESPONSE)

if [ "$ACTIVE" != "true" ]
then
    cat "$LAST_RESPONSE" >&2
    exit_fail "Expected account active."
fi

echo -n "deleting account ..." >&2

STATUS=$(curl -H "Content-Type: application/json" -X DELETE \
    -H 'Authorization: Bearer secret-token:new_value' \
    http://localhost:9966/private/accounts/$ACCOUNT_ID \
    -w "%{http_code}" -s -o "$LAST_RESPONSE")

if [ "$STATUS" != "204" ]
then
    cat "$LAST_RESPONSE" >&2
    exit_fail "Expected 204 OK. Got: $STATUS"
fi

echo "OK" >&2

echo -n "creating same account again to make it active ..." >&2

STATUS=$(curl -H "Content-Type: application/json" -X POST \
    -H 'Authorization: Bearer secret-token:new_value' \
    http://localhost:9966/private/accounts \
    -d '{"payto_uri":"payto://x-taler-bank/localhost:8082/43?receiver-name=user43"}' \
    -w "%{http_code}" -s -o "$LAST_RESPONSE")


if [ "$STATUS" != "200" ]
then
    cat "$LAST_RESPONSE" >&2
    exit_fail "Expected 200 OK. Got: $STATUS"
fi

STATUS=$(curl -H "Content-Type: application/json" -X GET \
    -H 'Authorization: Bearer secret-token:new_value' \
    http://localhost:9966/private/accounts/$ACCOUNT_ID \
    -w "%{http_code}" -s -o "$LAST_RESPONSE")

ACTIVE=$(jq -r .active $LAST_RESPONSE)

if [ "$ACTIVE" != "true" ]
then
    cat "$LAST_RESPONSE" >&2
    exit_fail "Expected account active."
fi

echo "OK" >&2

##
# Using different name should conflict with previous account.
##

ACCOUNT_ID=$(jq -r .h_wire $LAST_RESPONSE)

echo -n "creating same account with different name ..." >&2

STATUS=$(curl -H "Content-Type: application/json" -X POST \
    -H 'Authorization: Bearer secret-token:new_value' \
    http://localhost:9966/private/accounts \
    -d '{"payto_uri":"payto://x-taler-bank/localhost:8082/43?receiver-name=not-user-43"}' \
    -w "%{http_code}" -s -o "$LAST_RESPONSE")


if [ "$STATUS" != "409" ]
then
    cat "$LAST_RESPONSE" >&2
    exit_fail "Expected 409 Conflict. Got: $STATUS"
fi

STATUS=$(curl -H "Content-Type: application/json" -X GET \
    -H 'Authorization: Bearer secret-token:new_value' \
    http://localhost:9966/private/accounts/$ACCOUNT_ID \
    -w "%{http_code}" -s -o "$LAST_RESPONSE")

ACTIVE=$(jq -r .active $LAST_RESPONSE)

if [ "$ACTIVE" != "true" ]
then
    cat "$LAST_RESPONSE" >&2
    exit_fail "Expected account active."
fi

echo "OK" >&2



echo -n "deleting the account ..." >&2

STATUS=$(curl -H "Content-Type: application/json" -X DELETE \
    -H 'Authorization: Bearer secret-token:new_value' \
    http://localhost:9966/private/accounts/$ACCOUNT_ID \
    -w "%{http_code}" -s )

if [ "$STATUS" != "204" ]
then
    cat "$LAST_RESPONSE" >&2
    exit_fail "Expected 204 OK. Got: $STATUS"
fi

echo "OK" >&2

echo -n "now make it active again ..." >&2

STATUS=$(curl -H "Content-Type: application/json" -X POST \
    -H 'Authorization: Bearer secret-token:new_value' \
    http://localhost:9966/private/accounts \
    -d '{"payto_uri":"payto://x-taler-bank/localhost:8082/43?receiver-name=not-user-43"}' \
    -w "%{http_code}" -s -o "$LAST_RESPONSE")


if [ "$STATUS" != "200" ]
then
    cat "$LAST_RESPONSE" >&2
    exit_fail "Expected 200 OK. Got: $STATUS"
fi

ACCOUNT_ID=$(jq -r .h_wire $LAST_RESPONSE)

STATUS=$(curl -H "Content-Type: application/json" -X GET \
    -H 'Authorization: Bearer secret-token:new_value' \
    http://localhost:9966/private/accounts/$ACCOUNT_ID \
    -w "%{http_code}" -s -o "$LAST_RESPONSE")

ACTIVE=$(jq -r .active $LAST_RESPONSE)

if [ "$ACTIVE" != "true" ]
then
    cat "$LAST_RESPONSE" >&2
    exit_fail "Expected account active."
fi


echo " OK" >&2

##
# Activating the account again with different values should not break.
##

echo -n "creating second account ..." >&2

STATUS=$(curl -H "Content-Type: application/json" -X POST \
    -H 'Authorization: Bearer secret-token:new_value' \
    http://localhost:9966/private/accounts \
    -d '{"payto_uri":"payto://x-taler-bank/localhost:8082/12?receiver-name=user12"}' \
    -w "%{http_code}" -s -o "$LAST_RESPONSE")


if [ "$STATUS" != "200" ]
then
    cat "$LAST_RESPONSE" >&2
    exit_fail "Expected 200 OK. Got: $STATUS"
fi

echo "OK" >&2


ACCOUNT_ID=$(jq -r .h_wire $LAST_RESPONSE)

STATUS=$(curl -H "Content-Type: application/json" -X GET \
    -H 'Authorization: Bearer secret-token:new_value' \
    http://localhost:9966/private/accounts/$ACCOUNT_ID \
    -w "%{http_code}" -s -o "$LAST_RESPONSE")

if [ "$STATUS" != "200" ]
then
    cat "$LAST_RESPONSE" >&2
    exit_fail "Expected 200 OK. Got: $STATUS"
fi

ACTIVE=$(jq -r .active $LAST_RESPONSE)

if [ "$ACTIVE" != "true" ]
then
    cat "$LAST_RESPONSE" >&2
    exit_fail "Expected account active."
fi

echo -n "deleting second account ..." >&2

STATUS=$(curl -H "Content-Type: application/json" -X DELETE \
    -H 'Authorization: Bearer secret-token:new_value' \
    http://localhost:9966/private/accounts/$ACCOUNT_ID \
    -w "%{http_code}" -s )

if [ "$STATUS" != "204" ]
then
    cat "$LAST_RESPONSE" >&2
    exit_fail "Expected 204 OK. Got: $STATUS"
fi

echo "OK" >&2

echo -n "make it active with different facade ..." >&2

STATUS=$(curl -H "Content-Type: application/json" -X POST \
    -H 'Authorization: Bearer secret-token:new_value' \
    http://localhost:9966/private/accounts \
    -d '{"payto_uri":"payto://x-taler-bank/localhost:8082/12?receiver-name=user12", "credit_facade_credentials":{"type":"none"},"credit_facade_url":"http://asd.com/"}' \
    -w "%{http_code}" -s -o "$LAST_RESPONSE")


if [ "$STATUS" != "200" ]
then
    cat "$LAST_RESPONSE" >&2
    exit_fail "Expected 200 OK. Got: $STATUS"
fi

STATUS=$(curl -H "Content-Type: application/json" -X GET \
    -H 'Authorization: Bearer secret-token:new_value' \
    http://localhost:9966/private/accounts/$ACCOUNT_ID \
    -w "%{http_code}" -s -o "$LAST_RESPONSE")

ACTIVE=$(jq -r .active "$LAST_RESPONSE")

if [ "$ACTIVE" != "true" ]
then
    cat "$LAST_RESPONSE" >&2
    exit_fail "Expected account active."
fi

FACADE=$(jq -r .credit_facade_url "$LAST_RESPONSE")

if [ "$FACADE" != "http://asd.com/" ]
then
    cat "$LAST_RESPONSE" >&2
    exit_fail "Expected account with facade http://asd.com/."
fi

echo "OK" >&2

##
# Still, the previous activation should only work if the account is deactivated, the same as if the account was deleted.
# Trying to create when there is already an active account but with different values should return Conflict 409.
##

echo -n "should validate conflict ..." >&2

STATUS=$(curl -H "Content-Type: application/json" -X POST \
    -H 'Authorization: Bearer secret-token:new_value' \
    http://localhost:9966/private/accounts \
    -d '{"payto_uri":"payto://x-taler-bank/localhost:8082/12?receiver-name=user12", "credit_facade_credentials":{"type":"none"},"credit_facade_url":"http://invalid.com/"}' \
    -w "%{http_code}" -s -o "$LAST_RESPONSE")


if [ "$STATUS" != "409" ]
then
    cat "$LAST_RESPONSE" >&2
    exit_fail "Expected 409 Conflict. Got: $STATUS"
fi

echo "OK" >&2

echo "Test PASSED"

exit 0
