#!/bin/bash

# Define source paths
SOURCE_PATH="./mozilla-central"
PATCHES_DIR="$SOURCE_PATH/Spitfire"
SOURCE_REPO="https://hg.mozilla.org/mozilla-central"
PATCHES_REPO="https://weforgecode.xyz/Spitfire/Browser.git"

SOURCE_PATH=$(realpath "$SOURCE_PATH") || { echo "Failed to resolve SOURCE_PATH. Exiting."; exit 1; }
PATCHES_DIR=$(realpath "$PATCHES_DIR") || { echo "Failed to resolve PATCHES_DIR. Exiting."; exit 1; }

# Function to download Mozilla source if not present
download_source() {
    if [ ! -d "$SOURCE_PATH" ]; then
        echo "Mozilla source not found. Cloning from repository..."
        hg clone "$SOURCE_REPO" "$SOURCE_PATH" || { echo "Failed to clone Mozilla repository. Exiting."; exit 1; }
    else
        echo "Mozilla source already exists."
    fi
}

# Function to discard uncommitted changes
discard_changes() {
    echo "Discarding uncommitted changes..."
    hg revert --all --no-backup -R "$SOURCE_PATH" || { echo "Failed to revert changes in Mozilla repository. Exiting."; exit 1; }
}

# Function to clean build
clean_build() {
    echo "Cleaning build..."
    cd "$SOURCE_PATH" || { echo "Failed to navigate to source directory. Exiting."; exit 1; }
    hg revert --all --no-backup || { echo "Failed to revert changes in Mozilla repository. Exiting."; exit 1; }
    ./mach clobber || { echo "Failed to clean build. Exiting."; exit 1; }
}

# Function to update Mozilla repository
update_repo() {
    echo "Updating Mozilla repository..."
    cd "$SOURCE_PATH" || { echo "Failed to navigate to source directory. Exiting."; exit 1; }
    hg pull -u || { echo "Failed to update Mozilla repository. Exiting."; exit 1; }
}

# Function to update patches
update_patches() {
    echo "Updating patches..."
    if [ -d "$PATCHES_DIR" ]; then
        echo "Patches directory already exists. Cleaning and pulling updates..."
        cd "$PATCHES_DIR" || { echo "Failed to navigate to patches directory. Exiting."; exit 1; }
        git clean -xdf || { echo "Failed to clean patches directory. Exiting."; exit 1; }
        git pull origin master || { echo "Failed to pull updates from patches repository. Exiting."; exit 1; }
    else
        echo "Patches directory does not exist. Cloning repository..."
        git clone "$PATCHES_REPO" "$PATCHES_DIR" || { echo "Failed to clone patches repository. Exiting."; exit 1; }
    fi

    echo "Copying files from patches directory to Firefox source directory..."
    rsync -av --exclude='.git' "$PATCHES_DIR/" "$SOURCE_PATH/" || { echo "Failed to copy files. Exiting."; exit 1; }
}

# Function to configure Spitfire
configure() {
    echo "Configuring Spitfire..."
    cd "$SOURCE_PATH" || { echo "Failed to navigate to source directory. Exiting."; exit 1; }
    ./mach configure || { echo "Configuration failed. Exiting."; exit 1; }
}

# Function to build Spitfire
build() {
    echo "Building Spitfire..."
    cd "$SOURCE_PATH" || { echo "Failed to navigate to source directory. Exiting."; exit 1; }
    ./mach build || { echo "Build failed. Exiting."; exit 1; }
}

# Function to run the project after build
run_project() {
    echo "Running the project..."
    cd "$SOURCE_PATH" || { echo "Failed to navigate to browser directory. Exiting."; exit 1; }
    ./mach run || { echo "Failed to run the project. Exiting."; exit 1; }
}

# Function to print usage instructions
print_help() {
    echo "Usage: ./builder.sh [options]"
    echo "Options:"
    echo "  -a, --all       : Perform all steps (build, clean, update)"
    echo "  -b, --build     : Build Spitfire"
    echo "  -c, --clean     : Clean build"
    echo "  -u, --update    : Update Mozilla repository"
    echo "  -p, --patches   : Update patches"
    echo "  -r, --run       : Run the project after build using mach run in the browser directory"
    echo "  -h, --help      : Display this help message"
    exit 0
}

# Parse command line arguments
while [[ $# -gt 0 ]]; do
    key="$1"
    case $key in
        -a|--all)
            all=true
            ;;
        -b|--build)
            build=true
            ;;
        -c|--clean)
            clean=true
            ;;
        -u|--update)
            update=true
            ;;
        -p|--patches)
            patches=true
            ;;
        -r|--run)
            run=true
            ;;
        -h|--help)
            print_help
            ;;
        *)
            echo "Invalid option: $key"
            print_help
            ;;
    esac
    shift
done

# Main script execution based on flags
if [ "$all" = true ]; then
    download_source
    discard_changes
    clean_build
    update_repo
    update_patches
    configure
    build
    if [ "$run" = true ]; then
        run_project
    fi
    echo "Spitfire build completed successfully."
elif [ "$build" = true ]; then
    configure
    build
    if [ "$run" = true ]; then
        run_project
    fi
    echo "Spitfire build completed successfully."
elif [ "$clean" = true ]; then
    clean_build
    echo "Cleaned Firefox build."
elif [ "$update" = true ]; then
    download_source
    update_repo
    echo "Mozilla repository updated."
elif [ "$patches" = true ]; then
    download_source
    update_patches
    echo "Patches updated."
elif [ "$run" = true ]; then
    run_project
else
    print_help
fi

exit 0