# Copyright 1999-2025 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2

EAPI=8
PYTHON_COMPAT=( python3_{11..13} )
IUSE="+av1 +codec2 -daemon doc -extras"

inherit cmake distutils-r1 git-r3 xdg-utils desktop

DESCRIPTION="Open source softphone for voice and video over IP calling and instant messaging."
HOMEPAGE="https://www.linphone.org/en/homepage-linphone"
KEYWORDS="~amd64"
LICENSE="GPL-3"
SLOT="0"

RESTRICT="test" # Not yet evaluated - TODO

EGIT_REPO_URI="https://github.com/BelledonneCommunications/linphone-desktop.git"
#EGIT_COMMIT="${PV//_/-}"
EGIT_COMMIT="ee8e8a4fa8f2b05303e6357fca2836dda98e8f28"
EGIT_SUBMODULES=(
    '*'
    '-external/linphone-sdk/external/*'
    'external/linphone-sdk/external/bv16-floatingpoint'
    'external/linphone-sdk/external/soci'
    'external/linphone-sdk/external/liboqs'
    'external/linphone-sdk/external/decaf'
)

RDEPEND="
    dev-db/sqlite
    dev-libs/jsoncpp
    dev-libs/libayatana-appindicator
    dev-libs/libxml2
    dev-libs/openssl:0/3
    dev-libs/qtkeychain[qt6]
    dev-libs/xerces-c
    dev-python/pystache[${PYTHON_USEDEP}]
    dev-python/six[${PYTHON_USEDEP}]
    dev-qt/qttools:6[linguist,qml]
    dev-qt/qtdeclarative:6
    dev-qt/qtmultimedia:6
    dev-qt/qtnetworkauth:6
    media-libs/glew:0
    media-libs/libjpeg-turbo
    media-libs/libvpx
    media-libs/libyuv
    media-libs/opencore-amr
    media-libs/openh264
    media-libs/opus
    media-libs/speex
    media-libs/speexdsp
    media-libs/vo-amrwbenc
    media-libs/zxing-cpp
    media-sound/gsm
    media-video/ffmpeg
    net-libs/libsrtp:2
    net-nds/openldap
    av1? (
        media-libs/dav1d
        media-libs/libaom
    )
    codec2? ( media-libs/codec2 )
    doc? ( app-text/doxygen )
"
DEPEND="${RDEPEND}"

src_unpack() {
    git-r3_src_unpack
    default
}

src_prepare() {
    # invalid files (those are directories and must be removed)
    rm -rf external/linphone-sdk/external/liboqs/scripts/copy_from_upstream/src/CMakeLists.txt || die
    rm -rf external/linphone-sdk/external/liboqs/scripts/copy_from_upstream/CMakeLists.txt || die

    # patching non-default TLS_PEER_CN flag (this might cause serious problems)
    sed -i 's/LDAP_OPT_X_TLS_PEER_CN/0x601c/g' \
        external/linphone-sdk/liblinphone/src/ldap/ldap-contact-provider.cpp || die

    # patching post-build copyings
    sed -i -e "s~>\ \"~>\ \"/${T}/${P}~g" -e "s~/\"\ \"~\"\ \"/${T}/${P}~g" \
        Linphone/CMakeLists.txt || die

    # removing jsoncpp (it does no longer provide cmake files)
    sed -i '/find_package(JsonCPP REQUIRED)/d' external/linphone-sdk/liblinphone/CMakeLists.txt || die

    # enabeling german langauge
    cp "${FILESDIR}/de.ts" Linphone/data/languages || die
    sed -i 's/set(LANGUAGES en fr_FR)/set(LANGUAGES de en fr_FR)/' Linphone/CMakeLists.txt || die

    cmake_src_prepare
}

src_configure() {
    local LIBDIR="/usr/`get_libdir`"
    local mycmakeargs=(
        -DCMAKE_BUILD_TYPE=Release
        -DBUILD_SHARED_LIBS=ON
        -DENABLE_SHARED=ON

        -DENABLE_DOC=$(usex doc)
        -DENABLE_DAEMON=$(usex daemon)
        -DENABLE_TOOLS=$(usex extras)
        -DENABLE_AV1=$(usex av1)
        -DENABLE_CODEC2=$(usex codec2)

        # moving to ssl instead of mbedtls .. 
        -DENABLE_MBEDTLS=NO
        -DENABLE_OPENSSL=YES
        -DBUILD_OPENSSL=OFF
        -DENABLE_LDAP=NO
        -DBUILD_LDAP=OFF

        # not availbale libs (must be build)
        -DBUILD_BV16=ON
        -DBUILD_LIBOQS=ON
        -DBUILD_SOCI=ON

        # disabled building external libs
        -DBUILD_AOM=OFF
        -DBUILD_CODEC2=OFF
        -DBUILD_DAV1D=OFF
        -DBUILD_FFMPEG=OFF
        -DBUILD_GSM=OFF
        -DBUILD_JSONCPP=OFF
        -DBUILD_LIBJPEGTURBO=OFF
        -DBUILD_LIBSRTP2=OFF
        -DBUILD_LIBVPX=OFF
        -DBUILD_LIBXML2=OFF
        -DBUILD_LIBYUV=OFF
        -DBUILD_MBEDTLS=OFF
        -DBUILD_OPENCORE_AMR=OFF
        -DBUILD_OPENH264=OFF
        -DBUILD_OPENLDAP=OFF
        -DBUILD_OPUS=OFF
        -DBUILD_SPEEX=OFF
        -DBUILD_SQLITE3=OFF
        -DBUILD_VO_AMRWBENC=OFF
        -DBUILD_XERCESC=OFF
        -DBUILD_ZLIB=OFF
        -DBUILD_ZXINGCPP=OFF

        # correcting targets
        -DOpenH264_TARGET=openh264
        -DJsonCPP_TARGET=jsoncpp
        -DDav1d_TARGET=dav1d
        -DAom_TARGET=aom

        # Qt6 adjustments (use system keychain)
        -DENABLE_QT_KEYCHAIN=OFF
        -DQTKEYCHAIN_TARGET_NAME=Qt6Keychain

        -DQT_I18N_TRANSLATED_LANGUAGES="de en fr"
        -DI18N_SOURCE_LANGUAGE="fr"

        # correcting plugin paths
        -DLIBLINPHONE_PLUGINS_DIR=/opt/${PN}/plugins
        -DLINPHONE_PACKAGE_PLUGINS_DIR=/opt/${PN}/plugins

        # skipping RPATH
        -DCMAKE_SKIP_RPATH=ON
        -Wno-dev

        # add missing include dirs
        -DCMAKE_CXX_FLAGS=-Wno-dev\ -I\ /usr/include/openh264\ -I\ /usr/include/jsoncpp\ -I\ /usr/include/mbedtls3\ -I\ "${T}/${P}"/usr/include
    )
    cmake_src_configure
}

src_compile() {
    sed -i 's/RelWithDebInfo/Release/g' \
        "${WORKDIR}/${P}_build/cmake_install.cmake" || die

    cmake_src_compile
}

src_install() {
    cmake_src_install # this might produce "errors" (corrections below)

    # package base-name (linphone)
    local PBN=${PN%%-*}

    einfo "cleaning up build-fragments.."
    rm -rf "${D}"/usr/cmake
    rm -rf "${D}"/usr/include
    rm -rf "${D}"/usr/share/*/cmake
    rm -rf "${D}"/usr/share/BCUnit
    rm -rf "${D}"/usr/share/images
    rm -rf "${D}/usr/`get_libdir`"/cmake
    rm -rf "${D}/usr/`get_libdir`"/pkgconfig

    einfo "removing external docs.."
    rm -rf "${D}"/usr/share/doc/ortp*

    einfo "installing plugin(s).."
    dodir "/opt/${PN}/plugins/"
    dosym "/usr/`get_libdir`/libsoci_core.so" "/opt/${PN}/plugins/libsoci_core.so"
    dosym "/usr/`get_libdir`/libsoci_sqlite3.so" "/opt/${PN}/plugins/libsoci_sqlite3.so"

    einfo "move binaries into right place.."
    exeinto /opt/${PN}/bin
    for exf in "${D}"/usr/bin/*; do
        doexe ${exf}                                    # install from bin (exe)
        rm ${exf}                                       # remove installed bin
    done

    # re-link main binary
    dosym /opt/${PN}/bin/${PBN}6 /usr/bin/${PBN}

    # create desktop icon
    newicon "${S}/Linphone/data/image/${PBN}.svg" ${PBN}.svg
    make_desktop_entry /usr/bin/${PBN} Linphone /usr/share/pixmaps/${PBN}.svg
}


pkg_postinst() {
    xdg_icon_cache_update
}

pkg_postrm() {
    xdg_icon_cache_update
}