tests/Hygiene/Invoke-HygieneAnalysis.ps1

<#
.SYNOPSIS
    Master script to run all hygiene analyses.
 
.DESCRIPTION
    Executes all hygiene analysis scripts and generates a consolidated report.
 
.EXAMPLE
    .\Invoke-HygieneAnalysis.ps1
#>


[CmdletBinding()]
param(
    [string]$ProjectRoot = (Split-Path (Split-Path $PSScriptRoot -Parent) -Parent)
)

$ErrorActionPreference = 'Continue'

Write-Host "`n=== HermesConsoleUI Hygiene Analysis Suite ===" -ForegroundColor Cyan
Write-Host "Version 1.0`n" -ForegroundColor Cyan

$startTime = Get-Date
$results = @{}

# Run File Structure Analysis
Write-Host "[1/5] Running File Structure Analysis..." -ForegroundColor Yellow
try {
    $results.FileStructure = & "$PSScriptRoot\Analyze-FileStructure.ps1" -ProjectRoot $ProjectRoot
}
catch {
    Write-Host " Failed: $_" -ForegroundColor Red
    $results.FileStructure = $null
}

# Run Temporary Files Detection
Write-Host "`n[2/5] Running Temporary Files Detection..." -ForegroundColor Yellow
try {
    $results.TemporaryFiles = & "$PSScriptRoot\Find-TemporaryFiles.ps1" -ProjectRoot $ProjectRoot
}
catch {
    Write-Host " Failed: $_" -ForegroundColor Red
    $results.TemporaryFiles = $null
}

# Run File Size Analysis
Write-Host "`n[3/5] Running File Size Analysis..." -ForegroundColor Yellow
try {
    $results.FileSize = & "$PSScriptRoot\Analyze-FileSize.ps1" -ProjectRoot $ProjectRoot
}
catch {
    Write-Host " Failed: $_" -ForegroundColor Red
    $results.FileSize = $null
}

# Run Naming Convention Validation
Write-Host "`n[4/5] Running Naming Convention Validation..." -ForegroundColor Yellow
try {
    $results.NamingConventions = & "$PSScriptRoot\Test-NamingConventions.ps1" -ProjectRoot $ProjectRoot
}
catch {
    Write-Host " Failed: $_" -ForegroundColor Red
    $results.NamingConventions = $null
}

# Run .gitignore Analysis
Write-Host "`n[5/5] Running .gitignore Analysis..." -ForegroundColor Yellow
try {
    $results.GitIgnore = & "$PSScriptRoot\Analyze-GitIgnore.ps1" -ProjectRoot $ProjectRoot
}
catch {
    Write-Host " Failed: $_" -ForegroundColor Red
    $results.GitIgnore = $null
}

$endTime = Get-Date
$totalDuration = ($endTime - $startTime).TotalSeconds

# Generate Summary
Write-Host "`n`n=== HYGIENE ANALYSIS SUMMARY ===" -ForegroundColor Cyan
Write-Host "Execution Time: $([Math]::Round($totalDuration, 2)) seconds" -ForegroundColor Green
Write-Host "Timestamp: $(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')" -ForegroundColor Green

Write-Host "`n=== Key Metrics ===" -ForegroundColor Yellow

if ($results.FileStructure) {
    Write-Host "Files: $($results.FileStructure.TotalFiles)"
    Write-Host "Directories: $($results.FileStructure.TotalDirectories)"
    Write-Host "Max Depth: $($results.FileStructure.MaxDepth) levels"
}

if ($results.FileSize) {
    Write-Host "Total Size: $($results.FileSize.TotalSizeKB) KB ($($results.FileSize.TotalSizeMB) MB)"
    Write-Host "Blob Files: $($results.FileSize.BlobFiles.Count)"
}

if ($results.TemporaryFiles) {
    $tempIssues = $results.TemporaryFiles.TotalIssues
    if ($tempIssues -eq 0) {
        Write-Host "Temporary Files: ✅ None" -ForegroundColor Green
    }
    else {
        Write-Host "Temporary Files: ⚠️ $tempIssues found" -ForegroundColor Yellow
    }
}

if ($results.NamingConventions) {
    Write-Host "Naming Compliance: $($results.NamingConventions.ComplianceRate)%"
}

if ($results.GitIgnore) {
    Write-Host ".gitignore Score: $($results.GitIgnore.Score)/10"
}

# Calculate overall hygiene score
$overallScore = 0
$scoreCount = 0

if ($results.FileStructure -and $results.FileStructure.EmptyDirectories.Count -eq 0) {
    $overallScore += 10
    $scoreCount++
}

if ($results.TemporaryFiles -and $results.TemporaryFiles.TotalIssues -eq 0) {
    $overallScore += 10
    $scoreCount++
}

if ($results.FileSize -and $results.FileSize.BlobFiles.Count -eq 0) {
    $overallScore += 10
    $scoreCount++
}

if ($results.NamingConventions) {
    $overallScore += ($results.NamingConventions.ComplianceRate / 10)
    $scoreCount++
}

if ($results.GitIgnore) {
    $overallScore += $results.GitIgnore.Score
    $scoreCount++
}

$finalScore = if ($scoreCount -gt 0) { [Math]::Round($overallScore / $scoreCount, 1) } else { 0 }

Write-Host "`n=== OVERALL HYGIENE SCORE ===" -ForegroundColor Cyan
Write-Host "$finalScore / 10" -ForegroundColor $(if ($finalScore -ge 9) { "Green" } elseif ($finalScore -ge 7) { "Yellow" } else { "Red" })

# Export consolidated results
$consolidatedResults = @{
    Metadata = @{
        Timestamp            = Get-Date -Format 'o'
        ProjectRoot          = $ProjectRoot
        PowerShellVersion    = $PSVersionTable.PSVersion.ToString()
        TotalDurationSeconds = [Math]::Round($totalDuration, 2)
        OverallScore         = $finalScore
    }
    Results  = $results
}

$jsonPath = Join-Path $PSScriptRoot "hygiene_consolidated_results.json"
$consolidatedResults | ConvertTo-Json -Depth 10 | Out-File $jsonPath
Write-Host "`nConsolidated results: $jsonPath" -ForegroundColor Yellow

Write-Host "`nAll hygiene analyses completed!`n" -ForegroundColor Green

return $consolidatedResults