#!/bin/bash

POOL_FILE="/tmp/ip_pool.txt"

function initialize_pool() {
    local SUBNET=$1

    SUBNET=$(echo "$SUBNET" | sed 's/\.0\/24//')
    echo "Initializing IP pool from $SUBNET.2 to $SUBNET.254..."
    for i in $(seq 2 254); do
        echo "$SUBNET.$i" >> "$POOL_FILE"
    done
    echo "Initialization complete."
}

function is_valid_ipv4() {
    local IP="$1"
    local regex='^(([0-9]{1,3}\.){3}[0-9]{1,3})$'
    if [[ "$IP" =~ $regex ]]; then
        IFS='.' read -r -a octets <<< "$IP"
        for octet in "${octets[@]}"; do
            if ((octet > 255)); then
                return 1
            fi
        done
        return 0
    else
        return 1
    fi
}

function select_ip() {
    AVAILABLE_IPS=($(cat "$POOL_FILE"))
    if [ ${#AVAILABLE_IPS[@]} -eq 0 ]; then
        echo "No IPs available in the pool."
        return
    fi

    SELECT_IP=${AVAILABLE_IPS[0]}
    echo "$SELECT_IP"

    sed -i "/^$SELECT_IP$/d" "$POOL_FILE"
}

function allocate_ip() {
    local SUBNET="$1"

    if [ ! -f "$POOL_FILE" ] || [ ! -s "$POOL_FILE" ]; then
        echo "Pool file not found or it has 0 bytes. Initializing IP pool to subnet $SUBNET."
        initialize_pool $SUBNET
    fi

    IP_ADDR=$(select_ip)
    GATEWAY=$(echo $SUBNET | sed "s:0/24:1:g")

    echo "Gateway: $IP_ADDR, IP: $GATEWAY"
}

function deallocate_ip() {
    local IP_ADDR=$1

    if ! is_valid_ipv4 "$IP_ADDR"; then
        echo "Provide valid IP to return to the pool: $IP_ADDR"
        return
    fi

    if grep -q "^$IP_ADDR$" "$POOL_FILE"; then
        echo "IP $IP_ADDR is already in the pool."
        return
    fi

    echo "$IP_ADDR" >> "$POOL_FILE"
    echo "IP $IP_ADDR returned to the pool."
}

#Example
#SUBNET="192.168.5.0/24"
#IP_ADDR=""
#GATEWAY=""
#get_free_ip "$SUBNET"
#echo "SUBNET: ${SUBNET}, GATEWAY: ${GATEWAY}, IP_ADDR: ${IP_ADDR}"
#deallocate_ip $IP_ADDR
