#!/bin/sh

# ============================================================================
# Microsoft SQL Server ODBC Driver Flatpak Configurator (No Linker Meddling)
# ============================================================================
# Description: This script finds a system-installed Microsoft SQL Server ODBC 
#              driver and configures a sandboxed copy for use with Flatpak apps.
# ============================================================================

# --- Configuration Constants ---
ODBC_INST_FILE="/etc/odbcinst.ini"
SYSTEM_DRIVER_18="ODBC Driver 18 for SQL Server"
SYSTEM_DRIVER_17="ODBC Driver 17 for SQL Server"
FLATPAK_DRIVER_SECTION="Flatpak ODBC Driver for SQL Server"
FLATPAK_DEST_BASE="$HOME/.config/navicat/ODBC"
FLATPAK_DEST_DIR_NAME="mssql"
FLATPAK_DEST_PATH="$FLATPAK_DEST_BASE/$FLATPAK_DEST_DIR_NAME"
APP_ID="com.navicat.premium.en"

# --- Color Definitions ---
ORANGE='\033[0;33m'
GREEN='\033[0;32m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# ============================================================================
# User Confirmation
# ============================================================================
printf "\nThis script finds a system-installed Microsoft SQL Server ODBC driver and configures a sandboxed copy for use with Flatpak applications.\n"
printf "${ORANGE}It will use 'sudo' to modify system configuration files in '/etc'.${NC}\n"
printf "You will be prompted for your password to proceed.\n\n"
printf "Press [Enter] to continue or Ctrl+C to cancel... "
read -r _

echo
echo

# ============================================================================
# Phase 1: Pre-run Checks
# ============================================================================
echo "--- Phase 1: Pre-run Checks ---"
REQUIRED_TOOLS="grep awk sed cp mkdir dirname tee sudo xargs"
for tool in $REQUIRED_TOOLS; do
  if ! command -v "$tool" >/dev/null 2>&1; then
    echo "ERROR: Missing required tool: $tool"
    exit 1
  fi
done
echo "All required tools are present."
echo

# ============================================================================
# Phase 2: Find the System-Installed Driver Version
# ============================================================================
echo "--- Phase 2: Finding System-Installed MSSQL Driver ---"
CHOSEN_SYSTEM_SECTION=""

if grep -q "^\\[$SYSTEM_DRIVER_18\\]" "$ODBC_INST_FILE" 2>/dev/null; then
    CHOSEN_SYSTEM_SECTION="$SYSTEM_DRIVER_18"
elif grep -q "^\\[$SYSTEM_DRIVER_17\\]" "$ODBC_INST_FILE" 2>/dev/null; then
    CHOSEN_SYSTEM_SECTION="$SYSTEM_DRIVER_17"
else
    echo "ERROR: Neither '$SYSTEM_DRIVER_18' nor '$SYSTEM_DRIVER_17' was found in '$ODBC_INST_FILE'."
    echo "Please install the official Microsoft ODBC driver first before running this script."
    exit 1
fi
echo "Found system-installed '$CHOSEN_SYSTEM_SECTION' driver."
echo

# ============================================================================
# Phase 3: Find and Register the ODBC Driver Path for Flatpak
# ============================================================================
echo "--- Phase 3: Configuring Driver for Flatpak ---"

# Dynamically parse the exact driver library location from the host file
DRIVER_LIB_PATH=$(awk -F= -v section="[$CHOSEN_SYSTEM_SECTION]" '
    $0 == section { in_section=1; next }
    $0 ~ /^\[/ { if (in_section) exit }
    in_section && tolower($1) ~ /^[[:space:]]*driver[[:space:]]*/ { print $2; exit }
' "$ODBC_INST_FILE" | xargs)

if [ -z "$DRIVER_LIB_PATH" ] || [ ! -f "$DRIVER_LIB_PATH" ]; then
    echo "ERROR: Could not verify or parse the 'Driver' filepath from the system setup."
    exit 1
fi
echo "Parsed system driver library path: $DRIVER_LIB_PATH"

# Determine the source root directory dynamically by stepping out 2 levels (lib64/lib -> root)
SOURCE_ROOT_PATH=$(dirname "$(dirname "$DRIVER_LIB_PATH")")

if [ -z "$SOURCE_ROOT_PATH" ] || [ ! -d "$SOURCE_ROOT_PATH" ]; then
    echo "ERROR: Could not verify the root layout from: $DRIVER_LIB_PATH"
    exit 1
fi
echo "Determined source root path: $SOURCE_ROOT_PATH"

# Clean old destination files to avoid cross-version contamination if re-run
if [ -d "$FLATPAK_DEST_PATH" ]; then
    echo "Cleaning legacy sandboxed target directory..."
    rm -rf "${FLATPAK_DEST_PATH:?}"/*
else
    echo "Creating destination directory: $FLATPAK_DEST_PATH"
    mkdir -p "$FLATPAK_DEST_PATH"
fi

# Mirror directory contents using highly portable '.' syntax (ignores root naming pitfalls)
echo "Copying files from $SOURCE_ROOT_PATH to $FLATPAK_DEST_PATH..."
cp -R "$SOURCE_ROOT_PATH/." "$FLATPAK_DEST_PATH/"
if [ $? -ne 0 ]; then
    echo "ERROR: Failed to copy driver files."
    exit 1
fi
echo "Files copied successfully."
echo

# Generate relative target pointer pathing
RELATIVE_LIB_PATH=${DRIVER_LIB_PATH#$SOURCE_ROOT_PATH}
FLATPAK_DRIVER_LIB_PATH="$FLATPAK_DEST_PATH$RELATIVE_LIB_PATH"
FLATPAK_LIB_DIR=$(dirname "$FLATPAK_DRIVER_LIB_PATH")

# Capture original attributes to preserve connection parameters
ORIGINAL_SECTION_CONTENT=$(awk -v section="[$CHOSEN_SYSTEM_SECTION]" '
    $0 == section { in_section=1; next }
    $0 ~ /^\[/ { if (in_section) exit }
    in_section { print }
' "$ODBC_INST_FILE")

# Inject updated isolated file mapping variables
FLATPAK_SECTION_CONTENT=$(echo "$ORIGINAL_SECTION_CONTENT" | sed "s#Driver=.*#Driver=$FLATPAK_DRIVER_LIB_PATH#")

# Clean old entries out to avoid configuration pileups
if sudo grep -q "^\\[$FLATPAK_DRIVER_SECTION\\]" "$ODBC_INST_FILE" 2>/dev/null; then
    echo "Removing legacy '$FLATPAK_DRIVER_SECTION' entry..."
    TEMP_FILE=$(mktemp)
    sudo awk -v section="[$FLATPAK_DRIVER_SECTION]" '
        $0 == section { in_section = 1; next }
        $0 ~ /^\[/ { in_section = 0 }
        !in_section { print }
    ' "$ODBC_INST_FILE" > "$TEMP_FILE" && sudo mv "$TEMP_FILE" "$ODBC_INST_FILE"
fi

# Append the Flatpak registration block safely using sudo tee
{
  printf "\n[%s]\n" "$FLATPAK_DRIVER_SECTION"
  printf "%s\n" "$FLATPAK_SECTION_CONTENT"
} | sudo tee -a "$ODBC_INST_FILE" > /dev/null
echo "Driver registered for Flatpak in system configuration."
echo

# ============================================================================
# Phase 4: Summary
# ============================================================================
echo "--- Phase 4: Summary ---"
echo "======================================================================="
echo "  Microsoft ODBC SQL Flatpak Configuration Complete"
echo "======================================================================="
echo
echo "  - System Driver Found at:     $SOURCE_ROOT_PATH"
echo "  - Copied for Flatpak to:      $FLATPAK_DEST_PATH"
echo "  - Registered Flatpak Driver:  '$FLATPAK_DRIVER_SECTION' in $ODBC_INST_FILE"
echo "  - Isolated Library Folder:    $FLATPAK_LIB_DIR"
echo
echo "  ${ORANGE}CRITICAL REQUIREMENT:${NC}"
echo "  To let Navicat access the driver's isolated libraries without modifying"
echo "  your system-wide linker config, run the following Flatpak command:"
echo
printf "  ${GREEN}flatpak override --user --env=LD_LIBRARY_PATH=%s %s${NC}\n" "$FLATPAK_LIB_DIR" "$APP_ID"
echo
echo "  Once the above command is run, launch/restart Navicat and select:"
echo "  Driver -> '$FLATPAK_DRIVER_SECTION'"
echo "======================================================================="
echo
