import { NextRequest, NextResponse } from 'next/server'
import pool from '@/lib/db'

/**
 * GET /api/agent/install?token=agt_xxx&tenant_id=xxx
 *
 * Retorna um script PowerShell pronto para executar via:
 *   irm "https://seusite.com/api/agent/install?token=agt_xxx&tenant_id=xxx" | iex
 */
export async function GET(req: NextRequest) {
  const token    = req.nextUrl.searchParams.get('token')    ?? ''
  const tenantId = req.nextUrl.searchParams.get('tenant_id') ?? ''

  if (!token || !tenantId) {
    return new NextResponse(
      'Write-Error "Parametros token e tenant_id sao obrigatorios."',
      { status: 400, headers: { 'Content-Type': 'text/plain; charset=utf-8' } },
    )
  }

  // Valida que o token realmente existe no banco antes de gerar o script
  const [rows] = await pool.execute<any[]>(
    "SELECT id, name FROM tenants WHERE id = ? AND agent_token = ? AND status = 'active' LIMIT 1",
    [tenantId, token],
  )

  if (!rows[0]) {
    return new NextResponse(
      'Write-Error "Token ou TenantId invalido. Verifique as configuracoes do portal."',
      { status: 401, headers: { 'Content-Type': 'text/plain; charset=utf-8' } },
    )
  }

  const baseUrl   = req.nextUrl.origin
  const tenantName = rows[0].name ?? 'ConsultarTI'
  const serviceName = 'ConsultarTI-Agent'
  const installDir  = 'C:\\ConsultarTI\\Agent'

  const script = `
# ==========================================================
#  Instalador do Agente ConsultarTI
#  Tenant : ${tenantName}
#  Gerado : ${new Date().toISOString()}
# ==========================================================

$ErrorActionPreference = "Stop"

$TOKEN     = "${token}"
$TENANT_ID = "${tenantId}"
$BASE_URL  = "${baseUrl}"
$INSTALL   = "${installDir}"
$SVC_NAME  = "${serviceName}"
$PY_URL    = "https://www.python.org/ftp/python/3.12.4/python-3.12.4-embed-amd64.zip"

Write-Host ""
Write-Host "ConsultarTI - Instalador do Agente" -ForegroundColor Cyan
Write-Host "====================================" -ForegroundColor Cyan
Write-Host ""

# 1. Cria pasta de instalacao
if (-not (Test-Path $INSTALL)) {
    New-Item -ItemType Directory -Path $INSTALL -Force | Out-Null
    Write-Host "[OK] Pasta criada: $INSTALL"
}

# 2. Salva configuracao
$config = @{
    token     = $TOKEN
    tenant_id = $TENANT_ID
    base_url  = $BASE_URL
}
$config | ConvertTo-Json | Set-Content "$INSTALL\\config.json" -Encoding UTF8
Write-Host "[OK] Configuracao salva em $INSTALL\\config.json"

# 3. Baixa Python embeddable (sem instalacao global)
$pyZip = "$INSTALL\\python.zip"
$pyDir = "$INSTALL\\python"

if (-not (Test-Path "$pyDir\\python.exe")) {
    Write-Host "[..] Baixando Python embeddable..."
    Invoke-WebRequest -Uri $PY_URL -OutFile $pyZip -UseBasicParsing
    Expand-Archive -Path $pyZip -DestinationPath $pyDir -Force
    Remove-Item $pyZip
    Write-Host "[OK] Python pronto em $pyDir"
} else {
    Write-Host "[OK] Python ja instalado"
}

$python = "$pyDir\\python.exe"

# 4. Baixa o script do agente
Write-Host "[..] Baixando agente..."
Invoke-WebRequest -Uri "$BASE_URL/api/agent/script" \`
    -Headers @{ "x-agent-token" = $TOKEN } \`
    -OutFile "$INSTALL\\agent.py" -UseBasicParsing
Write-Host "[OK] Agente baixado"

# 5. Instala dependencias pip (requests)
$pipUrl = "https://bootstrap.pypa.io/get-pip.py"
if (-not (Test-Path "$pyDir\\Scripts\\pip.exe")) {
    Write-Host "[..] Instalando pip..."
    Invoke-WebRequest -Uri $pipUrl -OutFile "$INSTALL\\get-pip.py" -UseBasicParsing
    & $python "$INSTALL\\get-pip.py" --quiet
    Remove-Item "$INSTALL\\get-pip.py"
}
& $python -m pip install requests --quiet
Write-Host "[OK] Dependencias instaladas"

# 6. Cria wrapper .bat para o servico
$bat = "@echo off\n$($python -replace '\\\\','\\\\') $INSTALL\\agent.py"
Set-Content "$INSTALL\\run-agent.bat" $bat -Encoding ASCII

# 7. Registra como servico Windows via NSSM (ou Task Scheduler se NSSM nao disponivel)
$nssm = (Get-Command nssm -ErrorAction SilentlyContinue)?.Source

if ($nssm) {
    & $nssm install $SVC_NAME $python "$INSTALL\\agent.py"
    & $nssm set $SVC_NAME AppDirectory $INSTALL
    & $nssm set $SVC_NAME Start SERVICE_AUTO_START
    & $nssm set $SVC_NAME DisplayName "ConsultarTI Agent"
    & $nssm set $SVC_NAME Description "Agente de sincronizacao ConsultarTI com o Active Directory"
    & $nssm start $SVC_NAME
    Write-Host "[OK] Servico '$SVC_NAME' instalado e iniciado via NSSM"
} else {
    # Fallback: Task Scheduler (executa a cada 5 min)
    $action  = New-ScheduledTaskAction -Execute $python -Argument "$INSTALL\\agent.py"
    $trigger = New-ScheduledTaskTrigger -RepetitionInterval (New-TimeSpan -Minutes 5) -Once -At (Get-Date)
    $settings = New-ScheduledTaskSettingsSet -ExecutionTimeLimit (New-TimeSpan -Minutes 4)
    Register-ScheduledTask -TaskName $SVC_NAME \`
        -Action $action -Trigger $trigger -Settings $settings \`
        -RunLevel Highest -Force | Out-Null
    Start-ScheduledTask -TaskName $SVC_NAME
    Write-Host "[OK] Tarefa agendada '$SVC_NAME' criada (executa a cada 5 minutos)"
}

Write-Host ""
Write-Host "Instalacao concluida!" -ForegroundColor Green
Write-Host "O agente esta conectado ao tenant: ${tenantName}" -ForegroundColor Green
Write-Host ""
`.trimStart()

  return new NextResponse(script, {
    status: 200,
    headers: {
      'Content-Type': 'text/plain; charset=utf-8',
      'Cache-Control': 'no-store',
    },
  })
}
