#!/usr/bin/env bash
set -euo pipefail

ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
cd "$ROOT_DIR"

if [ -f ".env.deploy" ]; then
    set -a
    # shellcheck disable=SC1091
    source ".env.deploy"
    set +a
fi

: "${FTP_HOST:?Falta FTP_HOST en .env.deploy}"
: "${FTP_PORT:=21}"
: "${FTP_USER:?Falta FTP_USER en .env.deploy}"
: "${FTP_PASS:?Falta FTP_PASS en .env.deploy}"
: "${FTP_REMOTE_PATH:=/public_html}"

if ! git rev-parse --verify HEAD >/dev/null 2>&1; then
    echo "No hay commit actual."
    exit 1
fi

if git rev-parse --verify HEAD~1 >/dev/null 2>&1; then
    RANGE="HEAD~1 HEAD"
else
    RANGE="HEAD"
fi

echo "Archivos modificados en el ultimo commit:"
git diff-tree --no-commit-id --name-status -r $RANGE
echo

while IFS=$'\t' read -r status path extra; do
    case "$status" in
        D)
            echo "Saltando borrado remoto: $path"
            continue
            ;;
        R*|C*)
            path="$extra"
            ;;
    esac

    if [ ! -f "$path" ]; then
        echo "Saltando no-archivo: $path"
        continue
    fi

    case "$path" in
        .git/*|.vscode/*|var/cache/*|var/log/*|tests/*|.env.dev|.env.test|.env.local.dev|.env.deploy|compose.yaml|compose.override.yaml|phpunit.dist.xml)
            echo "Ignorado: $path"
            continue
            ;;
    esac

    remote_url="ftp://${FTP_HOST}:${FTP_PORT}${FTP_REMOTE_PATH}/${path}"
    echo "Subiendo $path"
    curl --silent --show-error --fail --ftp-create-dirs \
        --user "${FTP_USER}:${FTP_PASS}" \
        --upload-file "$path" \
        "$remote_url"
done < <(git diff-tree --no-commit-id --name-status -r $RANGE)

echo
echo "Subida terminada."
