#!/usr/bin/env sh
#
# docker/php-fpm/entrypoint.sh — perfil de runtime (APP_ENV) + sanidade do "ignorar cPanel".
#
# Imagem oficial: NÃO fazemos chown (o UID/GID vem do Compose `user:`).
# 1) Gera um `php.ini` extra a partir do APP_ENV (OPcache/assertions/debug), espelhando
#    `config/environments.php`. O PHP lê este arquivo ANTES de subir, então OPcache e
#    `zend.assertions` (não ajustáveis em runtime) respeitam o ambiente.
# 2) Verifica que o PHP não vai ler php.ini/.user.ini do docroot (alerta, não falha).
set -eu

DOCROOT="${DOCROOT:-/var/www/html}"

# ---------------------------------------------------------------------------
# 1) Perfil de runtime por APP_ENV (dev = sem cache + debug total)
# ---------------------------------------------------------------------------
env_from_file() {
    [ -f "${DOCROOT}/.env" ] || return 0
    grep -E "^$1=" "${DOCROOT}/.env" | head -1 | cut -d= -f2- | tr -d '"' | tr -d "'" || true
}

APP_ENV_RESOLVED="${APP_ENV:-$(env_from_file APP_ENV)}"
APP_ENV_RESOLVED="${APP_ENV_RESOLVED:-production}"

case "${APP_ENV_RESOLVED}" in
    dev | local | testing)
        OP_CACHE=0
        OP_VALIDATE=1
        ASSERTIONS=1
        DISPLAY_ERRORS=On
        STARTUP_ERRORS=On
        HTML_ERRORS=On
        ERROR_REPORTING="E_ALL"
        COOKIE_SECURE=0
        ;;
    homolog | staging | hml)
        OP_CACHE=1
        OP_VALIDATE=1
        ASSERTIONS=-1
        DISPLAY_ERRORS=Off
        STARTUP_ERRORS=Off
        HTML_ERRORS=Off
        ERROR_REPORTING="E_ALL"
        COOKIE_SECURE=1
        ;;
    *)
        OP_CACHE=1
        OP_VALIDATE=0
        ASSERTIONS=-1
        DISPLAY_ERRORS=Off
        STARTUP_ERRORS=Off
        HTML_ERRORS=Off
        ERROR_REPORTING="E_ALL & ~E_DEPRECATED"
        COOKIE_SECURE=1
        ;;
esac

ENV_INI_DIR="${DOCROOT}/storage/framework/php-env"

if mkdir -p "${ENV_INI_DIR}" 2>/dev/null; then
    cat > "${ENV_INI_DIR}/zzz-env.ini" <<INI
; GERADO AUTOMATICAMENTE pelo entrypoint a partir de APP_ENV=${APP_ENV_RESOLVED}
; Espelha config/environments.php — não editar à mão.
opcache.enable=${OP_CACHE}
opcache.enable_cli=0
opcache.validate_timestamps=${OP_VALIDATE}
opcache.revalidate_freq=0
zend.assertions=${ASSERTIONS}
display_errors=${DISPLAY_ERRORS}
display_startup_errors=${STARTUP_ERRORS}
html_errors=${HTML_ERRORS}
error_reporting=${ERROR_REPORTING}
session.cookie_secure=${COOKIE_SECURE}
INI

    # Garante que este diretório seja lido DEPOIS do conf.d padrão da imagem.
    export PHP_INI_SCAN_DIR="${PHP_INI_SCAN_DIR:-/usr/local/etc/php/conf.d}:${ENV_INI_DIR}"
    echo "[php-entrypoint] perfil='${APP_ENV_RESOLVED}' opcache=${OP_CACHE} assertions=${ASSERTIONS} debug=${DISPLAY_ERRORS} cookie_secure=${COOKIE_SECURE}" >&2
else
    echo "[php-entrypoint] AVISO: '${ENV_INI_DIR}' não gravável — perfil de runtime ignorado" >&2
fi

# ---------------------------------------------------------------------------
# 2) user_ini.filename DEVE estar vazio (senão o .user.ini do docroot é lido).
# ---------------------------------------------------------------------------
user_ini="$(php -r 'echo (string) ini_get("user_ini.filename");' 2>/dev/null || true)"
if [ -n "$user_ini" ]; then
    echo "[php-entrypoint] AVISO: user_ini.filename='$user_ini' (esperado vazio) — .user.ini do docroot pode ser lido" >&2
fi

# CVE-2026-109619: o upload progress é um consumidor precoce de estado de sessão.
# Se a configuração regredir (php.ini ou pool), o container NÃO sobe: falhar aqui
# é melhor do que servir requests com o caminho de exploração habilitado.
upload_progress="$(php -r 'echo (int) ini_get("session.upload_progress.enabled");' 2>/dev/null || echo 1)"
if [ "$upload_progress" != "0" ]; then
    echo "[php-entrypoint] ERRO: session.upload_progress.enabled=${upload_progress} (esperado 0; CVE-2026-109619)" >&2
    exit 1
fi

# 3) Arquivos do painel presentes no docroot são esperados e devem ser INERTES.
for f in .user.ini php.ini .htaccess error_log; do
    if [ -e "${DOCROOT}/${f}" ]; then
        echo "[php-entrypoint] AVISO: ${DOCROOT}/${f} presente (cPanel) — deve ser ignorado por configuração" >&2
    fi
done

exec "$@"
