#
# @author Codename
# @copyright (c) 2008 - 2019 Life of German
# @warning Start this script only once, after building server dll
# @description This powershell script copies necessary files to (local/remote) server dir for windows developers
#

# set parameters
param (
    [string]$buildDirectory,
    [string]$buildFilename
)

# set constant path
Set-Variable configPath -option Constant -value "$PSScriptRoot\postbuild.config.xml"
Set-Variable serverProjectPath -option Constant -value "$PSScriptRoot\ReallifeGamemode.Server"
Set-Variable clientProjectPath -option Constant -value "$PSScriptRoot\ReallifeGamemode.Client"
Set-Variable sourceAssetsPath -option Constant -value "$PSScriptRoot\ReallifeGamemode.Client\assets"
Set-Variable sourceIndexJsPath -option Constant -value "$PSScriptRoot\ReallifeGamemode.Client\index.js"
Set-Variable sourceDlcPacksPath -option Constant -value "$PSScriptRoot\ReallifeGamemode.Client\dlcpacks"

# set constant dirs
Set-Variable runtimeDir -option Constant -value "dotnet\runtime"
Set-Variable resourcesDir -option Constant -value "dotnet\resources"
Set-Variable gamemodeDir -option Constant -value "reallife-gamemode"
Set-Variable assetsDir -option Constant -value "client_packages\assets"
Set-Variable indexJsDir -option Constant -value "client_packages"
Set-Variable dlcPacksDir -option Constant -value "source_dlcpacks"
Set-Variable fullBuildDir -option Constant -value "$serverProjectPath\$buildDirectory"

# create default config file if not exist
if (![System.IO.File]::Exists($configPath)) {
    # resolve default server path (default: .\..)
    $defaultServerPath = (Resolve-Path -Path "$PSScriptRoot\..")
    if (!$defaultServerPath) {
        Write-Error "resolving local server path failed"
        exit 1
    }
    
    $defaultXmlContent = "<?xml version=`"1.0`" encoding=`"UTF-8`"?>
<config>
    <local>
        <enabled>true</enabled>
        <rageMpServerPath>$defaultServerPath</rageMpServerPath>
        <update>
            <server>
                <metaXml>true</metaXml>
                <allDependencies>true</allDependencies>
            </server>
            <client>
                <assets>false</assets>
                <indexJs>false</indexJs>
                <dlcPacks>false</dlcPacks>
            </client>
        </update>
    </local>
    <remote>
        <enabled>false</enabled>
        <ftpServerAddress>127.0.0.1</ftpServerAddress>
        <ftpServerPort>21</ftpServerPort>
        <ftpServerUsername>USERNAME</ftpServerUsername>
        <ftpServerPassword>PASSWORD</ftpServerPassword>
        <rageMpServerPath>.</rageMpServerPath>
        <update>
            <server>
                <metaXml>false</metaXml>
                <allDependencies>false</allDependencies>
            </server>
            <client>
                <assets>false</assets>
                <indexJs>false</indexJs>
                <dlcPacks>false</dlcPacks>
            </client>
        </update>
    </remote>
</config>"

    # create default content
    New-Item $configPath
    Set-Content $configPath $defaultXmlContent
}

# load existing xml config file
[xml]$xmlConfig = Get-Content -Path $configPath
if (!$xmlConfig) {
    throw "opening XML config file failed"
}

# first compile typescript files if enabled in config file
if (($xmlConfig.config.local.update.client.indexJs -eq "true" -and $xmlConfig.config.local.enabled -eq "true") -or
    ($xmlConfig.config.remote.update.client.indexJs -eq "true" -and $xmlConfig.config.remote.enabled -eq "true")) {
    $path = $PSScriptRoot
    Set-Location -Path $clientProjectPath
    npx webpack --config webpack.config.build.js
    Set-Location -Path $path
}

# update local files if enabled in config file
if ($xmlConfig.config.local.enabled -eq "true") {
    # get local server path from xml config file
    Set-Variable serverPath -option Constant -value $xmlConfig.config.local.rageMpServerPath
    if (!$serverPath) {
        Write-Error "empty local rage mp server path in config file"
        exit 1
    }

    # check if local server path exists
    if (!(Test-Path $serverPath)) {
        Write-Error "local rage mp server path ($serverPath) not found. Have you moved your local rage mp directory?"
        exit 1
    }

    # check if local resources path exists
    Set-Variable resourcesPath -option Constant -value "$serverPath\$resourcesDir"
    if (!(Test-Path $resourcesPath)) {
        Write-Error "local resources path ($resourcesPath) not found. Please set up C# Bridge locally first, 
        see https://wiki.gtanet.work/index.php?title=Setting_up_the_Bridge_on_Linux/Windows"
        exit 1
    }

    # create local gamemode dir if not exist
    Set-Variable gamemodePath -option Constant -value "$resourcesPath\$gamemodeDir"
    if (!(Test-Path $gamemodePath)) {
        New-Item -ItemType Directory -Force -Path $gamemodePath
    }

    # copy compiled gamemode to local gamemode path
    Copy-Item "$fullBuildDir\$buildFilename" $gamemodePath -Force

    # copy meta.xml to local gamemode path if 'local.update.server.metaXml' is set to 'true' in config file
    if ($xmlConfig.config.local.update.server.metaXml -eq "true") {
        Copy-Item "$fullBuildDir\meta.xml" $gamemodePath -Force
    }

    # copy dependencies to local runtime path if 'local.update.server.allDependencies' is set to 'true' in config file
    if ($xmlConfig.config.local.update.server.allDependencies -eq "true") {
        # check if local runtime path exists
        Set-Variable runtimePath -option Constant -value "$serverPath\$runtimeDir"
        if (!(Test-Path $runtimePath)) {
            Write-Error "local runtime path ($runtimePath) not found. Please set up C# Bridge locally first, 
            see https://wiki.gtanet.work/index.php?title=Setting_up_the_Bridge_on_Linux/Windows"
            exit 1
        }
        Copy-Item "$fullBuildDir\*.dll" $runtimePath -Exclude "*$buildFilename*" -Force
    }

    # copy assets to local client packages path if 'local.update.client.assets' is set to 'true' in config file
    if ($xmlConfig.config.local.update.client.assets -eq "true") {
        # create local assets path if not exist
        Set-Variable assetsPath -option Constant -value "$serverPath\$assetsDir"
        if (!(Test-Path $assetsPath)) {
            New-Item -ItemType Directory -Force -Path $assetsPath
        }
        robocopy $sourceAssetsPath $assetsPath /MIR
    }

    # copy index.js to local client packages path if 'local.update.client.indexJs' is set to 'true' in config file
    if ($xmlConfig.config.local.update.client.indexJs -eq "true") {
        # create local client packages if not exist
        Set-Variable indexJsPath -option Constant -value "$serverPath\$indexJsDir"
        if (!(Test-Path $indexJsPath)) {
            New-Item -ItemType Directory -Force -Path $indexJsPath
        }
        Copy-Item $sourceIndexJsPath $indexJsPath -Force
    }

    # copy dlc packs to local dlc packs path if 'local.update.client.dlcPacks' is set to 'true' in config file
    if ($xmlConfig.config.local.update.client.dlcPacks -eq "true") {
        # create local dlc packs path if not exist
        Set-Variable dlcPacksPath -option Constant -value "$serverPath\$dlcPacksDir"
        if (!(Test-Path $dlcPacksPath)) {
            New-Item -ItemType Directory -Force -Path $dlcPacksPath
        }
        robocopy $sourceDlcPacksPath $dlcPacksPath /MIR
    }
}

# update remote files if enabled in config file
if ($xmlConfig.config.remote.enabled -eq "true") {
    # TODO: connect to remote ftp server and update files
}

exit 0