# Jackson Guardian — Asistente de preparación
#  1. Encuentra NinjaTrader 8 este donde este (Documentos, OneDrive, redirigido, otra unidad).
#  2. Si esta dentro de OneDrive: FIJA los archivos en el equipo ("conservar siempre en este
#     dispositivo"). Sin esto, OneDrive deja los archivos en la nube y NinjaTrader falla al
#     compilar/importar. NO hace falta desinstalar nada ni desactivar OneDrive.
#  3. Quita SOLO los ensamblados antiguos del replicador (con copia de seguridad).

$ErrorActionPreference = 'SilentlyContinue'
$host.UI.RawUI.WindowTitle = 'Jackson Guardian - Asistente de preparacion'

Write-Host "===============================================================" -ForegroundColor Cyan
Write-Host "   JACKSON GUARDIAN - Asistente de preparacion" -ForegroundColor Cyan
Write-Host "===============================================================" -ForegroundColor Cyan
Write-Host ""
Write-Host " Deja tu NinjaTrader listo para importar Jackson Guardian:"
Write-Host "   - arregla el problema de OneDrive (archivos en la nube)"
Write-Host "   - quita versiones antiguas del replicador"
Write-Host " No toca bots, indicadores, graficos ni cuentas. No desinstala nada."
Write-Host ""

# ---------- 1. NinjaTrader cerrado ----------
if (Get-Process NinjaTrader -ErrorAction SilentlyContinue) {
  Write-Host " [!] NinjaTrader esta ABIERTO." -ForegroundColor Yellow
  Write-Host "     Cierralo del todo y vuelve a ejecutar este archivo."
  Write-Host ""
  Read-Host " Pulsa ENTER para salir"
  exit 1
}

# ---------- 2. Localizar NinjaTrader 8 ----------
Write-Host " [1/3] Buscando tu carpeta de NinjaTrader 8..." -ForegroundColor Cyan
$cand = New-Object System.Collections.Generic.List[string]
$docs = [Environment]::GetFolderPath('MyDocuments')
if ($docs) { $cand.Add((Join-Path $docs 'NinjaTrader 8')) }
foreach ($raiz in @($env:USERPROFILE, $env:OneDrive, $env:OneDriveCommercial, $env:OneDriveConsumer) | Where-Object { $_ }) {
  foreach ($sub in @('Documents', 'Documentos', '')) {
    $p = if ($sub) { Join-Path (Join-Path $raiz $sub) 'NinjaTrader 8' } else { Join-Path $raiz 'NinjaTrader 8' }
    $cand.Add($p)
  }
}
$rutas = $cand | Where-Object { Test-Path (Join-Path $_ 'bin\Custom') } | Select-Object -Unique

if (-not $rutas) {
  Write-Host "   no esta en las rutas habituales, buscando en el equipo..." -ForegroundColor DarkGray
  $rutas = Get-ChildItem -Path "$env:USERPROFILE", "$env:SystemDrive\" -Filter 'NinjaTrader 8' -Directory -Recurse -Depth 4 -ErrorAction SilentlyContinue |
           Where-Object { Test-Path (Join-Path $_.FullName 'bin\Custom') } |
           Select-Object -ExpandProperty FullName -Unique
}
if (-not $rutas) {
  Write-Host ""
  Write-Host " [!] No encuentro NinjaTrader 8 en este equipo." -ForegroundColor Yellow
  Write-Host "     Puedes importar igualmente. Si te da error, escribe /soporte en"
  Write-Host "     @JacksonGuardianBot indicando donde tienes instalado NinjaTrader."
  Write-Host ""
  Read-Host " Pulsa ENTER para salir"
  exit 0
}
foreach ($r in $rutas) { Write-Host ("   encontrado: " + $r) -ForegroundColor Green }

# ---------- 2.5 RESPALDO de la configuracion (red de seguridad) ----------
Write-Host ""
Write-Host " [*] Guardando copia de seguridad de tu configuracion..." -ForegroundColor Cyan
$backupCfg = Join-Path ([Environment]::GetFolderPath('Desktop')) ("JacksonGuardian-respaldo-config-" + (Get-Date -Format 'yyyyMMdd-HHmm'))
try {
  New-Item -ItemType Directory -Path $backupCfg -Force | Out-Null
  foreach ($nt in $rutas) {
    foreach ($carpeta in @('workspaces','templates','config')) {
      $origen = Join-Path $nt $carpeta
      if (Test-Path $origen) {
        $destino = Join-Path $backupCfg ((Split-Path $nt -Leaf) + "_" + $carpeta)
        Copy-Item $origen -Destination $destino -Recurse -Force -ErrorAction SilentlyContinue
      }
    }
    Get-ChildItem -Path $nt -Filter '*.xml' -File -ErrorAction SilentlyContinue |
      ForEach-Object { Copy-Item $_.FullName -Destination $backupCfg -Force -ErrorAction SilentlyContinue }
  }
  Write-Host ("   [OK] Copia en: " + $backupCfg) -ForegroundColor Green
  Write-Host "   (espacios de trabajo, plantillas y configuracion; borrala cuando todo funcione)"
} catch {
  Write-Host "   [i] No se pudo copiar todo; seguimos igual (no se borra nada tuyo)." -ForegroundColor DarkGray
}

# ---------- 3. OneDrive: fijar archivos en el equipo ----------
Write-Host ""
Write-Host " [2/3] Comprobando OneDrive..." -ForegroundColor Cyan
$enOneDrive = $rutas | Where-Object { $_ -match 'OneDrive' -or (Get-Item $_).Attributes -match 'ReparsePoint' }
$odRaices = @($env:OneDrive, $env:OneDriveCommercial, $env:OneDriveConsumer) | Where-Object { $_ }
foreach ($r in $rutas) {
  $dentro = $false
  foreach ($od in $odRaices) { if ($r.ToLower().StartsWith($od.ToLower())) { $dentro = $true } }
  if ($dentro) {
    Write-Host "   Tu NinjaTrader esta dentro de OneDrive." -ForegroundColor Yellow
    Write-Host "   Fijando los archivos en el equipo (esto evita el error al importar)..."
    # +P = conservar siempre en este dispositivo | -U = quitar 'solo en la nube'
    & attrib.exe +P -U "$r\*" /S /D 2>$null | Out-Null
    Start-Sleep -Seconds 2
    Write-Host "   [OK] Archivos fijados en local. OneDrive sigue funcionando igual." -ForegroundColor Green
    Write-Host "   (Si tienes muchos archivos, OneDrive tardara un poco en descargarlos)."
  } else {
    Write-Host "   [OK] No esta en OneDrive, nada que arreglar aqui." -ForegroundColor Green
  }
}

# ---------- 4. Quitar ensamblados antiguos ----------
Write-Host ""
Write-Host " [3/3] Buscando versiones antiguas del replicador..." -ForegroundColor Cyan
$backup = Join-Path ([Environment]::GetFolderPath('Desktop')) 'JacksonGuardian-copia-seguridad'
$quitados = 0
foreach ($nt in $rutas) {
  $custom = Join-Path $nt 'bin\Custom'
  $dlls = Get-ChildItem -Path $custom -Filter *.dll -File -ErrorAction SilentlyContinue |
          Where-Object { $_.Name -match 'JacksonReplicator|JacksonGuardian|^ReplicadorV3' -and
                         $_.Name -notmatch 'NinjaTrader\.Custom|NinjaTrader\.Vendor' }
  foreach ($d in $dlls) {
    if (-not (Test-Path $backup)) { New-Item -ItemType Directory -Path $backup -Force | Out-Null }
    Copy-Item $d.FullName -Destination $backup -Force
    Remove-Item $d.FullName -Force
    if (Test-Path $d.FullName) {
      Write-Host ("   [!] no se pudo quitar " + $d.Name) -ForegroundColor Yellow
    } else {
      Write-Host ("   [OK] quitado: " + $d.Name) -ForegroundColor Green
      $quitados++
    }
  }
  # --- 4b. CODIGO FUENTE (.cs) del replicador viejo: NinjaTrader lo compila y choca ---
  $carpetasCs = @('bin\Custom\AddOns', 'bin\Custom\Strategies', 'bin\Custom\Indicators')
  foreach ($sub in $carpetasCs) {
    $ruta = Join-Path $nt $sub
    if (-not (Test-Path $ruta)) { continue }
    $css = Get-ChildItem -Path $ruta -Filter *.cs -File -ErrorAction SilentlyContinue | Where-Object {
      $_.Name -match 'JacksonReplicator|JacksonGuardian|^ReplicadorV3' -or
      ((Get-Content $_.FullName -TotalCount 400 -ErrorAction SilentlyContinue) -join "`n") -match 'class\s+(JacksonReplicator|JacksonGuardian)|ReplicatorConfigWindow|JRTexts|JBTexts'
    }
    # CONFIRMAR-CS: nunca se borra codigo fuente sin permiso explicito
    if ($css) {
      Write-Host ""
      Write-Host "   He encontrado CODIGO FUENTE de una version anterior:" -ForegroundColor Yellow
      foreach ($c in $css) { Write-Host ("     - " + $c.Name + "   (" + $sub + ")") }
      Write-Host "   Mientras esten ahi, NinjaTrader los compila y chocan con el paquete nuevo."
      Write-Host "   Se guardara copia en el Escritorio antes de quitarlos."
      Write-Host ""
      $resp = Read-Host "   Quitarlos? (S = si, cualquier otra tecla = no)"
      if ($resp -match '^[sSyY]') {
        foreach ($c in $css) {
          if (-not (Test-Path $backup)) { New-Item -ItemType Directory -Path $backup -Force | Out-Null }
          Copy-Item $c.FullName -Destination $backup -Force
          Remove-Item $c.FullName -Force
          if (Test-Path $c.FullName) {
            Write-Host ("   [!] no se pudo quitar " + $c.Name) -ForegroundColor Yellow
          } else {
            Write-Host ("   [OK] quitado codigo fuente: " + $c.Name) -ForegroundColor Green
            $quitados++
            $huboFuente = $true
          }
        }
      } else {
        Write-Host "   [i] No se ha tocado el codigo fuente (elegiste no)." -ForegroundColor DarkGray
        Write-Host "       Si el error de importacion persiste, vuelve a ejecutar y responde S."
      }
    }
  }
}
if ($quitados -eq 0) { Write-Host "   No habia versiones antiguas." -ForegroundColor Green }
else { Write-Host ("   " + $quitados + " version(es) antigua(s) quitada(s). Copia en: " + $backup) -ForegroundColor Green }

Write-Host ""
if ($huboFuente) {
  Write-Host ""
  Write-Host " [!] IMPORTANTE: he quitado codigo fuente antiguo." -ForegroundColor Yellow
  Write-Host "     Al abrir NinjaTrader, entra en Herramientas > Editor de NinjaScript"
  Write-Host "     y pulsa F5 (compilar) ANTES de importar. Asi se limpia del todo."
}
Write-Host " TODO LISTO. Ahora, en este orden:" -ForegroundColor Cyan
Write-Host "   1. Si el icono de OneDrive esta girando, ESPERA a que termine."
Write-Host "      (acabamos de traer sus archivos al equipo; si no, todo ira lento)"
Write-Host "   2. Abre NinjaTrader 8."
Write-Host "   3. PASO CLAVE: Herramientas -> Editor de NinjaScript -> pulsa F5 y espera"
Write-Host "      a que compile. Asi NinjaTrader se olvida de la version vieja."
Write-Host "   4. Cierra NinjaTrader y vuelve a abrirlo."
Write-Host "   5. Herramientas -> Importar -> Complemento NinjaScript..."
Write-Host "      Primero el zip MANUAL, reinicia, y luego el de BOTS."
Write-Host ""
Write-Host " Si al importar sigue diciendo 'duplicate method names', escribe /soporte"
Write-Host " en @JacksonGuardianBot y lo resolvemos contigo en directo."
Write-Host ""
Read-Host " Pulsa ENTER para cerrar"
