# Refresh helper batch scripts within a specific project directory.

param(
    [string]$ProjectPath
)

Set-StrictMode -Version Latest
$ErrorActionPreference = 'Stop'

if (-not $PSScriptRoot) {
    $PSScriptRoot = Split-Path -Parent $MyInvocation.MyCommand.Path
}

$cfgDeploy = Join-Path -Path $PSScriptRoot -ChildPath 'CfgDeploy.ps1'
if (-not (Test-Path -LiteralPath $cfgDeploy)) {
    throw "Missing CfgDeploy.ps1 in $PSScriptRoot"
}
. $cfgDeploy

$structDir = Get-StructDirectory
if (-not (Test-Path -LiteralPath $structDir -PathType Container)) {
    throw "Configured structDir not found: $structDir"
}

if ([string]::IsNullOrWhiteSpace($ProjectPath)) {
    $ProjectPath = Read-Host 'Enter the full path to the project directory'
}

if ([string]::IsNullOrWhiteSpace($ProjectPath)) {
    Write-Error 'No project directory provided.'
    exit 1
}

try {
    $resolvedProject = (Resolve-Path -LiteralPath $ProjectPath -ErrorAction Stop).Path
}
catch {
    Write-Error "Unable to resolve project directory: $($_.Exception.Message)"
    exit 1
}

if (-not (Test-Path -LiteralPath $resolvedProject -PathType Container)) {
    Write-Error "Project path is not a directory: $resolvedProject"
    exit 1
}

Write-Host "Project directory: $resolvedProject" -ForegroundColor Cyan
Write-Host "Struct directory:  $structDir" -ForegroundColor Cyan

$specs = @(
    @{ Name = 'UpdateSequences.bat'; Source = Join-Path -Path $structDir -ChildPath 'UpdateSequences.bat' },
    @{ Name = 'UpdateAllSequences.bat'; Source = Join-Path -Path $structDir -ChildPath 'UpdateAllSequences.bat' },
    @{ Name = 'ZipSeqArchv.bat'; Source = Join-Path -Path $structDir -ChildPath 'ZipSeqArchv.bat' },
    @{ Name = 'UnzipSeqArchv.bat'; Source = Join-Path -Path $structDir -ChildPath 'UnzipSeqArchv.bat' },
    @{ Name = 'NewDaily.bat'; Source = Join-Path -Path $structDir -ChildPath 'NewDaily.bat' }
)

# Config files to deploy to projectroot\.config\
$configAssets = @(
    @{ Name = 'config.json'; Source = Join-Path -Path $structDir -ChildPath 'config.json' },
    @{ Name = 'GetStructDir.ps1'; Source = Join-Path -Path $structDir -ChildPath 'GetStructDir.ps1' }
)

foreach ($spec in $specs) {
    if (-not (Test-Path -LiteralPath $spec.Source -PathType Leaf)) {
        Write-Error "Source file not found: $($spec.Source)"
        exit 1
    }
}

foreach ($asset in $configAssets) {
    if (-not (Test-Path -LiteralPath $asset.Source -PathType Leaf)) {
        Write-Error "Config asset not found: $($asset.Source)"
        exit 1
    }
}

# Ensure .config directory exists in project root
$projectConfigDir = Join-Path -Path $resolvedProject -ChildPath '.config'
if (-not (Test-Path -LiteralPath $projectConfigDir -PathType Container)) {
    New-Item -Path $projectConfigDir -ItemType Directory -Force | Out-Null
    Write-Host "Created .config directory: $projectConfigDir" -ForegroundColor Cyan
}

$touchedDirs = @{}
$summary = @()

foreach ($spec in $specs) {
    Write-Host "`n=== Updating $($spec.Name) ===" -ForegroundColor Magenta

    $targets = Get-ChildItem -LiteralPath $resolvedProject -Recurse -Filter $spec.Name -File -ErrorAction SilentlyContinue
    $targets = $targets | Where-Object { $_.FullName -ne $spec.Source }

    if (-not $targets) {
        Write-Host "No targets found." -ForegroundColor Yellow
        $summary += [pscustomobject]@{
            Name     = $spec.Name
            Updated  = 0
            Failed   = 0
            Skipped  = 0
            Total    = 0
        }
        continue
    }

    $updated = 0
    $failed = 0

    foreach ($target in $targets) {
        try {
            Copy-Item -Path $spec.Source -Destination $target.FullName -Force
            Write-Host "[OK] $($target.FullName)" -ForegroundColor Green
            $updated++

            $targetDir = $target.Directory.FullName
            if (-not $touchedDirs.ContainsKey($targetDir)) {
                $touchedDirs[$targetDir] = $true
            }
        }
        catch {
            Write-Host "[FAIL] $($target.FullName)" -ForegroundColor Red
            Write-Host "  $($_.Exception.Message)" -ForegroundColor DarkRed
            $failed++
        }
    }

    $summary += [pscustomobject]@{
        Name     = $spec.Name
        Updated  = $updated
        Failed   = $failed
        Skipped  = 0
        Total    = @($targets).Count
    }
}

Write-Host "`n=== Summary ===" -ForegroundColor Cyan
foreach ($item in $summary) {
    Write-Host ("{0,-22} Updated: {1,3}  Failed: {2,3}  Total: {3,3}" -f $item.Name, $item.Updated, $item.Failed, $item.Total)
}

if (($summary | Measure-Object -Property Failed -Sum).Sum -gt 0) {
    Write-Host "Completed with errors." -ForegroundColor Yellow
    exit 1
}

Write-Host "All batch files refreshed successfully." -ForegroundColor Green

# Deploy config files to projectroot\.config\
Write-Host "`n=== Deploying config files to .config\ ===" -ForegroundColor Magenta
foreach ($asset in $configAssets) {
    $targetPath = Join-Path -Path $projectConfigDir -ChildPath $asset.Name
    try {
        Copy-Item -Path $asset.Source -Destination $targetPath -Force
        Write-Host "[OK] $targetPath" -ForegroundColor Green
    }
    catch {
        Write-Host "[FAIL] $targetPath" -ForegroundColor Red
        Write-Host "  $($_.Exception.Message)" -ForegroundColor DarkRed
        exit 1
    }
}

Write-Host "Config files deployed successfully." -ForegroundColor Green

