#Requires -RunAsAdministrator

<#PSScriptInfo

    .VERSION 1.0
    .GUID frdepo55-10b0-472d-a29d-301f4eaea31a
    .AUTHOR Sage X3 R&D
    .COMPANYNAME Sage
    .COPYRIGHT (c) Copyright SAGE 2006-2025. All Rights Reserved.
    .TAGS Windows
    .LICENSEURI
    .PROJECTURI
    .ICONURI
    .EXTERNALMODULEDEPENDENCIES
    .REQUIREDSCRIPTS beforepacks.ps1
    .EXTERNALSCRIPTDEPENDENCIES Powershell-5.1
    .RELEASENOTES
    .PRIVATEDATA
    .SYNOPSIS
       Prepare SYRACUSE Update
    .DESCRIPTION      
     X3 V12 - beforepacks.ps1: PowerShell Script to prepare Syracuse Update

    .EXAMPLE
     Powershell.exe -executionpolicy remotesigned -File  .\beforepacks.ps1 -InstallPath "C:\Sage\SyracuseComponent"

     .NOTES
    Author: Franck DEPOORTERE
    Date:   January 01, 2025
     #>

param( 
    [Parameter(Mandatory = $true)] [string] $InstallPath
)

function Get-Formatted-Date() {
    <#
        .SYNOPSIS
            Date formating for Log trace
        .INPUTS
            None
        .OUTPUTS
            Date in a specific Format, such as  2020_09_28_08_36_59_123
    #>
    return Get-Date -Format yyyy_MM_dd_HH_mm_ss_fff
}

function Show-Usage() {
    Add-To-Log -line "Usage: beforepacks.ps1 -InstallPath c:\\Sage\\XXX"
}


function Add-To-Log {
    param(
        [Parameter(Mandatory = $true, Position = 1)] [string] $line,
        [Parameter(Mandatory = $false, Position = 2)] [int] $errorLevel
    )
    # Error
    if (($errorLevel -eq 1) -and -Not ([string]::IsNullOrEmpty($SCRIPT_LOGDAT))) {
        Add-Content -Value "Error" -Path $SCRIPT_LOGDAT 
    } 

    if (($errorLevel -eq 0) -And -Not ([string]::IsNullOrEmpty($SCRIPT_LOGDAT)) ) {
        Add-Content -Value $line -Path $SCRIPT_LOGDAT
    }

    if ($errorLevel -eq 1) {
        Write-Error $line
    } 
    else {
        Write-Host $line
    }
}



function Stop-SyracuseService {

    param(
        [Parameter(Mandatory = $true)] [string] $ServiceShortName
    )

    Add-To-Log -line "Check $ServiceShortName Syracuse service status" -errorLevel 0
    $serviceFound = Get-Service |  where-object { $_.Name -eq $ServiceShortName } | select-object -property Name, ServiceName, DisplayName, Status

    if ($serviceFound) {    
        Add-To-Log -line  "Service $ServiceShortName status:  $serviceFound.Status "  -errorLevel 0
        if ($serviceFound.Status -eq "Stopped") {
            Add-To-Log -line  "Service $ServiceShortName already stopped"  -errorLevel 0
        }
        elseif ($serviceFound.Status -eq "Running") {
            Add-To-Log -line  "Stopping Service $ServiceShortName (status:  $serviceFound.Status)"  -errorLevel 0
            Stop-Service -Name $serviceFound.name
            $serviceFound = Get-Service |  where-object { $_.Name -eq $ServiceShortName } | select-object -property Name, ServiceName, DisplayName, Status
            Add-To-Log -line  "Service $ServiceShortName stopped: $serviceFound.Status"  -errorLevel 0
            # We need to wait to avoid error : "The process cannot access the file because it is being used by another process" 
            Start-Sleep -Seconds 5
        }
    }
    else {
        Add-To-Log -line  "Service $ServiceShortName not found"  -errorLevel 0
    }
}



<###########################################################
#   MAIN SCRIPT ENTRY POINT                               #
###########################################################>
try {

    $LOGDAT = Get-Formatted-Date
    $SCRIPT_LOG_BASE = "Beforepacks-Installation" 
    $SCRIPT_LOGDAT = $InstallPath | Join-Path -ChildPath "syracuse" | Join-Path -ChildPath "logs" | Join-Path -ChildPath "$SCRIPT_LOG_BASE-$LOGDAT.log"
    Write-Host "Log file generated will be: $SCRIPT_LOGDAT - Please analyze content after process"
    Set-Content -Value "Start of $SCRIPT_LOG_BASE " -Path $SCRIPT_LOGDAT 

    Add-To-Log -line "Initialization update Sage X3 Syracuse ..."   -errorLevel 0

    # TODO
    
    Add-To-Log -line  "Done" -errorLevel 0
}
catch {

    if ($null -ne $SCRIPT_LOGDAT) {
        Add-To-Log -line ($Error[0] | Out-String)  -errorLevel 1
        Add-To-Log -line "Stack Trace: " -file $SCRIPT_LOGDAT -errorLevel 0
        Add-To-Log -line ($PSItem.ScriptStackTrace | Out-String) -file $SCRIPT_LOGDAT -errorLevel 0
        Add-To-Log -line " " -file $SCRIPT_LOGDAT -errorLevel 2
    }
    else {
        throw $Error[0]
    }
    $Error.Clear()
}