#!/usr/bin/env sh
# @file ansible_generate_readme_collection.sh
# @description
#
# This script generates a README.md file for an Ansible collection. Content is fetched
# from the information in `galaxy.yml` and from the the individual roles in
# `roles/*/README.md` and `roles/*/meta/main.yml`.
#
# By default, the current working directory is used as the source. Via parameters, a
# different directoriy can be specified.
#
# To fill the table of roles with information, the README.md of each role must contain
# three paragraphs starting with `**Description:**`, `**Required variables:**` and
# `**Additional info:**` respectively.
#

set -eu

COLLECTION_DIR="$(readlink -f "${@:-.}")"

if [ ! -f "${COLLECTION_DIR}"/galaxy.yml ]; then
  echo "script must be executed from main collection directory"
  exit 1
fi

COLLECTION_NAME="$(yq eval '.namespace' "${COLLECTION_DIR}"/galaxy.yml).$(yq eval '.name' "${COLLECTION_DIR}"/galaxy.yml)"
COLLECTION_TITLE="Ansible collection '${COLLECTION_NAME}'"
echo "Generate README.md for ${COLLECTION_TITLE}"
COLLECTION_DESCRIPTION="$(yq eval '.description' "${COLLECTION_DIR}"/galaxy.yml)"
COLLECTION_DEPENDENCIES="$(yq eval '.dependencies' "${COLLECTION_DIR}"/galaxy.yml | sed "s/{}/None./g; s/^/- /g")"
COLLECTION_LICENSE="$(yq eval '.license' "${COLLECTION_DIR}"/galaxy.yml)"
COLLECTION_AUTHOR="$(yq eval '.authors[0]' "${COLLECTION_DIR}"/galaxy.yml)"

COLLECTION_ROLES_TABLE="| Role (click for documentation) | Description | Required variables | Additional info | OS |
"
COLLECTION_ROLES_TABLE="${COLLECTION_ROLES_TABLE}| --- | --- | --- | --- | --- |
"
# shellcheck disable=2002
for i in "${COLLECTION_DIR}"/roles/*; do
  ROLE_NAME="[${COLLECTION_NAME}.$(basename "${i}")](roles/$(basename "${i}")/README.md)"
  ROLE_DESCRIPTION="$(cat "${i}"/README.md | grep "\*\*Description:\*\* " | sed "s/^\*\*Description:\*\* //g" || echo "None.")"
  ROLE_REQUIRED_VARIABLES="$(cat "${i}"/README.md | grep "\*\*Required variables:\*\* " | sed "s/^\*\*Required variables:\*\* //g" || echo "None.")"
  ROLE_ADDITIONAL_INFO="$(cat "${i}"/README.md | grep "\*\*Additional info:\*\* " | sed "s/^\*\*Additional info:\*\* //g" || echo "None.")"
  ROLE_OS="<ul>"
  for j in $(seq 1 "$(yq eval '.galaxy_info.platforms | length' "${i}"/meta/main.yml)"); do
    j0="$((j-1))"
    for k in $(seq 1 "$(yq eval ".galaxy_info.platforms[${j0}].versions | length" "${i}"/meta/main.yml)"); do
      k0="$((k-1))"
       ROLE_OS="${ROLE_OS}<li>$(yq eval ".galaxy_info.platforms[${j0}].name" "${i}"/meta/main.yml) $(yq eval ".galaxy_info.platforms[${j0}].versions[${k0}]" "${i}"/meta/main.yml)</li>"
    done
  done
  ROLE_OS="${ROLE_OS}</ul>"
  COLLECTION_ROLES_TABLE="${COLLECTION_ROLES_TABLE}| ${ROLE_NAME} | ${ROLE_DESCRIPTION} | ${ROLE_REQUIRED_VARIABLES} | ${ROLE_ADDITIONAL_INFO} | ${ROLE_OS} |
"
done

cat <<EOF > "${COLLECTION_DIR}"/README.md
# ${COLLECTION_TITLE}

${COLLECTION_DESCRIPTION}

## Roles

${COLLECTION_ROLES_TABLE}

## Dependencies

${COLLECTION_DEPENDENCIES}

## License

${COLLECTION_LICENSE}

## Author

${COLLECTION_AUTHOR}
EOF
