# Script para descargar e instalar modelos PaddleOCR
# Guardar como: download-paddleocr-models.ps1

param(
    [string]$OutputDirectory = ".\paddleocr",
    [switch]$ForceDownload = $false
)

# URLs de modelos PaddleOCR (inglés por defecto)
$modelUrls = @{
    "det" = "https://paddleocr.bj.bcebos.com/PP-OCRv3/english/en_PP-OCRv3_det_slim_infer.tar"
    "rec" = "https://paddleocr.bj.bcebos.com/PP-OCRv3/english/en_PP-OCRv3_rec_slim_infer.tar"
    "cls" = "https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_cls_slim_infer.tar"
    "keys" = "https://raw.githubusercontent.com/PaddlePaddle/PaddleOCR/release/2.6/ppocr/utils/en_dict.txt"
}

# Crear directorios si no existen
function EnsureDirectory($path) {
    if (-not (Test-Path $path)) {
        New-Item -Path $path -ItemType Directory | Out-Null
        Write-Host "Creado directorio: $path" -ForegroundColor Green
    }
}

# Descargar archivo con barra de progreso
function DownloadFile($url, $outputFile) {
    $webClient = New-Object System.Net.WebClient
    $webClient.Encoding = [System.Text.Encoding]::UTF8
    
    $downloadExists = Test-Path $outputFile
    if ($downloadExists -and -not $ForceDownload) {
        Write-Host "El archivo ya existe: $outputFile. Use -ForceDownload para sobrescribir." -ForegroundColor Yellow
        return $false
    }
    
    Write-Host "Descargando $url..." -ForegroundColor Cyan
    try {
        $webClient.DownloadFile($url, $outputFile)
        Write-Host "Descarga completada: $outputFile" -ForegroundColor Green
        return $true
    } catch {
        Write-Host "Error al descargar $url : $_" -ForegroundColor Red
        return $false
    }
}

# Extraer archivo TAR
function ExtractTarFile($tarFile, $destDir) {
    Write-Host "Extrayendo $tarFile..." -ForegroundColor Cyan
    
    # Verificar si tar está disponible
    $tarAvailable = $null -ne (Get-Command "tar" -ErrorAction SilentlyContinue)
    
    if ($tarAvailable) {
        # Usar tar nativo
        try {
            tar -xf $tarFile -C $destDir
            Write-Host "Extracción completada: $tarFile" -ForegroundColor Green
            return $true
        } catch {
            Write-Host "Error al extraer con tar: $_" -ForegroundColor Red
        }
    }
    
    # Fallback a .NET
    try {
        Add-Type -AssemblyName System.IO.Compression.FileSystem
        
        # Descomprimir TAR con .NET
        # Nota: Esto es un ejemplo simplificado. Necesitarías una biblioteca específica para TAR
        Write-Host "TAR nativo no disponible. Se requiere una biblioteca para manejar archivos TAR." -ForegroundColor Yellow
        
        # Aquí puedes agregar código para usar SharpCompress u otra biblioteca para TAR
        # Por ejemplo:
        # [Reflection.Assembly]::LoadFrom("path\to\SharpCompress.dll")
        # $reader = [SharpCompress.Readers.ReaderFactory]::Open($tarFile)
        # ...
        
        return $false
    } catch {
        Write-Host "Error al extraer $tarFile : $_" -ForegroundColor Red
        return $false
    }
}

# Crear directorio principal
EnsureDirectory $OutputDirectory

# Crear estructura de directorios
$modelTypes = @("det", "rec", "cls", "keys")
foreach ($type in $modelTypes) {
    $typeDir = Join-Path $OutputDirectory $type
    EnsureDirectory $typeDir
    
    if ($type -ne "keys") {
        $inferenceDir = Join-Path $typeDir "inference"
        EnsureDirectory $inferenceDir
    }
}

# Descargar y procesar cada modelo
foreach ($entry in $modelUrls.GetEnumerator()) {
    $type = $entry.Key
    $url = $entry.Value
    $typeDir = Join-Path $OutputDirectory $type
    
    if ($type -eq "keys") {
        # Para el archivo de claves, solo descargarlo directamente
        $outputFile = Join-Path $typeDir "ppocr_keys.txt"
        DownloadFile $url $outputFile
    } else {
        # Para los modelos, descargar TAR y extraerlo
        $tarFile = Join-Path $env:TEMP "$type.tar"
        
        $downloaded = DownloadFile $url $tarFile
        if ($downloaded) {
            $extracted = ExtractTarFile $tarFile $typeDir
            
            # Limpiar archivo temporal
            if (Test-Path $tarFile) {
                Remove-Item $tarFile -Force
            }
        }
    }
}

Write-Host "`nInstalación de modelos PaddleOCR completada en: $OutputDirectory" -ForegroundColor Green
Write-Host "Para usar estos modelos, configura PaddleOCREngine con las siguientes rutas:" -ForegroundColor Yellow
Write-Host "  - det_infer: $OutputDirectory\det\inference" -ForegroundColor White
Write-Host "  - rec_infer: $OutputDirectory\rec\inference" -ForegroundColor White
Write-Host "  - cls_infer: $OutputDirectory\cls\inference" -ForegroundColor White
Write-Host "  - keys: $OutputDirectory\keys\ppocr_keys.txt" -ForegroundColor White
