#!/bin/bash
#
#  This file is part of TALER
#  Copyright (C) 2014-2024 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, If not, see <http://www.gnu.org/license>
#

# Hard error reporting on.
set -eu



# Exit, with error message (hard failure)
function exit_fail() {
    echo " FAIL: " "$@" >&2
    EXIT_STATUS=1
    exit "$EXIT_STATUS"
}

CONF="$HOME/.config/taler-exchange.conf"
VERBOSE=0

while getopts 'ac:hirvV' OPTION;
do
    case "$OPTION" in
        a)
            # No attributes are required.
            exit 0
            ;;
        c)
            # shellcheck disable=SC2034
            CONF="$OPTARG"
            ;;
        h)
            echo "This is a KYC measure program that freezes the account and flags it for manual investigation. This is the ultimate fallback measure."
            echo 'Supported options:'
            echo '  -a           -- show required attributes'
            # shellcheck disable=SC2016
            echo '  -c $CONF     -- set configuration'
            echo '  -h           -- print this help'
            echo '  -i           -- show required inputs'
            echo '  -r           -- show required context'
            echo '  -v           -- show version'
            echo '  -V           -- be verbose'
            exit 0
            ;;
        i)
            # No inputs are required
            exit 0
            ;;
        r)
            # No context is required.
            exit 0
            ;;
        v)
            echo "$0 v0.0.0"
            exit 0
            ;;
        V)
            VERBOSE=1
            ;;
        ?)
        exit_fail "Unrecognized command line option"
        ;;
    esac
done

if [ 1 = "$VERBOSE" ]
then
    echo "Running $0" 1>&2
fi


# See https://docs.taler.net/taler-kyc-manual.html#tsref-type-AmlProgramInput
# for the full JSON with possible inputs.

# New rules apply for 30 days.
EXPIRATION=$((3600 * 30 + $(date +%s)))

# Read currency from the config
CURRENCY=$(taler-exchange-config -c "$CONF" -s exchange -o currency)

# Finally, output the new rules.
# See https://docs.taler.net/taler-kyc-manual.html#tsref-type-AmlOutcome
# for the required output format.

jq -n \
    --argjson expiration "$EXPIRATION" \
    --arg currency "$CURRENCY" \
    '{ "to_investigate": true,
       "new_rules" : {
         "new_measures" : "info-frozen",
         "custom_measures" : {},
         "expiration_time" : { "t_s": $expiration },
         "rules" : [
           {
             "operation_type": "WITHDRAW",
             "threshold" : "\($currency):0",
             "timeframe" : { "d_us" : 3600000000 },
             "measures" : [ "verboten" ],
             "display_priority" : 1,
             "exposed" : false,
             "is_and_combinator" : true
           },
           {
             "operation_type": "DEPOSIT",
             "threshold" : "\($currency):0",
             "timeframe" : { "d_us" : 3600000000 },
             "measures" : [ "verboten" ],
             "display_priority" : 1,
             "exposed" : false,
             "is_and_combinator" : true
           },
           {
             "operation_type": "AGGREGATE",
             "threshold" : "\($currency):0",
             "timeframe" : { "d_us" : 3600000000 },
             "measures" : [ "verboten" ],
             "display_priority" : 1,
             "exposed" : false,
             "is_and_combinator" : true
           },
           {
             "operation_type": "MERGE",
             "threshold" : "\($currency):0",
             "timeframe" : { "d_us" : 3600000000 },
             "measures" : [ "verboten" ],
             "display_priority" : 1,
             "exposed" : false,
             "is_and_combinator" : true
           },
           {
             "operation_type": "BALANCE",
             "threshold" : "\($currency):0",
             "timeframe" : { "d_us" : 3600000000 },
             "measures" : [ "verboten" ],
             "display_priority" : 1,
             "exposed" : false,
             "is_and_combinator" : true
           },
           {
             "operation_type": "CLOSE",
             "threshold" : "\($currency):0",
             "timeframe" : { "d_us" : 3600000000 },
             "measures" : [ "verboten" ],
             "display_priority" : 1,
             "exposed" : false,
             "is_and_combinator" : true
           },
           {
             "operation_type": "TRANSACTION",
             "threshold" : "\($currency):0",
             "timeframe" : { "d_us" : 3600000000 },
             "measures" : [ "verboten" ],
             "display_priority" : 1,
             "exposed" : false,
             "is_and_combinator" : true
           },
           {
             "operation_type": "REFUND",
             "threshold" : "\($currency):0",
             "timeframe" : { "d_us" : 3600000000 },
             "measures" : [ "verboten" ],
             "display_priority" : 1,
             "exposed" : false,
             "is_and_combinator" : true
           }
         ]
       }
     }' < /dev/null
