#!/bin/bash
#
# KVM Post-installation Configuration
#
# Sets up networking, permissions, and validates installation

set -euo pipefail

RED='\033[0;31m'
GREEN='\033[0;32m'
NC='\033[0m'

log_info() {
    echo -e "${GREEN}[KVM POSTRUN]${NC} $*"
}

log_error() {
    echo -e "${RED}[KVM POSTRUN ERROR]${NC} $*" >&2
}

# Setup default network
setup_network() {
    log_info "Setting up default network..."

    # Check if network already exists
    if virsh net-info default &>/dev/null 2>&1; then
        log_info "Default network already configured"
        return 0
    fi

    # Create and start default network
    cat > /tmp/default-network.xml << 'EOF'
<network>
  <name>default</name>
  <forward mode='nat'>
    <nat>
      <port start='1024' end='65535'/>
    </nat>
  </forward>
  <bridge name='virbr0' stp='on' delay='0'/>
  <ip address='192.168.122.1' netmask='255.255.255.0'>
    <dhcp>
      <range start='192.168.122.2' end='192.168.122.254'/>
    </dhcp>
  </ip>
</network>
EOF

    if ! virsh net-define /tmp/default-network.xml; then
        log_error "Failed to define default network"
        return 1
    fi

    if ! virsh net-start default; then
        log_error "Failed to start default network"
        return 1
    fi

    if ! virsh net-autostart default; then
        log_error "Failed to autostart default network"
        return 1
    fi

    rm -f /tmp/default-network.xml
    log_info "✓ Default network configured"
    return 0
}

# Configure permissions
configure_permissions() {
    log_info "Configuring KVM permissions..."

    # Add current user to libvirt group (if not root)
    if [ "$EUID" -ne 0 ] && id -Gn | grep -q libvirt; then
        log_info "User already in libvirt group"
    elif [ "$EUID" -ne 0 ]; then
        log_info "Adding user to libvirt group..."
        if ! usermod -aG libvirt "${SUDO_USER:-${USER}}"; then
            log_error "Failed to add user to libvirt group"
            return 1
        fi
    fi

    # Ensure proper permissions on /dev/kvm
    chmod 666 /dev/kvm || true

    log_info "✓ KVM permissions configured"
    return 0
}

# Final validation
validate_installation() {
    log_info "Validating KVM installation..."

    errors=0

    # Check /dev/kvm
    if [ ! -e /dev/kvm ]; then
        log_error "/dev/kvm not found"
        ((errors++))
    else
        log_info "✓ /dev/kvm present"
    fi

    # Check libvirtd running
    if ! systemctl is-active --quiet libvirtd; then
        log_error "libvirtd not running"
        ((errors++))
    else
        log_info "✓ libvirtd running"
    fi

    # Check virsh connectivity
    if ! virsh --version &>/dev/null; then
        log_error "virsh not accessible"
        ((errors++))
    else
        log_info "✓ virsh accessible"
    fi

    if [ "$errors" -gt 0 ]; then
        return 1
    fi

    log_info "KVM installation validation successful"
    return 0
}

# Main
setup_network && configure_permissions && validate_installation

exit $?
