<#  
    Atualiza C:\PilotDownloads\ com o conteúdo do repositório (branch main)
    https://gitea.magicis.com.br/PilotSupport/vlt-install e executa pilot_install.ps1

    Ajuste as variáveis $GitUser e $GitToken conforme necessário.
#>

# ========= CONFIGURAÇÃO DE USUÁRIO/TOKEN =========
$GitUser  = "ricardo.sarda"
$GitToken = "d6504f7d969c77a51dcbd5854a1f37f0a96398cd"
# ================================================

$ErrorActionPreference = 'Stop'

# ===== Auto-desbloqueio (MOTW) =====
try {
  $scriptPath = $MyInvocation.MyCommand.Path
  if ($scriptPath -and (Test-Path -LiteralPath $scriptPath)) {
    Unblock-File -LiteralPath $scriptPath -ErrorAction SilentlyContinue
    Remove-Item -LiteralPath "$scriptPath`:Zone.Identifier" -Force -ErrorAction SilentlyContinue
  }
} catch {}

# ===== Configurações =====
$RepoUrl    = 'https://gitea.magicis.com.br/PilotSupport/vlt-install'
$Branch     = 'main'
$TargetDir  = 'C:\PilotDownloads'
$WorkDir    = Join-Path $env:TEMP 'vlt-install_repo'
$CopyLog    = Join-Path $env:TEMP 'vlt-install_copy.log'

function Write-Info($m){ Write-Host "[INFO ] $m" -ForegroundColor Cyan }
function Write-Ok($m)  { Write-Host "[ OK  ] $m" -ForegroundColor Green }
function Write-Warn($m){ Write-Host "[WARN ] $m" -ForegroundColor Yellow }
function Write-Err($m) { Write-Host "[ERRO ] $m" -ForegroundColor Red }

function Ensure-Dir([string]$Path){
  if (-not (Test-Path -LiteralPath $Path)) {
    New-Item -ItemType Directory -Path $Path -Force | Out-Null
  }
}

function Test-Winget { [bool](Get-Command winget -ErrorAction SilentlyContinue) }

function Ensure-Git-WithWinget {
  if (-not (Test-Winget)) {
    Write-Err "winget não encontrado. Instale o 'App Installer' da Microsoft Store."
    throw "winget ausente"
  }

  Write-Info "Verificando Git via winget..."
  $argsCommon = @('--accept-package-agreements','--accept-source-agreements','--silent')

  $gitInstalled = $false
  try {
    $list = winget list --id Git.Git -e 2>$null
    if ($list -match 'Git\s+Git') { $gitInstalled = $true }
  } catch { }

  if ($gitInstalled) {
    Write-Info "Atualizando Git (se necessário)..."
    & winget upgrade --id Git.Git -e @argsCommon | Out-Null
  } else {
    Write-Info "Instalando Git..."
    & winget install --id Git.Git -e @argsCommon | Out-Null
  }

  if (-not (Get-Command git -ErrorAction SilentlyContinue)) {
    $maybeGit = 'C:\Program Files\Git\cmd\git.exe'
    if (Test-Path $maybeGit) {
      $env:Path = "C:\Program Files\Git\cmd;$env:Path"
    }
  }

  $ver = git --version 2>$null
  if (-not $ver) { throw "Git não acessível após instalação/atualização." }
  Write-Ok "Git pronto: $ver"
}

function Get-BasicAuthHeader([string]$user,[string]$token){
  if (-not $user -or -not $token) { return $null }
  $bytes  = [Text.Encoding]::ASCII.GetBytes("$user`:$token")
  $base64 = [Convert]::ToBase64String($bytes)
  return "Authorization: Basic $base64"
}

function Get-GitCommonArgs {
  param([string]$AuthHeader)

  $args = @(
    '-c','credential.helper=',
    '-c','credential.interactive=never',
    '-c','core.askPass='
  )
  if ($AuthHeader) {
    $args += @('-c',"http.extraHeader=$AuthHeader")
  }
  return ,$args
}

function Force-ReplaceFile {
  param(
    [Parameter(Mandatory = $true)][string]$SourceFile,
    [Parameter(Mandatory = $true)][string]$TargetFile
  )

  if (-not (Test-Path -LiteralPath $SourceFile)) {
    throw "Arquivo de origem não encontrado: $SourceFile"
  }

  $targetParent = Split-Path -Path $TargetFile -Parent
  Ensure-Dir $targetParent

  if (Test-Path -LiteralPath $TargetFile) {
    Remove-Item -LiteralPath $TargetFile -Force -ErrorAction SilentlyContinue
  }

  Copy-Item -LiteralPath $SourceFile -Destination $TargetFile -Force
  Unblock-File -LiteralPath $TargetFile -ErrorAction SilentlyContinue

  $srcHash = (Get-FileHash -LiteralPath $SourceFile -Algorithm SHA256).Hash
  $dstHash = (Get-FileHash -LiteralPath $TargetFile -Algorithm SHA256).Hash

  Write-Info "Hash origem : $srcHash"
  Write-Info "Hash destino: $dstHash"

  if ($srcHash -ne $dstHash) {
    throw "Validação por hash falhou para: $TargetFile"
  }
}

try {
  Ensure-Git-WithWinget
  Ensure-Dir $TargetDir

  $AuthHeader = $null
  if ($GitUser -and $GitToken) {
    $AuthHeader = Get-BasicAuthHeader -user $GitUser -token $GitToken
    Write-Info "Usando autenticação com header."
  }

  $env:GIT_TERMINAL_PROMPT = '0'

  # ===== AUTOATUALIZAÇÃO FORÇADA =====
  Write-Info "Preparando diretório temporário para clone limpo..."

  if (Test-Path -LiteralPath $WorkDir) {
    Write-Info "Removendo diretório temporário antigo..."
    Remove-Item -LiteralPath $WorkDir -Recurse -Force -ErrorAction SilentlyContinue
  }

  Ensure-Dir $WorkDir

  Write-Info "Clonando repositório (branch $Branch) para $WorkDir ..."
  & git (Get-GitCommonArgs -AuthHeader $AuthHeader) clone --depth 1 --branch $Branch $RepoUrl $WorkDir

  if (-not (Test-Path -LiteralPath (Join-Path $WorkDir '.git'))) {
    throw "Falha ao clonar repositório."
  }

  Write-Ok "Clone concluído."

  Write-Info "Copiando arquivos para $TargetDir (sem espelhar)..."
  $rc = robocopy `
      $WorkDir `
      $TargetDir `
      * `
      /E /IS /IT /R:1 /W:1 /NFL /NDL /NP `
      /XD ".git" `
      /XF ".gitignore" ".gitattributes" `
      /LOG:$CopyLog

  if ($LASTEXITCODE -ge 8) {
    throw "Falha ao copiar arquivos. Veja o log: $CopyLog"
  } else {
    Write-Ok "Cópia finalizada. (código robocopy: $LASTEXITCODE) Log: $CopyLog"
  }

  # ===== FORÇA A ATUALIZAÇÃO DOS ARQUIVOS PRINCIPAIS =====
  $SourceInstallScript   = Join-Path $WorkDir 'pilot_install.ps1'
  $TargetInstallScript   = Join-Path $TargetDir 'pilot_install.ps1'
  $SourceUtilityScript   = Join-Path $WorkDir 'pilot_installer_utilities.ps1'
  $TargetUtilityScript   = Join-Path $TargetDir 'pilot_installer_utilities.ps1'

  Write-Info "Forçando atualização de pilot_install.ps1 ..."
  Force-ReplaceFile -SourceFile $SourceInstallScript -TargetFile $TargetInstallScript
  Write-Ok "pilot_install.ps1 atualizado com sucesso."

  Write-Info "Forçando atualização de pilot_installer_utilities.ps1 ..."
  Force-ReplaceFile -SourceFile $SourceUtilityScript -TargetFile $TargetUtilityScript
  Write-Ok "pilot_installer_utilities.ps1 atualizado com sucesso."

  if (Test-Path -LiteralPath $TargetInstallScript) {
    Write-Info "Executando $TargetInstallScript ..."
    try { Unblock-File -LiteralPath $TargetInstallScript -ErrorAction SilentlyContinue } catch { }
    $p = Start-Process -FilePath 'powershell.exe' -ArgumentList @(
      '-NoProfile','-ExecutionPolicy','Bypass','-File', $TargetInstallScript
    ) -Wait -PassThru

    if ($p.ExitCode -ne 0) {
      Write-Err "pilot_install.ps1 retornou código $($p.ExitCode)."
      Stop-Process -Id $PID -Force
    } else {
      Write-Ok "pilot_install.ps1 executado com sucesso."
    }
  } else {
    Write-Warn "Arquivo não encontrado: $TargetInstallScript. Execução ignorada."
  }

  Write-Ok "Processo concluído."
  Stop-Process -Id $PID -Force

} catch {
  Write-Err ("Erro: " + $_.Exception.Message)
  Stop-Process -Id $PID -Force
} finally {
  Remove-Item Env:\GIT_TERMINAL_PROMPT -ErrorAction SilentlyContinue
}