#!/bin/bash

if [[ ${DEBUG} -gt 0 ]]; then set -x; fi

set -e

if [[ ! -v BRIDGE_NAME ]]; then
    echo "Environment variable BRIDGE_NAME is missing."
    exit 1
fi

POD_NS=$2
SUBNET_CIDR=$3
SUBNET_CIDR_SUFFIX="${SUBNET_CIDR#*/}"

POD_IP=$4
HOST_VETH="host-veth-$POD_NS"
GATEWAY_IP="${POD_IP%.*}.1"
HOST_IP="${POD_IP%.*}.1"
HOST_CIDR="$HOST_IP/$SUBNET_CIDR_SUFFIX"


delete_bridge() {

    if ip link show "$BRIDGE_NAME" > /dev/null 2>&1; then
        echo "Starting teardown for bridge $BRIDGE_NAME ($HOST_CIDR)."
        
        sudo ip addr del "$HOST_CIDR" dev "$BRIDGE_NAME" 2>/dev/null
        sudo ip link set "$BRIDGE_NAME" down
        sudo ip link del "$BRIDGE_NAME" type bridge
        
        echo "Bridge $BRIDGE_NAME deleted."
    else
        echo "Bridge $BRIDGE_NAME does not exist."
    fi
}

trap 'echo "Error occurred at line $LINENO"' ERR

# begin setup_bridge
setup_bridge() {

    if ! ip link show "$BRIDGE_NAME" > /dev/null 2>&1; then
        echo "Creating bridge $BRIDGE_NAME"
        sudo ip link add name "$BRIDGE_NAME" type bridge
        sudo ip link set "$BRIDGE_NAME" up
        
        echo "Assigning gateway IP $HOST_CIDR to $BRIDGE_NAME"
        sudo ip addr add "$HOST_CIDR" dev "$BRIDGE_NAME"
    else
        echo "Bridge $BRIDGE_NAME already exists."
    fi
} 
# end setup_bridge

# begin connect_pod
connect_pod() {

    echo "Connecting to Pod $POD_NS."

    echo "Removing IP address $HOST_CIDR from from the veth interface."
    sudo ip addr del "$HOST_CIDR" dev "$HOST_VETH"

    echo "Plugging virtual cable into the bridge."
    sudo ip link set "$HOST_VETH" master "$BRIDGE_NAME"
    sudo ip link set "$HOST_VETH" up

    echo "Set default route via the bridge gateway."
    sudo ip netns exec "$POD_NS" ip route del default 2>/dev/null || true
    sudo ip netns exec "$POD_NS" ip route add default via "$HOST_IP"

    echo "Pod connected."
}
# end connect_pod

status() {
    ip addr show dev "$BRIDGE_NAME"
    ip a | grep "master $BRIDGE_NAME"
}

usage() {
    echo "Usage: $0 <command> [options]"
    echo "Commands:"
    echo "  connect    Connects a Pod to a bridge <namespace> <subnet> <ip_address> <bridge_name>"
    echo "              e.g.," 
    echo "               $0 connect pod1a 192.168.1.0/24 192.168.1.10 br0"
    echo "               $0 connect pod2 192.168.1.0/24 192.168.1.11 br0"
    echo "  status     Shows the status of the bridge and its virtual cables"
    echo "              e.g.," 
    echo "               $0 status"
    echo "  delete     Deletes the bridge"
    echo "              e.g.," 
    echo "               $0 delete pod1a 192.168.1.0/24 192.168.1.10 br0"
}

if [[ $# -eq 0 ]]; then
    usage
fi

case "$1" in
    connect)
        setup_bridge
        connect_pod
        ;;
    status)
        status
        ;;          
    delete)
        delete_bridge
        ;;    
    *)
        echo "Invalid option: $1"
        usage
        exit 1
        ;;
esac
