#!/usr/bin/env bash
# =============================================================================
# Twosome – Comprehensive Backend API Integration Smoke Test
# Usage: ./api_test.sh [API_BASE_URL]
# Default: http://localhost:8000
# =============================================================================

set -euo pipefail

BASE_URL="${1:-http://localhost:8000}"
echo "=== Twosome API Test Suite ==="
echo "Target: ${BASE_URL}"

# 1. Health check
echo -n "Checking GET /v1/health... "
HEALTH_RESP=$(curl -s "${BASE_URL}/v1/health")
echo "${HEALTH_RESP}" | grep -q '"status":"ok"' && echo "PASS" || { echo "FAIL: ${HEALTH_RESP}"; exit 1; }

# Helper: Random phone generator for clean test runs
RAND_SUFFIX=$((100000 + RANDOM % 900000))
PHONE_A="+919876${RAND_SUFFIX}"
PHONE_B="+919875${RAND_SUFFIX}"
PASSWORD="StrongSecretPass99#"

echo "User A: ${PHONE_A}"
echo "User B: ${PHONE_B}"

# 2. Register User A
echo -n "Registering User A... "
REG_A_RESP=$(curl -s -X POST "${BASE_URL}/v1/auth/register" \
  -H "Content-Type: application/json" \
  -d "{\"phone_e164\":\"${PHONE_A}\",\"password\":\"${PASSWORD}\",\"display_name\":\"Partner A\",\"birth_year\":1998}")
echo "${REG_A_RESP}" | grep -q '"access_token"' && echo "PASS" || { echo "FAIL: ${REG_A_RESP}"; exit 1; }

TOKEN_A=$(echo "${REG_A_RESP}" | grep -o '"access_token":"[^"]*' | cut -d'"' -f4)

# 3. Register User B
echo -n "Registering User B... "
REG_B_RESP=$(curl -s -X POST "${BASE_URL}/v1/auth/register" \
  -H "Content-Type: application/json" \
  -d "{\"phone_e164\":\"${PHONE_B}\",\"password\":\"${PASSWORD}\",\"display_name\":\"Partner B\",\"birth_year\":1999}")
echo "${REG_B_RESP}" | grep -q '"access_token"' && echo "PASS" || { echo "FAIL: ${REG_B_RESP}"; exit 1; }

TOKEN_B=$(echo "${REG_B_RESP}" | grep -o '"access_token":"[^"]*' | cut -d'"' -f4)

# 4. Keys: User A & B set public keys
echo -n "Setting Public Key A... "
curl -s -X PUT "${BASE_URL}/v1/keys/public" \
  -H "Authorization: Bearer ${TOKEN_A}" \
  -H "Content-Type: application/json" \
  -d '{"public_key":"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA"}' | grep -q '"saved":true' && echo "PASS" || echo "FAIL"

curl -s -X PUT "${BASE_URL}/v1/keys/public" \
  -H "Authorization: Bearer ${TOKEN_B}" \
  -H "Content-Type: application/json" \
  -d '{"public_key":"BIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEB"}' > /dev/null

# 5. Pairing: User A creates couple space
echo -n "User A creating couple... "
CREATE_RESP=$(curl -s -X POST "${BASE_URL}/v1/couple" \
  -H "Authorization: Bearer ${TOKEN_A}")
echo "${CREATE_RESP}" | grep -q '"invite_code"' && echo "PASS" || { echo "FAIL: ${CREATE_RESP}"; exit 1; }

INVITE_CODE=$(echo "${CREATE_RESP}" | grep -o '"invite_code":"[^"]*' | cut -d'"' -f4)
echo "Invite Code generated: ${INVITE_CODE}"

# 6. Pairing: User B joins with invite code
echo -n "User B joining couple with code... "
JOIN_RESP=$(curl -s -X POST "${BASE_URL}/v1/couple/join" \
  -H "Authorization: Bearer ${TOKEN_B}" \
  -H "Content-Type: application/json" \
  -d "{\"code\":\"${INVITE_CODE}\"}")
echo "${JOIN_RESP}" | grep -q '"couple_id"' && echo "PASS" || { echo "FAIL: ${JOIN_RESP}"; exit 1; }

# 7. Get couple info
echo -n "Fetching couple info for User A... "
COUPLE_INFO=$(curl -s "${BASE_URL}/v1/couple" -H "Authorization: Bearer ${TOKEN_A}")
echo "${COUPLE_INFO}" | grep -q '"member_count":2' && echo "PASS" || { echo "FAIL: ${COUPLE_INFO}"; exit 1; }

# 8. Partner key exchange
echo -n "User A fetching partner public key... "
curl -s "${BASE_URL}/v1/couple/partner-key" -H "Authorization: Bearer ${TOKEN_A}" | grep -q '"public_key":"BIIBI' && echo "PASS" || echo "FAIL"

# 9. Send and Poll Chat Message
echo -n "User A sending encrypted message to User B... "
SEND_MSG_RESP=$(curl -s -X POST "${BASE_URL}/v1/messages" \
  -H "Authorization: Bearer ${TOKEN_A}" \
  -H "Content-Type: application/json" \
  -d '{"ciphertext":"dGVzdF9jaXBoZXJ0ZXh0X2hlcmU=","nonce":"bm9uY2VfMjRfYnl0ZXNfaGVyZQ==","type":"text"}')
echo "${SEND_MSG_RESP}" | grep -q '"message"' && echo "PASS" || { echo "FAIL: ${SEND_MSG_RESP}"; exit 1; }

MSG_ID=$(echo "${SEND_MSG_RESP}" | grep -o '"id":[0-9]*' | head -1 | cut -d':' -f2)

echo -n "User B polling messages... "
POLL_RESP=$(curl -s "${BASE_URL}/v1/messages" -H "Authorization: Bearer ${TOKEN_B}")
echo "${POLL_RESP}" | grep -q "\"id\":${MSG_ID}" && echo "PASS" || { echo "FAIL: ${POLL_RESP}"; exit 1; }

# 10. React to message
echo -n "User B reacting with heart emoji... "
curl -s -X POST "${BASE_URL}/v1/messages/${MSG_ID}/react" \
  -H "Authorization: Bearer ${TOKEN_B}" \
  -H "Content-Type: application/json" \
  -d '{"emoji":"❤️"}' | grep -q '"reacted":true' && echo "PASS" || echo "FAIL"

# 11. Read receipt
echo -n "User B marking message read... "
curl -s -X POST "${BASE_URL}/v1/messages/${MSG_ID}/read" \
  -H "Authorization: Bearer ${TOKEN_B}" | grep -q '"read":true' && echo "PASS" || echo "FAIL"

# 12. Games: Check Packs
echo -n "Fetching game packs (spicy should be hidden before mutual opt-in)... "
PACKS_RESP=$(curl -s "${BASE_URL}/v1/packs" -H "Authorization: Bearer ${TOKEN_A}")
echo "${PACKS_RESP}" | grep -q '"spicy_allowed":false' && echo "PASS" || echo "FAIL"

# 13. Daily: Fetch and Answer
echo -n "Fetching Daily Question... "
DAILY_RESP=$(curl -s "${BASE_URL}/v1/daily" -H "Authorization: Bearer ${TOKEN_A}")
echo "${DAILY_RESP}" | grep -q '"question"' && echo "PASS" || echo "FAIL"
QID=$(echo "${DAILY_RESP}" | grep -o '"id":[0-9]*' | head -1 | cut -d':' -f2)

echo -n "User A answering Daily Question... "
curl -s -X POST "${BASE_URL}/v1/daily/answer" \
  -H "Authorization: Bearer ${TOKEN_A}" \
  -H "Content-Type: application/json" \
  -d "{\"question_id\":${QID},\"answer\":\"I loved our morning coffee today.\"}" | grep -q '"answered":true' && echo "PASS" || echo "FAIL"

# 14. Mood Check-in
echo -n "User A posting mood... "
curl -s -X POST "${BASE_URL}/v1/mood" \
  -H "Authorization: Bearer ${TOKEN_A}" \
  -H "Content-Type: application/json" \
  -d '{"mood":5,"note":"Feeling deeply grateful"}' | grep -q '"mood":5' && echo "PASS" || echo "FAIL"

echo -n "User B fetching latest mood... "
curl -s "${BASE_URL}/v1/mood/latest" -H "Authorization: Bearer ${TOKEN_B}" | grep -q '"partner_mood"' && echo "PASS" || echo "FAIL"

# 15. Thinking of You Ping
echo -n "User B sending Thinking of You heart ping... "
curl -s -X POST "${BASE_URL}/v1/daily/ping" -H "Authorization: Bearer ${TOKEN_B}" | grep -q '"sent":true' && echo "PASS" || echo "FAIL"

echo "=== All Core Twosome API Smoke Tests Passed! ==="
