#!/bin/bash
#
# Copyright 2025 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

###############################################################################
# What this script does and why we need it?
# This script synchronizes common configuration files from `example/` (the
# source of truth) to all project templates in `templates/*/`. This ensures all
# templates are up-to-date with shared configurations.
#
# When to run this script?
# - After updating files/dirs listed below in the `example/` project.
#   This can happen when updating the autorepro plugin version (see
#   go/autorepro#releasing-to-gmaven) or making other manual changes.
# - After adding a new project template under `templates/` to ensure it receives
#   the common files followed by validating the newly synced template.
#
# Files/dirs synced between `example/` and `templates/*/`:
# - .gitignore
# - .run/
# - gradle/
# - gradle.properties
# - gradlew
# - gradlew.bat
# - settings.gradle.kts
#
# Updating the above files/dirs in example and syncing:
# 1. Make and validate changes in the `example/` project. This may include:
#    - Updating `settings.gradle.kts` (e.g., plugin versions).
#    - Running a Gradle sync in Android Studio which may update wrapper files.
#    - Modifying shared `.run/` configurations or `.gitignore`.
# 2. Run this script to propagate the changes to all templates:
#    ./sync-common.sh
###############################################################################

set -euo pipefail

readonly SCRIPT_DIR=$(realpath "$(dirname "$0")")
readonly SOURCE_DIR="${SCRIPT_DIR}/example"

_ERROR_MESSAGE=""

die() {
  _ERROR_MESSAGE="${@:2}"
  exit "$1"
}

on_exit() {
  local exit_code=$?
  if [[ ${exit_code} -eq 0 ]]; then
    printf "\nSYNC COMPLETED SUCCESSFULLY.\n"
    return
  fi

  # If an error message was set by die(), print it to stderr.
  if [[ -n "${_ERROR_MESSAGE}" ]]; then
    printf "\nERROR: %s\n" "${_ERROR_MESSAGE}" >&2
  fi

  # Instructions on a failed sync
  cat <<EOF

SYNC FAILED WITH EXIT CODE: ${exit_code}.
The target directories may be in an inconsistent state.
Please do not commit any of the resulting changes.
EOF
}

trap on_exit EXIT

main() {
  declare -a target_dirs=()

  # Add all templates/* folders in target_dirs
  for d in "${SCRIPT_DIR}"/templates/*; do
    if [[ -d "$d" ]]; then
      target_dirs+=("$d")
    fi
  done

  if [[ ${#target_dirs[@]} -eq 0 ]]; then
    die 1 "No template directories found. Nothing to sync."
  fi

  # List all directories from target_dirs
  printf "\n- Identified target directory: [%s]\n" "${target_dirs[@]}"

  # Create array of files/dirs to sync
  declare -a files_to_sync=(
    "${SOURCE_DIR}/./.gitignore"
    "${SOURCE_DIR}/./.run/"
    "${SOURCE_DIR}/./gradle/"
    "${SOURCE_DIR}/./gradle.properties"
    "${SOURCE_DIR}/./gradlew"
    "${SOURCE_DIR}/./gradlew.bat"
    "${SOURCE_DIR}/./settings.gradle.kts"
  )

  # Start syncing
  for target in "${target_dirs[@]}"; do
    printf "\n- Syncing from [%s] to [%s]\n" "$SOURCE_DIR" "$target"
    rsync -avR "${files_to_sync[@]}" "$target" \
      || die "$?" "Failed to sync [${target}] (see previous errors)"
  done
}

main "$@"
