#!/usr/bin/env bash

# check the cost time
start_time=$(date +%s)

# read the arguments to skip the pub get and package get
skip_pub_get=false
skip_pub_packages_get=false
verbose=false
exclude_packages=false
show_loading=false

# Parse command line arguments
while [[ $# -gt 0 ]]; do
  case "$1" in
  --skip-pub-get)
    skip_pub_get=true
    shift
    ;;
  --skip-pub-packages-get)
    skip_pub_packages_get=true
    shift
    ;;
  --verbose)
    verbose=true
    shift
    ;;
  --exclude-packages)
    exclude_packages=true
    shift
    ;;
  --show-loading)
    show_loading=true
    shift
    ;;
  *)
    echo "Unknown option: $1"
    exit 1
    ;;
  esac
done

# Store the current working directory
original_dir=$(pwd)

cd "$(dirname "$0")"

# Navigate to the project root
cd ../../../appflowy_flutter

if [ "$exclude_packages" = false ]; then
  # Navigate to the packages directory
  cd packages
  for d in */; do
    # Navigate into the subdirectory
    cd "$d"

    # Check if the pubspec.yaml file exists and contains the freezed dependency
    if [ -f "pubspec.yaml" ] && grep -q "build_runner" pubspec.yaml; then
      echo "🧊 Start generating freezed files ($d)."
      if [ "$skip_pub_packages_get" = false ]; then
        if [ "$verbose" = true ]; then
          flutter packages pub get
        else
          flutter packages pub get >/dev/null 2>&1
        fi
      fi
      if [ "$verbose" = true ]; then
        dart run build_runner build --delete-conflicting-outputs
      else
        dart run build_runner build --delete-conflicting-outputs >/dev/null 2>&1
      fi
      echo "🧊 Done generating freezed files ($d)."
    fi

    # Navigate back to the packages directory
    cd ..
  done

  cd ..
fi

# Function to display animated loading text
display_loading() {
  local pid=$1
  local delay=0.5
  local spinstr='|/-\'
  while [ "$(ps a | awk '{print $1}' | grep $pid)" ]; do
    local temp=${spinstr#?}
    printf " [%c] Generating freezed files..." "$spinstr"
    local spinstr=$temp${spinstr%"$temp"}
    sleep $delay
    printf "\r"
  done
  printf "                                   \r"
}

# Navigate to the appflowy_flutter directory and generate files
echo "🧊 Start generating freezed files (AppFlowy)."

if [ "$skip_pub_packages_get" = false ]; then
  if [ "$verbose" = true ]; then
    flutter packages pub get
  else
    flutter packages pub get >/dev/null 2>&1
  fi
fi

# Start the build_runner in the background
if [ "$verbose" = true ]; then
  dart run build_runner build --delete-conflicting-outputs &
else
  dart run build_runner build --delete-conflicting-outputs >/dev/null 2>&1 &
fi

# Get the PID of the background process
build_pid=$!

if [ "$show_loading" = true ]; then
  # Start the loading animation
  display_loading $build_pid &

  # Get the PID of the loading animation
  loading_pid=$!
fi

# Wait for the build_runner to finish
wait $build_pid

# Clear the line
printf "\r%*s\r" $(($(tput cols))) ""

cd "$original_dir"

echo "🧊 Done generating freezed files."

# echo the cost time
end_time=$(date +%s)
cost_time=$((end_time - start_time))
echo "🧊 Freezed files generation cost $cost_time seconds."
