CCCPaste

AM4 Rename Plane

// ==========================================
//  CRIADO POR ANTONIO PEDRO - 2025
// ==========================================

(async function() {
  // CONFIGURAÇÃO INICIAL
  let prefix = prompt('Qual prefixo você quer usar para os nomes? (ex: XSS)', 'XSS') || 'XSS';
  prefix = prefix.toUpperCase().trim();
  
  const mode = confirm('Clique OK para renomear TODOS os aviões (sobrescreve existentes).\nClique Cancelar para renomear SÓ os não nomeados (continua a numeração).');
  const renameAll = mode;
  
  console.log(`🚀 Iniciando rename com prefixo: ${prefix}`);
  console.log(`Modo: ${renameAll ? 'Renomear TODOS' : 'Só não nomeados (continuar numeração)'}`);
  
  // Função para aguardar elemento
  function waitForElement(selector, timeout = 5000) {
    return new Promise((resolve, reject) => {
      if (document.querySelector(selector)) {
        return resolve(document.querySelector(selector));
      }
      const observer = new MutationObserver(() => {
        if (document.querySelector(selector)) {
          resolve(document.querySelector(selector));
          observer.disconnect();
        }
      });
      observer.observe(document.body, { childList: true, subtree: true });
      setTimeout(() => {
        observer.disconnect();
        reject(new Error(`Timeout waiting for ${selector}`));
      }, timeout);
    });
  }
  
  // Função para encontrar botão "Frota" (CORRIGIDA)
  function findFleetButton() {
    console.log('🔍 Procurando botão "Frota"...');
    
    // Buscar todos os botões
    const allButtons = document.querySelectorAll('button, [class*="btn"], .listBtns');
    console.log(`📊 Total de botões encontrados: ${allButtons.length}`);
    
    for (let btn of allButtons) {
      const text = (btn.textContent || btn.innerText || '').trim();
      const onclick = btn.getAttribute('onclick') || '';
      
      console.log(`🔍 Verificando botão: "${text.substring(0, 30)}..." | onclick: ${onclick.substring(0, 50)}...`);
      
      // Verificar texto
      if (text.toLowerCase().includes('frota') || text.includes('Fleet')) {
        console.log(`🎯 BOTÃO FROTA ENCONTRADO! Texto: "${text}"`);
        return btn;
      }
      
      // Verificar onclick
      if (onclick.includes('fleet.php') && !onclick.includes('parked')) {
        console.log(`🎯 BOTÃO FROTA ENCONTRADO! onclick: ${onclick}`);
        return btn;
      }
    }
    
    console.log('❌ Botão "Frota" não encontrado automaticamente.');
    return null;
  }
  
  // Verificar se já está na lista de frota
  console.log('🔍 Verificando se a lista de frota está carregada...');
  let fleetDetailList = document.querySelector('#fleetDetailList');
  
  if (!fleetDetailList) {
    console.log('📂 Lista não carregada. Tentando clicar no botão "Frota"...');
    
    const fleetButton = findFleetButton();
    
    if (fleetButton) {
      console.log('🎯 Clicando no botão "Frota"...');
      fleetButton.click();
      
      // Aguardar o #fleetDetailList aparecer
      try {
        await waitForElement('#fleetDetailList', 10000);
        console.log('✅ Lista de frota carregada com sucesso!');
        fleetDetailList = document.querySelector('#fleetDetailList');
      } catch (e) {
        console.error('❌ Erro ao aguardar lista: ', e);
        alert('❌ Não conseguiu carregar a lista de frota. Clique manualmente no botão "Frota" e execute o script novamente.');
        return;
      }
    } else {
      console.error('❌ Botão "Frota" não encontrado!');
      alert('❌ Botão "Frota" não encontrado. Execute o script de diagnóstico para encontrar o botão correto.');
      return;
    }
  } else {
    console.log('✅ Lista de frota já carregada.');
  }
  
  // Extrair aviões
  const rows = document.querySelectorAll('#fleetDetailList .row.border');
  console.log(`📊 Número de aviões encontrados: ${rows.length}`);
  
  if (rows.length === 0) {
    console.error('❌ Nenhum avião encontrado na lista!');
    console.log('💡 Execute o diagnóstico para ver a estrutura:');
    console.log('document.querySelectorAll("#fleetDetailList > div").length');
    alert('❌ Nenhum avião na lista. Compre aviões ou clique em "Frota" primeiro.');
    return;
  }
  
  const planes = [];
  let maxNumber = 0;
  
  rows.forEach((row, index) => {
    const a = row.querySelector('a[href="#"]');
    if (a) {
      const onclick = a.getAttribute('onclick');
      if (!onclick) return;
      
      const idMatch = onclick.match(/id=(\d+)/);
      if (!idMatch) return;
      
      const planeId = idMatch[1];
      const currentName = a.textContent.trim();
      
      // Verificar se já tem o formato correto
      const match = currentName.match(new RegExp(`^${prefix}-(\\d{4})$`));
      if (match) {
        const num = parseInt(match[1], 10);
        if (num > maxNumber) maxNumber = num;
      }
      
      planes.push({ planeId, currentName, row, a });
      console.log(`✈️ Avião ${index + 1}: ID=${planeId}, Nome="${currentName}"`);
    }
  });
  
  console.log(`🔍 Aviões válidos extraídos: ${planes.length}`);
  
  if (planes.length === 0) {
    console.error('❌ Nenhum avião válido encontrado!');
    return;
  }
  
  let nextNumber = renameAll ? 1 : (maxNumber + 1);
  console.log(`📊 Iniciando numeração a partir de: ${prefix}-${String(nextNumber).padStart(4, '0')}`);
  
  const toRename = renameAll 
    ? planes 
    : planes.filter(p => !p.currentName.match(new RegExp(`^${prefix}-\\d{4}$`)));
  
  console.log(`✈️ Aviões a renomear: ${toRename.length}`);
  
  if (toRename.length === 0) {
    console.log('✅ Nada para renomear! Todos já estão no formato correto.');
    return;
  }
  
  // Confirmar antes de começar
  const confirmStart = confirm(`🚀 Preparado para renomear ${toRename.length} aviões?\nPrefixo: ${prefix}\nIniciando de: ${prefix}-${String(nextNumber).padStart(4, '0')}`);
  if (!confirmStart) {
    console.log('❌ Rename cancelado pelo usuário.');
    return;
  }
  
  // Função de rename individual
  async function renameOne(plane, newName) {
    const timestamp = Date.now();
    const planeId = plane.planeId;
    
    // Tentar encontrar routeId
    let routeId = null;
    try {
      if (typeof flightData !== 'undefined' && Array.isArray(flightData)) {
        const flight = flightData.find(f => f.id == planeId);
        routeId = flight ? flight.routeId : null;
      }
    } catch (e) {
      console.warn('⚠️ flightData não disponível, pulando rename de rotas.');
    }
    
    console.log(`🔄 Renomeando ${planeId} de "${plane.currentName}" → "${newName}"`);
    
    // Rename do avião
    const regUrl = `https://www.airlinemanager.com/fleet_details.php?id=${planeId}&mode=reg®=${encodeURIComponent(newName)}&fbSig=false&_${timestamp}`;
    try {
      const response = await fetch(regUrl);
      if (!response.ok) throw new Error(`HTTP ${response.status}`);
      console.log(`✅ Registro renomeado: ${newName}`);
    } catch (e) {
      console.error(`❌ Erro no registro ${newName}: ${e.message}`);
    }
    
    // Rename da rota (se existir)
    if (routeId) {
      const routeUrl = `https://www.airlinemanager.com/fleet_details.php?id=${routeId}&mode=routeReg®=${encodeURIComponent(newName)}&fbSig=false&_${timestamp + 1}`;
      try {
        const response = await fetch(routeUrl);
        if (!response.ok) throw new Error(`HTTP ${response.status}`);
        console.log(`✅ Rota renomeada: ${newName}`);
      } catch (e) {
        console.error(`❌ Erro na rota ${newName}: ${e.message}`);
      }
    } else {
      console.log(`ℹ️ Sem rota para ${newName}`);
    }
    
    // Atualizar interface
    plane.a.textContent = newName;
    
    // Atualizar flightData se existir
    if (typeof flightData !== 'undefined' && Array.isArray(flightData)) {
      const flight = flightData.find(f => f.id == planeId);
      if (flight) flight.routeReg = newName;
    }
    
    // Delay de 1 segundo
    await new Promise(resolve => setTimeout(resolve, 1000));
  }
  
  // Executar renames
  console.log('🚀 === INICIANDO PROCESSO DE RENAME ===');
  for (let i = 0; i < toRename.length; i++) {
    const plane = toRename[i];
    const newName = `${prefix}-${String(nextNumber).padStart(4, '0')}`;
    nextNumber++;
    
    console.log(`📊 Progresso: ${i + 1}/${toRename.length} (${Math.round((i + 1) / toRename.length * 100)}%)`);
    console.log(`   ${plane.currentName} → ${newName}`);
    
    await renameOne(plane, newName);
  }
  
  console.log(`🎉 === CONCLUÍDO! ===`);
  console.log(`✅ Sua frota agora usa "${prefix}-XXXX" de ${prefix}-0001 até ${prefix}-${String(nextNumber - 1).padStart(4, '0')}`);
  alert(`✅ Rename concluído! ${toRename.length} aviões renomeados com sucesso!`);
})();