FROM webdevops/php-dev:8.4

# Firebird 5.0.2 client - backward compatible with Firebird 3 server
# Bookworm (base image) only ships FB3 via apt; FB5 client installed from official release.
# Client version may exceed server version: FB5 client negotiates FB3 wire protocol at runtime.
ENV FB5_VERSION=5.0.2.1613-0

RUN set -eux && \
    apt-get update && \
    # firebird3.0-utils: FB3-compatible gbak for restoring test DB to FB3 server.
    # FB5 gbak sends BLR opcodes (e.g. opcode 217) that FB3 server cannot parse.
    apt-get install -y --no-install-recommends curl ca-certificates libtommath1 firebird3.0-utils && \
    # -------------------------------------------------------------------------
    # Firebird 5 client install
    # Release tarball format: outer.tar.gz -> buildroot.tar.gz -> actual files
    # -------------------------------------------------------------------------
    curl -fsSL "https://github.com/FirebirdSQL/firebird/releases/download/v5.0.2/Firebird-${FB5_VERSION}-linux-x64.tar.gz" \
      -o /tmp/fb5.tar.gz && \
    mkdir -p /tmp/fb5outer /tmp/fb5root && \
    tar -xzf /tmp/fb5.tar.gz -C /tmp/fb5outer --strip-components=1 && \
    tar -xzf /tmp/fb5outer/buildroot.tar.gz -C /tmp/fb5root && \
    # Client shared library: copy actual file (so.5.0.2), then create SO version chain
    # libfbclient.so.2 and libfbclient.so -> libfbclient.so.5.0.2 (SONAME = libfbclient.so.2)
    cp /tmp/fb5root/opt/firebird/lib/libfbclient.so.5.0.2 /usr/lib/x86_64-linux-gnu/ && \
    ln -sf libfbclient.so.5.0.2 /usr/lib/x86_64-linux-gnu/libfbclient.so.2 && \
    ln -sf libfbclient.so.2 /usr/lib/x86_64-linux-gnu/libfbclient.so && \
    install -m755 /tmp/fb5root/opt/firebird/lib/libib_util.so /usr/lib/x86_64-linux-gnu/ && \
    # FB5 bundles libtomcrypt (crypto) - copy so gbak/extension can load it
    cp /tmp/fb5root/opt/firebird/lib/libtomcrypt.so.1.0.1 /usr/lib/x86_64-linux-gnu/ && \
    ln -sf libtomcrypt.so.1.0.1 /usr/lib/x86_64-linux-gnu/libtomcrypt.so.1 && \
    ln -sf libtomcrypt.so.1 /usr/lib/x86_64-linux-gnu/libtomcrypt.so && \
    ldconfig && \
    # Headers for PHP extension compilation
    # FB5 ibase.h uses relative includes (impl/types_pub.h, etc.) - both locations need impl/.
    # php-firebird config.m4 adds -I/opt/firebird/include to CFLAGS; put flat tree there.
    # /usr/include/ibase.h needed for detection; impl/ must be co-located there too.
    mkdir -p /opt/firebird/include && \
    cp -r /tmp/fb5root/opt/firebird/include/firebird/. /opt/firebird/include/ && \
    cp /tmp/fb5root/opt/firebird/include/firebird/ibase.h /usr/include/ && \
    cp /tmp/fb5root/opt/firebird/include/firebird/ib_util.h /usr/include/ && \
    cp /tmp/fb5root/opt/firebird/include/firebird/iberror.h /usr/include/ && \
    cp -r /tmp/fb5root/opt/firebird/include/firebird/impl /usr/include/ && \
    cp -r /tmp/fb5root/opt/firebird/include/firebird /usr/include/ && \
    # Install auth plugins + intl support to /opt/firebird
    # Plugins required for client auth handshake with FB3 server
    mkdir -p /opt/firebird/plugins /opt/firebird/intl && \
    cp -r /tmp/fb5root/opt/firebird/plugins/. /opt/firebird/plugins/ && \
    cp -r /tmp/fb5root/opt/firebird/intl/. /opt/firebird/intl/ && \
    # Client utilities: isql from FB5 for debugging (gbak uses FB3 version from apt)
    # Note: FB5 gbak is NOT installed; firebird3.0-utils provides FB3 gbak at /usr/bin/gbak.
    install -m755 /tmp/fb5root/opt/firebird/bin/isql /usr/local/bin/ && \
    # Firebird client config: enable Legacy_Auth + Srp for FB3 server compatibility
    echo "AuthClient = Legacy_Auth, Srp" > /opt/firebird/firebird.conf && \
    echo "RootDirectory = /opt/firebird" >> /opt/firebird/firebird.conf && \
    # Cleanup source tarballs
    rm -rf /tmp/fb5.tar.gz /tmp/fb5outer /tmp/fb5root && \
    # -------------------------------------------------------------------------
    # php-firebird v13.0.3 - M3 opaque-object migration
    # (Firebird\Connection, Transaction, Statement, ResultSet, Blob)
    # FB_API_VER=40 enables Firebird 4+ batch API and pdo_fbird PDO driver.
    # FB5 client connects backward to FB3 server via protocol negotiation.
    # v13.x required by satag/doctrine-firebird-driver ^4.6.2 (ext-firebird ^13.0.1).
    # -------------------------------------------------------------------------
    docker-php-source extract && \
    git clone --branch v13.0.3 --depth 1 https://github.com/satwareAG/php-firebird.git /usr/src/php/ext/firebird && \
    export FB_API_VER=40 && \
    docker-php-ext-install firebird && \
    # Install OO API PHP files (Firebird\Connection, Database, TBuilder, etc.)
    # v13.x requires these userland classes for the M3 opaque-object API
    mkdir -p /usr/local/lib/php/Firebird && \
    cp /usr/src/php/ext/firebird/src/Firebird/*.php /usr/local/lib/php/Firebird/ && \
    # Install PCOV for faster coverage (alternative to xdebug)
    pecl install pcov && docker-php-ext-enable pcov && \
    # Final cleanup
    apt-get autoremove -y && rm -rf /var/lib/apt/lists/*
