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

    Requisitos:
      - PowerShell com permissões para escrever em C:\plhDownloads\
      - Preferível executar em janela elevada (winget pode pedir UAC)

    O script:
      1) Garante winget e usa-o para instalar/atualizar Git (Git.Git).
      2) Clona/atualiza o repo em pasta temporária.
      3) Copia por cima (sem /MIR) para C:\plhDownloads\ (exclui .git).
      4) Executa pilot_install.ps1
#>

$ErrorActionPreference = 'Stop'

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

# ===== Utilitárias =====
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 {
  return [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 para habilitar o winget."
    throw "winget ausente"
  }

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

  # Detecta se Git está instalado
  $gitInstalled = $false
  try {
    # 'winget list' retorna errolevel 0 mesmo sem pacote; interpretamos saída
    $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)..."
    # silencia prompts; se não houver upgrade disponível, winget finaliza OK.
    winget upgrade --id Git.Git -e @argsCommon --silent | Out-Null
  } else {
    Write-Info "Instalando Git..."
    winget install --id Git.Git -e @argsCommon --silent | Out-Null
  }

  # Garante que o git esteja acessível
  $gitCmd = Get-Command git -ErrorAction SilentlyContinue
  if (-not $gitCmd) {
    # tenta caminho usual
    $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"
}

# ===== Fluxo principal =====
try {
  Ensure-Git-WithWinget

  Ensure-Dir $TargetDir

  # Prepara/atualiza repositório no diretório de trabalho
  if (Test-Path (Join-Path $WorkDir '.git')) {
    Write-Info "Atualizando repositório existente em $WorkDir ..."
    Push-Location $WorkDir
    try { git remote set-url origin $RepoUrl | Out-Null } catch { }
    git fetch --all --prune
    git checkout $Branch
    git reset --hard "origin/$Branch"
    Pop-Location
  } else {
    Write-Info "Clonando repositório (branch $Branch) para $WorkDir ..."
    try { Remove-Item -LiteralPath $WorkDir -Recurse -Force -ErrorAction SilentlyContinue } catch { }
    Ensure-Dir $WorkDir
    git clone --depth 1 --branch $Branch $RepoUrl $WorkDir
    Write-Ok "Clone concluído."
  }

  # Copiar por cima para o destino (sem espelhar/sem apagar o que já existe)
  Write-Info "Copiando arquivos para $TargetDir (sem espelhar)..."
  $log = Join-Path $env:TEMP 'vlt-install_copy.log'

  # Robocopy:
  # /E  -> inclui subpastas (inclui vazias)
  # /IS -> inclui arquivos “iguais” (força overwrite)
  # /IT -> inclui arquivos “tweak”
  # /XO -> (opcional) pula arquivos mais antigos na origem; REMOVIDO para forçar overwrite
  # /NFL /NDL /NP -> logs mais limpos
  $rc = robocopy `
      $WorkDir `
      $TargetDir `
      * `
      /E /IS /IT /R:1 /W:1 /NFL /NDL /NP `
      /XD ".git" `
      /XF ".gitignore" ".gitattributes" `
      /LOG:$log

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

  # Executa o instalador
  $InstallScript = Join-Path $TargetDir 'pilot_install.ps1'
  if (Test-Path -LiteralPath $InstallScript) {
    Write-Info "Executando $InstallScript ..."
    try { Unblock-File -LiteralPath $InstallScript -ErrorAction SilentlyContinue } catch { }
    $p = Start-Process -FilePath 'powershell.exe' -ArgumentList @(
      '-NoProfile','-ExecutionPolicy','Bypass','-File', $InstallScript
    ) -Wait -PassThru
    if ($p.ExitCode -ne 0) {
      Write-Err "pilot_install.ps1 retornou código $($p.ExitCode)."
      exit $p.ExitCode
    } else {
      Write-Ok "pilot_install.ps1 executado com sucesso."
    }
  } else {
    Write-Warn "Arquivo não encontrado: $InstallScript. Execução ignorada."
  }

  Write-Ok "Processo concluído."
  exit 0

} catch {
  Write-Err ("Erro: " + $_.Exception.Message)
  exit 1
}
