param($type)

$MsvcScript = 'D:\Program Files\Microsoft Visual Studio\2022\\Community\Common7\Tools\Launch-VsDevShell.ps1'
if (!(Test-Path $MsvcScript)) { $MsvcScript = 'D:\Program Files\Microsoft Visual Studio\2022\\Professional\Common7\Tools\Launch-VsDevShell.ps1' }
. $MsvcScript -SkipAutomaticLocation -Arch amd64

$qtHome = "D:\Qt\6.8.0\msvc2022_64"
$openSSLRoot = "D:\Qt\Tools\OpenSSLv3\Win_x64"

$librariesPath = "E:\Projects\Libraries"
if (!(Test-Path $librariesPath)) { $librariesPath = "D:\Projects\Libraries" }
$boostRoot = "$librariesPath\boost_1_86_0_msvc2022_64bit"
$ffmpegRoot = "$librariesPath\ffmpeg-7.0.2-full_build-shared"

$projectPath = Get-Location
$buildPath = Join-Path -Path $projectPath -ChildPath "build"
$deployPath = Join-Path -Path $buildPath -ChildPath "SmartLockerTools"
$zipFilePath = Join-Path -Path $buildPath -ChildPath "SmartLockerTools.zip"
$changelogPath = Join-Path -Path $buildPath -ChildPath "CHANGELOG.txt"

function Build() {
    if (!(Test-Path $buildPath\CMakeCache.txt)) {
        cmake.exe -G Ninja -S . -B build `
            -DCMAKE_BUILD_TYPE=Release `
            -DCMAKE_PREFIX_PATH=$qtHome `
            -DQT_DIR="$qtHome\lib\cmake\Qt6" `
            -DQt6_DIR="$qtHome\lib\cmake\Qt6" `
            -DQt6CoreTools_DIR="$qtHome\lib\cmake\Qt6CoreTools" `
            -DQt6QmlTools_DIR="$qtHome\lib\cmake\Qt6QmlTools" `
            -DLibraries_ROOT="$librariesPath"
    }
   
    cmake.exe --build $buildPath --target all
}

function Deploy() {
    if (Test-Path $deployPath) {
        Remove-Item $deployPath -Recurse -Force
    }
    New-Item $deployPath -ItemType Directory
    Copy-Item $buildPath\Analyser\Analyser.exe  $deployPath\Analyser.exe
    Copy-Item $buildPath\OtaUpdate\SmartLockerUpdater.exe  $deployPath\SmartLockerUpdater.exe

    $executables = "Analyser.exe", "SmartLockerUpdater.exe"
    foreach ($executable in $executables) {  
        & $qtHome\bin\windeployqt.exe $deployPath\$executable --qmldir=$qtHome\qml
    }

    $modules = "QmlCore"
    foreach ($module in $modules) {  
        Copy-Item -Path $qtHome\bin\Qt6$module.dll -Destination $deployPath
    }

    if (-Not (Test-Path -Path $deployPath\qml\QtCore)) {
        New-Item $deployPath\qml\QtCore -ItemType Directory
        $plugins = "qtqmlcoreplugin.dll", "qmldir", "plugins.qmltypes"
        foreach ($plugin in $plugins) {  
            Copy-Item -Path $QtHome\qml\QtCore\$plugin -Destination $deployPath\qml\QtCore
        }
    }

    Copy-Item $openSSLRoot\bin\libssl-3-x64.dll  $deployPath
    Copy-Item $openSSLRoot\bin\libcrypto-3-x64.dll  $deployPath

    $boosts = "thread", "filesystem", "log"
    foreach ($boost in $boosts) {  
        Copy-Item -Path $boostRoot\lib\boost_$boost-vc143-mt-x64-1_86.dll -Destination $deployPath
    }

    $ffmpegs = "avcodec-61", "avdevice-61", "avfilter-10", "avformat-61", "avutil-59", "postproc-58", "swresample-5", "swscale-8"
    foreach ($ffmpeg in $ffmpegs) {  
        Copy-Item -Path $ffmpegRoot\bin\$ffmpeg.dll -Destination $deployPath
    }

    Compress-Archive -Path $deployPath -DestinationPath $zipFilePath -Force
}

function Clean() {
    if (Test-Path $buildPath) {
        Remove-Item $buildPath -Recurse -Force
    }
}

function Changelog() {
    $commit_message = git log -1 --pretty=format:"%B"
    Write-Output "Latest commit message:"
    Write-Output $commit_message
    $commit_message | Out-File -FilePath $changelogPath -Encoding utf8
    Write-Output "Commit message has been written to $changelogPath"
}


switch ($type) {
    "build" {
        Build
    }
    "deploy" {
        Deploy
    }
    "clean" {
        Clean
    }
    "installer" {
        Installer
    }
    "changelog" {
        Changelog
    }
    "update" {
        UpdateServer
    }
}