#!/bin/bash

# Complete UPI PSP API Test Suite
# Tests all 8 UPI APIs as per NPCI specification

echo "🚀 Starting Complete UPI PSP API Test Suite"
echo "============================================"

BASE_URL="http://localhost:4000/api/v1"
CONTENT_TYPE="Content-Type: application/xml"

# Colors for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# Test counter
TOTAL_TESTS=0
PASSED_TESTS=0

# Helper function to run tests
run_test() {
    local test_name="$1"
    local endpoint="$2"
    local xml_data="$3"
    local expected_response="$4"
    
    echo -e "\n${BLUE}📋 Test: $test_name${NC}"
    echo "Endpoint: $endpoint"
    
    TOTAL_TESTS=$((TOTAL_TESTS + 1))
    
    response=$(curl -s -X POST "$BASE_URL$endpoint" \
        -H "$CONTENT_TYPE" \
        -d "$xml_data")
    
    echo "Response: $response"
    
    if echo "$response" | grep -q "$expected_response"; then
        echo -e "${GREEN}✅ PASSED${NC}"
        PASSED_TESTS=$((PASSED_TESTS + 1))
    else
        echo -e "${RED}❌ FAILED${NC}"
    fi
    
    echo "----------------------------------------"
}

echo -e "\n${YELLOW}Phase 1: Testing Core UPI APIs${NC}"

# Test 1: ReqValQR - QR Validation Request
run_test "API 1: QR Validation Request (ReqValQR)" \
    "/upi/validate-qr" \
    '<?xml version="1.0" encoding="UTF-8"?>
    <ReqValQr>
        <Head ver="1.0" ts="2024-01-15T10:30:00+05:30" orgId="NPCI" msgId="MSG123456789"/>
        <QrData qrString="upi://pay?pa=merchant@paytm&pn=TestMerchant&tr=TXN123&am=100.00"/>
        <ExpireAfter>300</ExpireAfter>
    </ReqValQr>' \
    "RespValQr"

# Test 2: ReqPay - Payment Request (CREDIT)
run_test "API 3: Payment Request - CREDIT (ReqPay)" \
    "/upi/process-payment" \
    '<?xml version="1.0" encoding="UTF-8"?>
    <ReqPay>
        <Head ver="1.0" ts="2024-01-15T10:35:00+05:30" orgId="NPCI" msgId="MSG987654321"/>
        <Txn id="UPI123456789" orgTxnId="NPCI123456789" note="International Payment" refId="REF123" type="PAY" custRef="CUST123"/>
        <Amount curr="INR" value="1000.00"/>
        <Payer addr="customer@sbi" name="John Doe"/>
        <Payee addr="merchant@paytm" name="Test Merchant" type="ENTITY" code="5411"/>
    </ReqPay>' \
    "RespPay"

# Test 3: ReqChkTxn - Check Transaction Request
run_test "API 5: Check Transaction Request (ReqChkTxn)" \
    "/upi/check-transaction" \
    '<?xml version="1.0" encoding="UTF-8"?>
    <ReqChkTxn>
        <Head ver="1.0" ts="2024-01-15T10:40:00+05:30" orgId="NPCI" msgId="MSG555666777"/>
        <Txn orgTxnId="NPCI123456789"/>
    </ReqChkTxn>' \
    "RespChkTxn"

# Test 4: ReqHbt - Heartbeat Request
run_test "API 7: Heartbeat Request (ReqHbt)" \
    "/upi/heartbeat" \
    '<?xml version="1.0" encoding="UTF-8"?>
    <ReqHbt>
        <Head ver="1.0" ts="2024-01-15T10:45:00+05:30" orgId="NPCI" msgId="HBT123456789"/>
    </ReqHbt>' \
    "RespHbt"

echo -e "\n${YELLOW}Phase 2: Testing Reversal Flow${NC}"

# Test 5: ReqPay - Payment Request (REVERSAL)
run_test "API 3: Payment Request - REVERSAL (ReqPay)" \
    "/upi/process-payment" \
    '<?xml version="1.0" encoding="UTF-8"?>
    <ReqPay>
        <Head ver="1.0" ts="2024-01-15T10:50:00+05:30" orgId="NPCI" msgId="MSG111222333"/>
        <Txn id="UPI123456789" orgTxnId="NPCI123456789" note="Transaction Reversal" refId="REF123" type="REVERSAL" custRef="CUST123"/>
        <Amount curr="INR" value="1000.00"/>
        <Payer addr="customer@sbi" name="John Doe"/>
        <Payee addr="merchant@paytm" name="Test Merchant" type="ENTITY" code="5411"/>
    </ReqPay>' \
    "RespPay"

echo -e "\n${YELLOW}Phase 3: Testing Enhanced APIs${NC}"

# Test 6: Batch Check Transactions
run_test "Enhanced API: Batch Check Transactions" \
    "/upi/batch-check" \
    '<?xml version="1.0" encoding="UTF-8"?>
    <BatchReqChkTxn>
        <Head ver="1.0" ts="2024-01-15T11:00:00+05:30" orgId="NPCI" msgId="BATCH123456"/>
        <Transactions>
            <orgTxnId>NPCI123456789</orgTxnId>
            <orgTxnId>NPCI987654321</orgTxnId>
        </Transactions>
    </BatchReqChkTxn>' \
    "BatchRespChkTxn"

# Test 7: Reconciliation Request
run_test "Enhanced API: Reconciliation" \
    "/upi/reconciliation" \
    '<?xml version="1.0" encoding="UTF-8"?>
    <ReqReconciliation>
        <Head ver="1.0" ts="2024-01-15T11:05:00+05:30" orgId="NPCI" msgId="RECON123456"/>
        <fromDate>2024-01-15T00:00:00+05:30</fromDate>
        <toDate>2024-01-15T23:59:59+05:30</toDate>
    </ReqReconciliation>' \
    "RespReconciliation"

# Test 8: Mandate Request
run_test "Enhanced API: Mandate Request" \
    "/upi/mandate" \
    '<?xml version="1.0" encoding="UTF-8"?>
    <ReqMandate>
        <Head ver="1.0" ts="2024-01-15T11:10:00+05:30" orgId="NPCI" msgId="MANDATE123456"/>
        <mandateId>MND123456789</mandateId>
        <amount>500.00</amount>
        <frequency>MONTHLY</frequency>
    </ReqMandate>' \
    "RespMandate"

echo -e "\n${YELLOW}Phase 4: Testing Error Scenarios${NC}"

# Test 9: Invalid XML Request
run_test "Error Test: Invalid XML" \
    "/upi/validate-qr" \
    '<InvalidXML><broken>' \
    "ErrorResponse"

# Test 10: Missing Required Fields
run_test "Error Test: Missing Required Fields" \
    "/upi/process-payment" \
    '<?xml version="1.0" encoding="UTF-8"?>
    <ReqPay>
        <Head ver="1.0" ts="2024-01-15T11:15:00+05:30" orgId="NPCI"/>
    </ReqPay>' \
    "FAILURE"

echo -e "\n${YELLOW}Phase 5: Performance Tests${NC}"

# Test 11: Concurrent Requests
echo -e "\n${BLUE}📋 Test: Concurrent Request Handling${NC}"
echo "Running 5 concurrent heartbeat requests..."

pids=()
for i in {1..5}; do
    (
        response=$(curl -s -X POST "$BASE_URL/upi/heartbeat" \
            -H "$CONTENT_TYPE" \
            -d '<?xml version="1.0" encoding="UTF-8"?>
            <ReqHbt>
                <Head ver="1.0" ts="2024-01-15T11:20:00+05:30" orgId="NPCI" msgId="HBT'$i'"/>
            </ReqHbt>')
        echo "Response $i: $response"
    ) &
    pids+=($!)
done

# Wait for all background jobs to complete
for pid in "${pids[@]}"; do
    wait $pid
done

TOTAL_TESTS=$((TOTAL_TESTS + 1))
if [ ${#pids[@]} -eq 5 ]; then
    echo -e "${GREEN}✅ PASSED - All concurrent requests completed${NC}"
    PASSED_TESTS=$((PASSED_TESTS + 1))
else
    echo -e "${RED}❌ FAILED - Concurrent request handling failed${NC}"
fi

echo -e "\n${YELLOW}Phase 6: Compliance Verification${NC}"

# Test 12: XML Schema Validation
run_test "Compliance: Valid UPI XML Schema" \
    "/upi/validate-qr" \
    '<?xml version="1.0" encoding="UTF-8"?>
    <ReqValQr>
        <Head ver="1.0" ts="2024-01-15T11:25:00+05:30" orgId="NPCI" msgId="COMPLIANCE123"/>
        <QrData qrString="upi://pay?pa=merchant@paytm&pn=TestMerchant&tr=TXN123&am=100.00"/>
        <ExpireAfter>300</ExpireAfter>
        <Rules>INTL</Rules>
    </ReqValQr>' \
    "SUCCESS"

# Test 13: Error Code Compliance
run_test "Compliance: UPI Error Codes" \
    "/upi/check-transaction" \
    '<?xml version="1.0" encoding="UTF-8"?>
    <ReqChkTxn>
        <Head ver="1.0" ts="2024-01-15T11:30:00+05:30" orgId="NPCI" msgId="ERROR123"/>
        <Txn orgTxnId="NONEXISTENT"/>
    </ReqChkTxn>' \
    "errCode"

echo -e "\n${YELLOW}Test Results Summary${NC}"
echo "============================================"
echo -e "Total Tests: ${BLUE}$TOTAL_TESTS${NC}"
echo -e "Passed: ${GREEN}$PASSED_TESTS${NC}"
echo -e "Failed: ${RED}$((TOTAL_TESTS - PASSED_TESTS))${NC}"

if [ $PASSED_TESTS -eq $TOTAL_TESTS ]; then
    echo -e "\n${GREEN}🎉 ALL TESTS PASSED! UPI PSP Implementation is COMPLIANT${NC}"
    exit 0
else
    echo -e "\n${RED}⚠️  Some tests failed. Please review the implementation.${NC}"
    exit 1
fi
