#!/bin/bash

base_path=$(pwd)
build_path=${base_path}/build
qt_prefix_path="/opt/Qt/6.8.0/gcc_64"

debug_deploy=false

if [ -d ${qt_prefix_path} ]; then # 先找Qt6
    cmake_qt_parameters="-DCMAKE_PREFIX_PATH=${qt_prefix_path} \
        -DQT_QMAKE_EXECUTABLE=${qt_prefix_path}/bin/qmake \
        -DQT_DIR=${qt_prefix_path}/lib/cmake/Qt6 \
        -DQt6_DIR=${qt_prefix_path}/lib/cmake/Qt6 \
        -DQt6Core_DIR=${qt_prefix_path}/lib/cmake/Qt6Core \
        -DQt6Gui_DIR=${qt_prefix_path}/lib/cmake/Qt6Gui \
        -DQt6Qml_DIR=${qt_prefix_path}/lib/cmake/Qt6Qml \
        -DQt6Widgets_DIR=${qt_prefix_path}/lib/cmake/Qt6Widgets \
        -DQt6Quick_DIR=${qt_prefix_path}/lib/cmake/Qt6Quick \
        -DQt6Svg_DIR=${qt_prefix_path}/lib/cmake/Qt6Svg "
elif [ -d "/opt/Qt/5.15.2/gcc_64" ]; then
    qt_prefix_path="/opt/Qt/5.15.2/gcc_64"
    cmake_qt_parameters="-DCMAKE_PREFIX_PATH=${qt_prefix_path} \
        -DQT_QMAKE_EXECUTABLE=${qt_prefix_path}/bin/qmake \
        -DQT_DIR=${qt_prefix_path}/lib/cmake/Qt5 \
        -DQt5_DIR=${qt_prefix_path}/lib/cmake/Qt5 \
        -DQt5Core_DIR=${qt_prefix_path}/lib/cmake/Qt5Core \
        -DQt5Gui_DIR=${qt_prefix_path}/lib/cmake/Qt5Gui \
        -DQt5Qml_DIR=${qt_prefix_path}/lib/cmake/Qt5Qml \
        -DQt5Widgets_DIR=${qt_prefix_path}/lib/cmake/Qt5Widgets \
        -DQt5Quick_DIR=${qt_prefix_path}/lib/cmake/Qt5Quick \
        -DQt5Svg_DIR=${qt_prefix_path}/lib/cmake/Qt5Svg "
else
    cmake_qt_parameters=""
    echo "please install qt6.8.0 or qt5.15.2 ..."
fi

function cmake_scan() {
    if [ ! -d ${build_path} ]; then
        mkdir ${build_path}
    fi

    if [ $debug_deploy = true ]; then
        build_mode=-DCMAKE_BUILD_TYPE=Debug
        echo "build application in debug mode."
    else
        build_mode=-DCMAKE_BUILD_TYPE=Release
        echo "build application in release mode."
    fi

    cmake \
        -G Ninja \
        -S ${base_path} \
        -B ${build_path} \
        ${cmake_qt_parameters} \
        $build_mode
}

function build() {
    if [ ! -f "${build_path}/CMakeCache.txt" ]; then
        cmake_scan
    fi
    if [ $? -ne 0 ]; then
        exit 1
    fi
    cmake \
        --build ${build_path} \
        --target all
    if [ $? -ne 0 ]; then
        exit 1
    fi
}

function deploy() {
    if [ -d ${build_path}/lib ]; then
        rm -fr ${build_path}/lib
    fi
    mkdir ${build_path}/lib
    ldd ${build_path}/Analyser/Analyser.AppImage | grep "=> /" | awk '{print $3}' | xargs -I '{}' cp -v '{}' ${build_path}/lib
    ldd ${build_path}/Analyser/Analyser.AppImage | grep "ld-linux" | awk '{print $1}' | xargs -I '{}' cp -v '{}' ${build_path}/lib
    # ldd ${build_path}/OtaUpdate/SmartLockerUpdater | grep "=> /" | awk '{print $3}' | xargs -I '{}' cp -v '{}' ${build_path}/lib
    # ldd ${build_path}/OtaUpdate/SmartLockerUpdater | grep "ld-linux" | awk '{print $1}' | xargs -I '{}' cp -v '{}' ${build_path}/lib

    rm ${build_path}/lib/ld-linux-x86-64.so.2
    rm ${build_path}/lib/libc.so.6
    rm ${build_path}/lib/libm.so.6
    rm ${build_path}/lib/libstdc++.so.6
    cd build
    cpack
    cd ..
}

function change_log() {
    commit_message=$(git log -1 --pretty=format:"%B")
    echo "Latest commit message:"
    echo "$commit_message"
    echo "$commit_message" >${build_path}/CHANGELOG.txt
    echo "Commit message has been written to ${build_path}/CHANGELOG.txt"
}

function main() {
    local cmd=$1
    shift 1
    case $cmd in
    build)
        build
        ;;
    scan)
        cmake_scan
        ;;
    clean)
        clean
        ;;
    deploy)
        deploy
        ;;
    changelog)
        change_log
        ;;
    *)
        build
        ;;
    esac
}

main $@
