#!/bin/bash

# Default configurations
HOST='127.0.0.1'
PORT='3306'
USER='root'
PASSWORD='root'
DBNAME='shopware'
COLLATION='utf8mb4_unicode_ci'
PRESERVE_DB=false

# Usage message function
usage() {
    echo "Usage: xcomdb [options] <file>"
    echo "Options:"
    echo "  -u <user>      MySQL user (default: root)"
    echo "  -p <password>  MySQL password (default: root)"
    echo "  -h <host>      MySQL host (default: 127.0.0.1)"
    echo "  -port <port>   MySQL port (default: 3306)"
    echo "  -d <database>  Database name (default: shopware)"
    echo "  -c <collation> Database collation (default: utf8mb4_unicode_ci)"
    echo "  --preserve     Preserve the original database (takes longer)"
    exit 1
}

# Parse options
while [[ $# -gt 0 ]]; do
    case "$1" in
        -u) USER=$2; shift 2 ;;
        -p) PASSWORD=$2; shift 2 ;;
        -h) HOST=$2; shift 2 ;;
        -port) PORT=$2; shift 2 ;;
        -d) DBNAME=$2; shift 2 ;;
        -c) COLLATION=$2; shift 2 ;;
        --preserve) PRESERVE_DB=true; shift ;;
        *) break ;;
    esac
done

# Check if file parameter exists
if [ $# -ne 1 ]; then
    usage
fi

FILE=$1

# Function to handle database preservation
preserve_database() {
    local COUNTER=0
    local SUFFIX="_old"
    local NEW_DBNAME="${DBNAME}${SUFFIX}"

    while mysql -h "$HOST" -P "$PORT" -u "$USER" -p"$PASSWORD" -e "SHOW DATABASES LIKE '$NEW_DBNAME'" | grep -q "$NEW_DBNAME"; do
        let COUNTER++
        NEW_DBNAME="${DBNAME}_old$COUNTER"
    done

    echo "XCOMDB: Renaming existing database to $NEW_DBNAME"

    mysql -h "$HOST" -P "$PORT" -u "$USER" -p"$PASSWORD" -e "CREATE DATABASE $NEW_DBNAME;"
    if [ $? -ne 0 ]; then
        echo "XCOMDB: Failed to rename the existing database."
        exit 1
    fi
    mysqldump -h "$HOST" -P "$PORT" -u "$USER" -p"$PASSWORD" "$DBNAME" | mysql -h "$HOST" -P "$PORT" -u "$USER" -p"$PASSWORD" "$NEW_DBNAME"
    if [ $? -ne 0 ]; then
        echo "XCOMDB: Failed to rename the existing database."
        exit 1
    fi
    mysql -h "$HOST" -P "$PORT" -u "$USER" -p"$PASSWORD" -e "DROP DATABASE $DBNAME;"
    if [ $? -ne 0 ]; then
        echo "XCOMDB: Failed to rename the existing database."
        exit 1
    fi
}

# Function to normalize SQL file names
normalize_sql_filename() {
    local filename="$1"
    # Remove duplicate .sql extensions
    while [[ $filename =~ \.sql\.sql$ ]]; do
        filename="${filename%\.sql}"
    done
    # Ensure the filename ends with .sql
    if [[ ! $filename =~ \.sql$ ]]; then
        filename="${filename}.sql"
    fi
    echo "$filename"
}

# Determine file type and handle accordingly
if [[ $FILE =~ \.sql$ ]]; then
    SQLFILE=$(normalize_sql_filename "$FILE")
elif [[ $FILE =~ \.(tar\.gz|tgz)$ ]]; then
    echo "XCOMDB: Extracting File"
    tar -xzf $FILE
    SQLFILE=`tar -tzf $FILE | grep -m 1 '\.sql$'`
    SQLFILE=$(normalize_sql_filename "$SQLFILE")
elif [[ $FILE =~ \.gz$ ]]; then
    echo "XCOMDB: Decompressing File"
    gzip -d $FILE
    SQLFILE=$(normalize_sql_filename "${FILE%.gz}")
else
    echo "XCOMDB: Unsupported file type."
    exit 1
fi

# Verify SQL file exists
if [ ! -f "$SQLFILE" ]; then
    echo "XCOMDB: SQL file $SQLFILE does not exist."
    exit 1
fi

# Database operations
if $PRESERVE_DB; then
    preserve_database
fi

echo "XCOMDB: Replacing Database"

mysql -h "$HOST" -P "$PORT" -u "$USER" -p"$PASSWORD" -e "DROP DATABASE IF EXISTS $DBNAME;"
if [ $? -ne 0 ]; then
    exit 1
fi
mysql -h "$HOST" -P "$PORT" -u "$USER" -p"$PASSWORD" -e "CREATE DATABASE $DBNAME COLLATE $COLLATION;"
if [ $? -ne 0 ]; then
    exit 1
fi

mysql -h "$HOST" -P "$PORT" -u "$USER" -p"$PASSWORD" $DBNAME < $SQLFILE

if [ $? -ne 0 ]; then
    echo "XCOMDB: Failed to import $SQLFILE into $DBNAME."
    exit 1
fi

echo "XCOMDB: Database $DBNAME updated successfully."
