#!/usr/bin/env bash

set -euo pipefail

project_root="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
release_name="${1:-francoach-production-$(date +%Y%m%d-%H%M%S)}"
release_root="${project_root}/release"
release_dir="${release_root}/${release_name}"
archive_path="${release_root}/${release_name}.zip"
temporary_root="$(mktemp -d "${TMPDIR:-/tmp}/francoach-release.XXXXXX")"
stage_dir="${temporary_root}/${release_name}"

cleanup() {
    rm -rf "${temporary_root}"
}

trap cleanup EXIT

if [[ "${release_name}" == */* || "${release_name}" == "." || "${release_name}" == ".." ]]; then
    echo "Nome release non valido." >&2
    exit 1
fi

if [[ -e "${release_dir}" || -e "${archive_path}" ]]; then
    echo "La release ${release_name} esiste già." >&2
    exit 1
fi

cd "${project_root}"

composer validate --strict
composer audit --locked
npm ci
npm audit --omit=dev
npm run build
vendor/bin/pint --test
php artisan test

mkdir -p "${stage_dir}"

rsync -a \
    --exclude '/.claude/' \
    --exclude '/.env' \
    --exclude '/.git/' \
    --exclude '/.github/' \
    --exclude '/.phpunit.result.cache' \
    --exclude '/design-qa.md' \
    --exclude '/francoach.code-workspace' \
    --exclude '/node_modules/' \
    --exclude '/output/' \
    --exclude '/public/hot' \
    --exclude '/public/storage' \
    --exclude '/release/' \
    --exclude '/storage/' \
    --exclude '/tests/' \
    --exclude '/vendor/' \
    "${project_root}/" "${stage_dir}/"

mkdir -p \
    "${stage_dir}/storage/app/private/progress-photos" \
    "${stage_dir}/storage/app/private/chat-attachments" \
    "${stage_dir}/storage/app/private/documents" \
    "${stage_dir}/storage/app/public" \
    "${stage_dir}/storage/framework/cache/data" \
    "${stage_dir}/storage/framework/sessions" \
    "${stage_dir}/storage/framework/testing" \
    "${stage_dir}/storage/framework/views" \
    "${stage_dir}/storage/logs"

cp "${project_root}/storage/app/public/.htaccess" "${stage_dir}/storage/app/public/.htaccess"
find "${stage_dir}/storage" -type d -exec chmod 0750 {} +
find "${stage_dir}/storage" -type f -exec chmod 0640 {} +
chmod 0750 "${stage_dir}/bootstrap/cache"

composer install \
    --working-dir="${stage_dir}" \
    --no-dev \
    --prefer-dist \
    --optimize-autoloader \
    --no-interaction \
    --no-progress

npm ci \
    --prefix "${stage_dir}" \
    --omit=dev \
    --ignore-scripts \
    --no-audit \
    --no-fund

test -f "${stage_dir}/vendor/autoload.php"
test -f "${stage_dir}/public/build/manifest.json"
test -f "${stage_dir}/public/.htaccess"
test -f "${stage_dir}/node_modules/playwright-core/package.json"
test ! -e "${stage_dir}/.env"
test ! -e "${stage_dir}/public/storage"

mkdir -p "${release_root}"
mv "${stage_dir}" "${release_dir}"

cd "${release_root}"
COPYFILE_DISABLE=1 zip -qr "${archive_path}" "${release_name}"

echo "${release_dir}"
echo "${archive_path}"
