#!/bin/bash

set -o errexit
set -o nounset
set -o pipefail
set -x

PID=$$

if [[ $OSTYPE == "msys" ]]; then
    echo ""
    # trap "TASKKILL /PID ${PID} /T" EXIT
else
    trap "pkill -P ${PID}" EXIT
fi

WG_SERVER_IP="13.53.70.215"
WG_SERVER_PORT="53865"
WG_SERVER_ADDR="${WG_SERVER_IP}:${WG_SERVER_PORT}"

CONFIG_CONVERTER_IP="127.0.0.1"
CONFIG_CONVERTER_PORT="8080"
CONFIG_CONVERTER_ADDR="${CONFIG_CONVERTER_IP}":"${CONFIG_CONVERTER_PORT}"

PLAYER_REST_SERVER_ADDR="127.0.0.1:38080"
STREAMER_REST_SERVER_ADDR="127.0.0.1:38090"

cd "$(dirname "${BASH_SOURCE[0]}")"

curl -s -X DELETE http://${WG_SERVER_ADDR}/api/interface \
    -H 'Content-Type: application/json' \
    -d "{\"couplingId\":\"SOME_COOL_ID\"}"

# Build and copy Phantom plugin
bash ../build.sh

# Start Oden
"C:\\Program Files\\OdenVR\\OdenVR.exe" &
"C:\\Program Files\\Oden Streamer\\OdenStreamer.exe" &

# Wait until everything is started
sleep 10

# Add WG interface for coupling
WG_INTERFACE=$(curl -s -X POST http://${WG_SERVER_ADDR}/api/interface \
    -H 'Content-Type: application/json' \
    -d "{\"couplingId\":\"SOME_COOL_ID\"}")

WG_INTERFACE_SUBNET=$(echo $WG_INTERFACE | jq '.interfaceSubnet')
WG_INTERFACE_PUBLIC_KEY=$(echo $WG_INTERFACE | jq '.publicKey')
WG_INTERFACE_PORT=$(echo $WG_INTERFACE | jq '.port')

PHANTOM_CONFIG=$(cat phantom_config.json | jq --arg WG_INTERFACE_PORT $WG_INTERFACE_PORT '(.wireguard.port) |= $WG_INTERFACE_PORT')
PHANTOM_CONFIG=$(echo "$PHANTOM_CONFIG" | jq --arg WG_SERVER_IP $WG_SERVER_IP '(.wireguard.ip) |= $WG_SERVER_IP')
PHANTOM_CONFIG=$(echo "$PHANTOM_CONFIG" | jq --arg WG_INTERFACE_SUBNET $WG_INTERFACE_SUBNET '(.wireguard.subnet) |= $WG_INTERFACE_SUBNET')
PHANTOM_CONFIG=$(echo "$PHANTOM_CONFIG" | jq --arg WG_INTERFACE_PUBLIC_KEY $WG_INTERFACE_PUBLIC_KEY '(.wireguard.publicKey) |= $WG_INTERFACE_PUBLIC_KEY')

echo $PHANTOM_CONFIG >temp_config.json
sed -i 's/\\\"//g' temp_config.json
cat temp_config.json | jq '.' >temp_config.json

# Convert Phantom config to .vproj
ODEN_CONFIG=$(curl -s -X POST -H "Content-Type: application/json" -d @./temp_config.json http://${CONFIG_CONVERTER_ADDR}/v1/config)

PLAYER_CONFIG="{\"config\":$(echo "$ODEN_CONFIG" | jq .player),\"session_id\":\"test_session_id\"}"
STREAMER_CONFIG="{\"config\":$(echo "$ODEN_CONFIG" | jq .streamer),\"session_id\":\"test_session_id\"}"

# Load project in Player
PLAYER_PUBLIC_KEYS=$(curl -s -X POST http://${PLAYER_REST_SERVER_ADDR}/v1/load_project \
    -H 'Content-Type: application/json' \
    -d "$PLAYER_CONFIG")

PLAYER_LINK_1_KEY=$(echo $PLAYER_PUBLIC_KEYS | jq '.links[.links | keys[0]]')
PLAYER_LINK_2_KEY=$(echo $PLAYER_PUBLIC_KEYS | jq '.links[.links | keys[1]]')

PLAYER_LINK_1_IP=$(echo $PLAYER_PUBLIC_KEYS | jq '.links | keys[0]')
PLAYER_LINK_2_IP=$(echo $PLAYER_PUBLIC_KEYS | jq '.links | keys[1]')

curl -s -X POST http://${WG_SERVER_ADDR}/api/peers \
    -H 'Content-Type: application/json' \
    -d "{\"couplingId\":\"SOME_COOL_ID\",\"links\":{${PLAYER_LINK_1_IP}:${PLAYER_LINK_1_KEY},${PLAYER_LINK_2_IP}:${PLAYER_LINK_2_KEY}}}"

# Load project in Streamer
STREAMER_PUBLIC_KEYS=$(curl -s -X POST http://${STREAMER_REST_SERVER_ADDR}/v1/load_project \
    -H 'Content-Type: application/json' \
    -d "$STREAMER_CONFIG")

STREAMER_LINK_1_KEY=$(echo $STREAMER_PUBLIC_KEYS | jq '.links[.links | keys[0]]')
STREAMER_LINK_2_KEY=$(echo $STREAMER_PUBLIC_KEYS | jq '.links[.links | keys[1]]')

STREAMER_LINK_1_IP=$(echo $STREAMER_PUBLIC_KEYS | jq '.links | keys[0]')
STREAMER_LINK_2_IP=$(echo $STREAMER_PUBLIC_KEYS | jq '.links | keys[1]')

curl -s -X POST http://${WG_SERVER_ADDR}/api/peers \
    -H 'Content-Type: application/json' \
    -d "{\"couplingId\":\"SOME_COOL_ID\",\"links\":{${STREAMER_LINK_1_IP}:${STREAMER_LINK_1_KEY},${STREAMER_LINK_2_IP}:${STREAMER_LINK_2_KEY}}}"
