AcuInstallerHelper.psm1

. (Join-Path $PSScriptRoot 'AcuInstallerHelper_Logging.ps1')
. (Join-Path $PSScriptRoot 'AcuInstallerHelper_Functions_Config.ps1')
. (Join-Path $PSScriptRoot 'AcuInstallerHelper_Functions.ps1')
. (Join-Path $PSScriptRoot 'AcuInstallerHelper_Versions.ps1')
. (Join-Path $PSScriptRoot 'AcuInstallerHelper_Nuget.ps1')
. (Join-Path $PSScriptRoot 'AcuInstallerHelper_web_config.ps1')

function Add-AcuSite {
    param (
        [Parameter(Mandatory = $true)]
        [Alias("v")]
        [string] $version,
        
        [Parameter(Mandatory = $true)]
        [Alias("n")]
        [string] $siteName,
        
        [Alias("p")]
        [string] $siteInstallPath,
        
        [Alias("nv")]
        [switch] $installNewVersion,
        
        [Alias("pt")]
        [switch] $portal,
        
        [Alias("d")]
        [switch] $devSite,
        
        [switch] $preview,
        
        [Alias("dt")]
        [switch] $debuggerTools
    )

    Write-AcuHeader -Title "Acumatica Site Installation" -Subtitle "Version $version • Site: $siteName"
    
    Write-AcuSection -Title "Validating Prerequisites"
    
    Test-VersionFormat -version $version
    Write-AcuSuccess "Version format validated: $version"
    
    # Check if version exists
    if (!(Read-AcuVersionPath $version)) {
        Write-AcuWarning "Version $version not found locally"
        
        # Determine if we should install
        $shouldInstall = $installNewVersion -or (PromptYesNo "You do not have version $version installed, do you want to install?")
        
        if (!$shouldInstall) {
            Write-AcuError "Site installation cancelled - version not available"
            return
        }
        
        Write-AcuSection -Title "Installing Required Version"
        
        # Use config default if debuggerTools not explicitly set
        $useDebugTools = if ($PSBoundParameters.ContainsKey('debuggerTools')) { 
            $debuggerTools 
        }
        else { 
            Get-InstallDebugTools 
        }
        
        Add-AcuVersion -version:$version -preview:$preview -debuggerTools:$useDebugTools
    }
    else {
        Write-AcuSuccess "Version $version found at $(Get-AcuVersionPath -versionNbr $version)"
    }

    Write-AcuSection -Title "Configuring Site Parameters"
    
    # Set default site path if not provided
    if ([string]::IsNullOrWhiteSpace($siteInstallPath)) {
        $siteInstallPath = Join-Path (Read-DefaultSiteInstallPath) $siteName
        Write-AcuInfo "Using default site path: $siteInstallPath"
    }
    else {
        Write-AcuInfo "Using specified site path: $siteInstallPath"
    }

    # Apply dev configuration based on explicit parameter or config default
    $isDev = if ($PSBoundParameters.ContainsKey('devSite')) {
        $devSite
    }
    else {
        (Get-SiteType) -eq "Dev"
    }
    
    Write-AcuTable -Data @{
        "Site Name"     = $siteName
        "Version"       = $version
        "Install Path"  = $siteInstallPath
        "Portal Site"   = $(if ($portal) { "Yes" } else { "No" })
        "Site Type"     = $(if ($isDev) { "Development" } else { "Production" })
        "Preview Build" = $(if ($preview) { "Yes" } else { "No" })
    } -Title "Site Configuration"

    Write-AcuSection -Title "Installing Site"
    
    # Install site
    $acuArgs = Build-AcuExeArgs -siteName $siteName -sitePath $siteInstallPath -portal $portal -newInstance
    Invoke-AcuExe -arguments $acuArgs -version $version
    
    if ($isDev) {
        Write-AcuStep "Applying development configuration"
        Update-WebConfigForDev -webConfigPath (Join-Path $siteInstallPath "web.config")
    }
    
    Write-AcuSummary -Operation "Site Installation" -Status "Completed Successfully" -Details @{
        "Site Name" = $siteName
        "Version"   = $version
        "Path"      = $siteInstallPath
        "Type"      = $(if ($isDev) { "Development" } else { "Production" })
        "Portal"    = $(if ($portal) { "Yes" } else { "No" })
    }
}

function Remove-AcuSite {
    param (
        [Parameter(Mandatory = $true)]
        [Alias("n")]
        [string] $siteName
    )
    
    Write-AcuHeader -Title "Acumatica Site Removal" -Subtitle "Site: $siteName"
    
    Write-AcuSection -Title "Removing Site Registration"
    
    try {
        $version = Get-AcuSiteVersion -siteName $siteName
        Write-AcuInfo "Found site using version: $version"
        
        $acuArgs = Build-AcuExeArgs -siteName $siteName -d
        Invoke-AcuExe -arguments $acuArgs -version $version
        
        Write-AcuSummary -Operation "Site Removal" -Status "Completed Successfully" -Details @{
            "Site Name" = $siteName
            "Version"   = $version
        }
    }
    catch {
        Write-AcuError "Failed to remove site: $_"
        throw
    }
}

function Update-AcuSite {
    param (
        [Parameter(Mandatory = $true)]
        [string] $siteName,
        
        [Parameter(Mandatory = $true)]
        [string] $newVersion
    )

    Write-AcuHeader -Title "Acumatica Site Update" -Subtitle "Site: $siteName → Version: $newVersion"
    
    Test-VersionFormat -version $newVersion
    
    # TODO: Implement site upgrade logic
    Write-AcuWarning "Update-AcuSite is not yet implemented"
    Write-AcuInfo "This feature will be available in a future version"
}