#!/usr/bin/env bash

# vim: ft=sh

function show_help() {
    cat <<END

$(basename "$0") [-?|-h|--help] [-f|--force] [-u|--update]

    -u --update   Update OpenAI OpenAPI spec from github
    -? -h --help  Show this help and exit
    -f --force    Force the rebuild, even if there are uncommitted changes
    -n --notest   Skip the tests

Attempts to rebuild this project, including running tests and rebuilding the
documentation. If you have uncommitted changes, this script will refuse to
run. If you want to force the rebuild, use the -f option.
END
}

force=false
notest=false
update=false
#openai_url="https://raw.githubusercontent.com/openai/openai-openapi/master/openapi.yaml"
# This is a recent change to the location of the spec
openai_url="https://app.stainless.com/api/spec/documented/openai/openapi.documented.yml"
target_dir="share/openapi.yaml"

while [[ $# -gt 0 ]]
do
key="$1"
case $key in
    -f|--force)
    force=true
    shift
    ;;
    -n|--notest)
    notest=true
    shift
    ;;
    -u|--update)
    update=true
    shift
    ;;
    -?|-h|--help)
    shift # past argument
    show_help;
    exit;
    ;;
    *)    # unknown option
    echo "Error: Unknown option: $1"
    show_help
    exit 1
    ;;
esac
done

set -Eeuo pipefail

# Check for uncommitted changes in the git repository
if git diff-index --quiet HEAD --; then
    # No uncommitted changes. Do nothing.
    echo Rebuilding project
else
    # Uncommitted changes found
    if [ "$force" = true ]; then
      echo "Uncommitted changes found, but proceeding due to -f flag."
    else
      echo "Uncommitted changes found. Use -f to force."
      exit 1
    fi
fi

if [ "$update" = true ]; then
    echo "Updating OpenAI OpenAPI spec from github"
    if command -v curl &> /dev/null; then
        curl -o $target_dir $openai_url
    elif command -v wget &> /dev/null; then
        wget -O $target_dir $openai_url
    else
        echo "Error: Neither curl nor wget is available."
        exit 1
    fi
fi

# Check if Makefile exists in the current directory
if [ -f Makefile ]; then
    # Run make realclean
    make realclean
    # Check if make realclean was successful
    if [ $? -eq 0 ]; then
      echo "make realclean executed successfully."
    else
      echo "make realclean failed."
    fi
fi

perl Makefile.PL

make

# Obviously, this builds the documentation
perl devel/build_docs.pl

# Refresh MANIFEST so any newly generated POD files are picked up
# (build_docs.pl may add new lib/OpenAPI/Client/OpenAI/Path/*.pod files when
# the upstream spec adds endpoints). MANIFEST.SKIP filters out files we don't
# want listed.
make manifest

# And we rebuild our README.md from the POD
if command -v pod2markdown &> /dev/null; then
    pod2markdown < lib/OpenAPI/Client/OpenAI.pm > README.md
else
    echo "Error: pod2markdown is not available."
    exit 1
fi

if [ "$notest" = false ]; then
    RELEASE_TESTING=1 make test
else
    echo Skipping tests due to -n|--notest flag
fi
