#!/usr/bin/env bash

#
# Copyright (c) 2020-2024 Project CHIP Authors
#
# 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.
#

# Use git and restyle-path to help reformat anything that differs from
#  some base edit point.  Use before pushing a PR to make sure everything
#  you've written is kosher to CI
#
# Usage:
#  restyle-diff.sh [-d] [-p] [ref]
#
# if unspecified, ref defaults to upstream/master (or master)
# -d sets container's log level to DEBUG, if unspecified the default log level will remain (info level)
# -p pulls the Docker image before running the restyle paths
#

here=${0%/*}

set -e

MAX_ARGS=256
pull_image=0

CHIP_ROOT=$(cd "$here/../.." && pwd)
cd "$CHIP_ROOT"

restyle-paths() {
    image=restyled/restyler:edge

    docker run \
        --rm \
        --env LOG_LEVEL \
        --env LOG_DESTINATION \
        --env LOG_FORMAT \
        --env LOG_COLOR \
        --env HOST_DIRECTORY="$PWD" \
        --env UNRESTRICTED=1 \
        --volume "$PWD":/code \
        --volume /tmp:/tmp \
        --volume /var/run/docker.sock:/var/run/docker.sock \
        --entrypoint restyle-path \
        "$image" "$@"

}

#This was added to be able to use xargs to call the function restyle-paths
export -f restyle-paths

while [[ $# -gt 0 ]]; do
    case "$1" in
        -d)
            export LOG_LEVEL="DEBUG"
            shift
            ;;
        -p)
            pull_image=1
            shift
            ;;
        *)
            ref="$1"
            shift
            ;;
    esac
done

# Use AMD64 images on Apple Silicon since restyler doesn't provide ARM64 images
if [[ -z "$DOCKER_DEFAULT_PLATFORM" && "$(uname -sm)" == "Darwin arm64" ]]; then
    export DOCKER_DEFAULT_PLATFORM=linux/amd64
fi

if [[ -z "$ref" ]]; then
    ref="master"
    git remote | grep -qxF upstream && ref="upstream/master"
fi

if [[ $pull_image -eq 1 ]]; then
    docker pull restyled/restyler:edge
fi

paths=$(git diff --ignore-submodules --name-only --merge-base "$ref")

echo "$paths" | xargs -n "$MAX_ARGS" "$BASH" -c 'restyle-paths "$@"' -
