#!/bin/bash
#
#  This file is part of TALER
#  Copyright (C) 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)
            # Legal entity type is required.
            echo "SWISS_VQF_LEGAL_ENTITY_TYPE"
            exit 0
            ;;
        c)
            # shellcheck disable=SC2034
            CONF="$OPTARG"
            ;;
        h)
            echo "This is a KYC measure program that determines the next VQF form to ask for (if any) based on the type of legal entity the customer claimed to be on the primary form."
            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)
            # Need context and current_rules.
            echo "attributes"
            echo "current_rules"
            exit 0
            ;;
        r)
            # Nothing needed from context
            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.

# First, extract inputs we need
INPUTS=$(jq '{"current_rules":.current_rules,"attributes":.attributes}')

# Get entity type
LEGAL_ENTITY=$(echo "$INPUTS" | jq '.attributes.SWISS_VQF_LEGAL_ENTITY_TYPE // null')
# Get current rules.
CURRENT_RULES=$(echo "$INPUTS" | jq '.current_rules // null')
# Get context values.
EXPIRATION_TIME=$(echo "$INPUTS" | jq '.context.expiration_time // .current_rules.expiration_time // null')

case "$LEGAL_ENTITY"
in
    "NATURAL")
        FORM="none"
    ;;
    "OPERATIONAL")
        FORM="902.11"
    ;;
    "FOUNDATION")
        FORM="902.12"
    ;;
    "TRUST")
        FORM="902.13"
    ;;
    "LIFEINSURANCE")
        FORM="902.15"
    ;;
    "OTHER")
        FORM="902.9"
    ;;
esac

# Check high-level case
if [ "$FORM" == "none" ]
then
    # Proceed to AML stage, preserve rules
    # FIXME: check if we have to change anything in the rules to prevent
    # the user from getting the basic KYC form *again*!
    echo "$INPUTS" | taler-exchange-helper-measure-preserve-but-investigate
    exit $?
fi

# Proceed to FORM.
echo "Selected VQF form ${FORM}." 1&>2
# FIXME: force user to fill in $FORM
# FIXME: instead of this insanity, match against rule_name!
#    NEW_RULES=$(echo "$CURRENT_RULES" | jq 'walk(if (type == "object" and ( ( (.operation_type == "withdraw") and (.threshold == "${EXCHANGE_AML_PROGRAM_TOPS_SMS_WITHDRAW_THRESHOLD") ) or ( (.operation_type == "merge") and (.threshold == "${EXCHANGE_AML_PROGRAM_TOPS_SMS_MERGE_THRESHOLD" ) ) ) ) then del(.) else . end)')
echo "Not implemented"
exit 1 # not implemented

# Finally, output the new rules.
# See https://docs.taler.net/taler-kyc-manual.html#tsref-type-AmlOutcome
# for the required output format.
jq \
    --jsonarg et "$EXPIRATION_TIME" \
    --jsonarg sm "$SUCCESSOR_MEASURE" \
    --jsonarg cm "$CUSTOM_MEASURES" \
    --jsonarg nr "$NEW_RULES" \
    '{"new_rules":$nr+{"expiration_time":$et,"successor_measure":$sm,"custom_measures":($nr.custom_measures+$cm)}}|del(..|nulls)'

exit 0
