#!/bin/bash
#
#  Copyright (c) 2019, The OpenThread Authors.
#  All rights reserved.
#
#  Redistribution and use in source and binary forms, with or without
#  modification, are permitted provided that the following conditions are met:
#  1. Redistributions of source code must retain the above copyright
#     notice, this list of conditions and the following disclaimer.
#  2. Redistributions in binary form must reproduce the above copyright
#     notice, this list of conditions and the following disclaimer in the
#     documentation and/or other materials provided with the distribution.
#  3. Neither the name of the copyright holder nor the
#     names of its contributors may be used to endorse or promote products
#     derived from this software without specific prior written permission.
#
#  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
#  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
#  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
#  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
#  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
#  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
#  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
#  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
#  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
#  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
#  POSSIBILITY OF SUCH DAMAGE.
#

#
# The script to check or format source code of OpenThread.
#
# Format c/c++, markdown, python, and shell:
#
#     script/make-pretty
#
# Format c/c++ only:
#
#     script/make-pretty clang
#
# Format markdown only:
#
#     script/make-pretty markdown
#
# Format python only:
#
#     script/make-pretty python
#
# Format shell only:
#
#     script/make-pretty shell
#
# Check only:
#
#     script/make-pretty check clang
#     script/make-pretty check markdown
#     script/make-pretty check python
#     script/make-pretty check shell
#

set -euo pipefail

readonly OT_BUILD_JOBS=$(getconf _NPROCESSORS_ONLN)
readonly OT_EXCLUDE_DIRS=(third_party doc/site)

readonly OT_CLANG_SOURCES=('*.c' '*.cc' '*.cpp' '*.h' '*.hpp')
readonly OT_MARKDOWN_SOURCES=('*.md')
readonly OT_PYTHON_SOURCES=('*.py')

do_clang_format()
{
    echo -e '====================='
    echo -e '     format c/c++'
    echo -e '====================='

    git ls-files "${OT_CLANG_SOURCES[@]}" | grep -v -E "^($(echo "${OT_EXCLUDE_DIRS[@]}" | tr ' ' '|'))" \
        | xargs -n3 -P"$OT_BUILD_JOBS" script/clang-format -style=file -i -verbose
}

do_clang_check()
{
    echo -e '====================='
    echo -e '     check c/c++'
    echo -e '====================='

    git ls-files "${OT_CLANG_SOURCES[@]}" | grep -v -E "^($(echo "${OT_EXCLUDE_DIRS[@]}" | tr ' ' '|'))" \
        | xargs -n3 -P"$OT_BUILD_JOBS" script/clang-format-check
}

do_markdown_format()
{
    echo -e '======================'
    echo -e '     format markdown'
    echo -e '======================'

    git ls-files "${OT_MARKDOWN_SOURCES[@]}" | grep -v -E "^($(echo "${OT_EXCLUDE_DIRS[@]}" | tr ' ' '|'))" \
        | xargs -n10 -P"$OT_BUILD_JOBS" npx prettier@2.0.4 --write
}

do_markdown_check()
{
    echo -e '======================'
    echo -e '     check markdown'
    echo -e '======================'

    git ls-files "${OT_MARKDOWN_SOURCES[@]}" | grep -v -E "^($(echo "${OT_EXCLUDE_DIRS[@]}" | tr ' ' '|'))" \
        | xargs -n10 -P"$OT_BUILD_JOBS" npx prettier@2.0.4 --check
}

do_python_format()
{
    echo -e '======================'
    echo -e '     format python'
    echo -e '======================'

    git ls-files "${OT_PYTHON_SOURCES[@]}" | grep -v -E "^($(echo "${OT_EXCLUDE_DIRS[@]}" | tr ' ' '|'))" \
        | xargs -n10 -P"$OT_BUILD_JOBS" python3 -m yapf --verbose --style '{based_on_style: google, column_limit: 119}' -ipr
}

do_python_check()
{
    echo -e '====================='
    echo -e '     check python'
    echo -e '====================='

    git ls-files "${OT_PYTHON_SOURCES[@]}" | grep -v -E "^($(echo "${OT_EXCLUDE_DIRS[@]}" | tr ' ' '|'))" \
        | xargs -n10 -P"$OT_BUILD_JOBS" python3 -m yapf --verbose --style '{based_on_style: google, column_limit: 119}' -dpr
}

do_shell_format()
{
    echo -e '====================='
    echo -e '     format shell'
    echo -e '====================='

    git ls-files | xargs shfmt -f | grep -v -E "^($(echo "${OT_EXCLUDE_DIRS[@]}" | tr ' ' '|'))" \
        | xargs -n10 -P"$OT_BUILD_JOBS" shfmt -i 4 -bn -ci -fn -s -w
}

do_shell_check()
{
    echo -e '====================='
    echo -e '     check shell'
    echo -e '====================='

    git ls-files | xargs shfmt -f | grep -v -E "^($(echo "${OT_EXCLUDE_DIRS[@]}" | tr ' ' '|'))" \
        | xargs -n10 -P"$OT_BUILD_JOBS" shfmt -i 4 -bn -ci -fn -s -d

    git ls-files | xargs shfmt -f | grep -v -E "^($(echo "${OT_EXCLUDE_DIRS[@]}" | tr ' ' '|'))" \
        | xargs -n10 -P"$OT_BUILD_JOBS" shellcheck
}

do_check()
{
    if [ $# == 0 ]; then
        do_clang_check
        do_markdown_check
        do_python_check
        do_shell_check
    elif [ "$1" == 'clang' ]; then
        do_clang_check
    elif [ "$1" == 'markdown' ]; then
        do_markdown_check
    elif [ "$1" == 'python' ]; then
        do_python_check
    elif [ "$1" == 'shell' ]; then
        do_shell_check
    else
        echo >&2 "Unsupported check: $1. Supported: clang, markdown, python, shell"
        # 128 for Invalid arguments
        exit 128
    fi
}

main()
{
    if [ $# == 0 ]; then
        do_clang_format
        do_markdown_format
        do_python_format
        do_shell_format
    elif [ "$1" == 'clang' ]; then
        do_clang_format
    elif [ "$1" == 'markdown' ]; then
        do_markdown_format
    elif [ "$1" == 'python' ]; then
        do_python_format
    elif [ "$1" == 'shell' ]; then
        do_shell_format
    elif [ "$1" == 'check' ]; then
        shift
        do_check "$@"
    else
        echo >&2 "Unsupported action: $1. Supported: clang, markdown, python, shell"
        # 128 for Invalid arguments
        exit 128
    fi

}

main "$@"
