# EllesmereUI 를 순정 상태로 되돌린다 (현지화 흔적 전부 제거).
#  · WRAPPED 의 to→from 역패치로 정확히 복원 (format/문자열분할 등 구조 변경도 안전)
#  · Locale 폴더 삭제
#  · toc 의 Locale/현지화 줄 제거
#  ※ 예전 방식(EUI_L["X"]→"X" 일괄 치환)은 :format() 같은 구조 변경을 못 되돌려
#    소스를 망가뜨렸음. 이제 Apply 의 정확한 역연산을 수행한다.
param(
    [string]$AddonPath = "E:\WOW_KR\EllesmereUI",
    [string]$DataFile  = "E:\WOW_KR\_EUI_Localize\Locale-Data.ps1"
)
$ErrorActionPreference = "Stop"
$enc = New-Object System.Text.UTF8Encoding($false)

# --- 패치 정의 로드 + from/to 역산 (Build-ApplyScript 와 동일 로직) ---
$data    = & $DataFile
$WRAPPED = $data.WRAPPED
$rx      = [regex]'EUI_L\["((?:[^"\\]|\\.)*)"\]'
$rxVar   = [regex]'EUI_L\[([A-Za-z_][A-Za-z0-9_.]*)\]'

# file -> List of @{ To=...; From=... }
$byFile = @{}
foreach ($w in $WRAPPED) {
    $toTrim = $w.to.Trim()
    if (($w -is [hashtable]) -and $w.ContainsKey('from') -and $w.from) {
        $fromTrim = $w.from.Trim()
    } else {
        $fromTrim = $rx.Replace($toTrim, '"$1"')
        $fromTrim = $rxVar.Replace($fromTrim, '$1')
    }
    if (-not $byFile.ContainsKey($w.f)) { $byFile[$w.f] = New-Object System.Collections.Generic.List[object] }
    $byFile[$w.f].Add([pscustomobject]@{ To = $toTrim; From = $fromTrim })
}

# --- 파일별 역패치 (to → from) ---
foreach ($relPath in $byFile.Keys) {
    $path = [IO.Path]::GetFullPath((Join-Path $AddonPath $relPath))
    if (-not (Test-Path $path -PathType Leaf)) { Write-Host "[MISS] $relPath" -ForegroundColor DarkYellow; continue }
    # to-trim -> from-trim 사전 (case-sensitive)
    $map = New-Object 'System.Collections.Generic.Dictionary[string,string]' ([System.StringComparer]::Ordinal)
    foreach ($p in $byFile[$relPath]) { if (-not $map.ContainsKey($p.To)) { $map[$p.To] = $p.From } }
    $lines = [IO.File]::ReadAllLines($path)
    $hit = 0
    for ($i = 0; $i -lt $lines.Count; $i++) {
        $t = $lines[$i].Trim()
        if ($map.ContainsKey($t)) {
            $m = [regex]::Match($lines[$i], "^(\s*)(.*?)(\s*)$")
            $lines[$i] = $m.Groups[1].Value + $map[$t] + $m.Groups[3].Value
            $hit++
        }
    }
    if ($hit -gt 0) {
        [IO.File]::WriteAllLines($path, $lines, $enc)
        Write-Host ("[REVERT] {0}  ({1})" -f (Split-Path $relPath -Leaf), $hit) -ForegroundColor Yellow
    }
}

# --- 일반 폴백: 남은 단순 래핑 EUI_L["X"] → "X" ---
#  (매핑이 바뀌어 정확 역패치로 못 잡은 '이전 적용분' 단순 래핑을 정리.
#   구조 변경 래핑(:format 등)은 위 정확 역패치에서 이미 제거되어 여기 오지 않음.)
#  ※ 형제 모듈(..\EllesmereUIBlizzardSkin 등)까지 포함해야 하므로 $byFile 의
#    실제 패치 대상 파일 경로 전체를 순회한다 (Get-ChildItem $AddonPath 는 본체 폴더만 봄).
$rxQuoted = [regex]'EUI_L\["((?:[^"\\]|\\.)*)"\]'
$patchedPaths = @{}
foreach ($relPath in $byFile.Keys) {
    $p = [IO.Path]::GetFullPath((Join-Path $AddonPath $relPath))
    if (Test-Path $p -PathType Leaf) { $patchedPaths[$p] = $true }
}
foreach ($fp in $patchedPaths.Keys) {
    $t = [IO.File]::ReadAllText($fp)
    if ($rxQuoted.IsMatch($t)) {
        $t2 = $rxQuoted.Replace($t, '"$1"')
        [IO.File]::WriteAllText($fp, $t2, $enc)
        Write-Host "[FALLBACK] $(Split-Path $fp -Leaf)" -ForegroundColor DarkYellow
    }
}

# --- Locale 폴더 삭제 ---
$loc = Join-Path $AddonPath "Locale"
if (Test-Path $loc) { Remove-Item -Recurse -Force $loc; Write-Host "[DEL] Locale folder" -ForegroundColor Yellow }

# --- toc 정리 ---
$toc = Join-Path $AddonPath "EllesmereUI.toc"
$keep = New-Object System.Collections.Generic.List[string]
foreach ($ln in [IO.File]::ReadAllLines($toc)) {
    if ($ln -match 'Locale[\\/](LocalCore|enUS|koKR|deDE|esES|esMX|frFR|itIT|ptBR|ruRU)\.lua') { continue }
    if ($ln -match 'Localization|현지화') { continue }
    $keep.Add($ln)
}
[IO.File]::WriteAllLines($toc, $keep, $enc)
Write-Host "[TOC ] Locale lines removed" -ForegroundColor Yellow

# --- 잔여 EUI_L 검사 (패치 대상 파일 전체: 형제 모듈 포함) ---
$remain = 0
foreach ($fp in $patchedPaths.Keys) {
    $remain += (Select-String -Path $fp -Pattern 'EUI_L\[' -ErrorAction SilentlyContinue | Measure-Object).Count
}
Write-Host "Restore done. Remaining EUI_L refs: $remain (should be 0)" -ForegroundColor Cyan
