const { Client } = require('ssh2');

const TILES = [
  'N55E037','N55E038','N55E039','N55E040',
  'N54E037','N54E038','N54E039','N54E040',
  'N53E038','N53E039','N53E040','N53E041',
  'N52E038','N52E039','N52E040','N52E041',
  'N56E037','N56E038','N56E039','N56E040',
  'N57E037','N57E038','N57E039','N57E040',
  'N58E037','N58E038','N58E039','N58E040',
  'N59E038','N59E039','N59E040','N59E041',
  'N60E040','N60E041','N60E042',
  'N54E042','N54E043','N54E044','N54E045',
  'N53E042','N53E043','N53E044','N53E045',
  'N52E042','N52E043','N52E044','N52E045',
  'N51E038','N51E039','N51E040','N51E041',
  'N50E038','N50E039','N50E040','N50E041',
  'N55E047','N55E048','N55E049','N55E050',
  'N54E047','N54E048','N54E049','N54E050',
  'N56E047','N56E048','N56E049','N56E050',
];

const conn = new Client();

conn.on('ready', () => {
  console.log('SSH connected. Generating server-side download script...');

  // Generate a bash script to download all tiles in parallel batches
  const scriptLines = [
    '#!/bin/bash',
    'cd /home/slin/enduro-trails/data/srtm',
    'BASE_URL="https://s3.amazonaws.com/elevation-tiles-prod/skadi"',
    'MAX_JOBS=4',
    'JOBS=0',
    '',
    'download_tile() {',
    '  local tile="$1"',
    '  local lat="${tile:1:2}"',
    '  local url="${BASE_URL}/${lat}/${tile}.hgt.gz"',
    '  local gz="${tile}.hgt.gz"',
    '  local hgt="${tile}.hgt"',
    '  if [ -f "$hgt" ]; then',
    '    echo "SKIP $tile"',
    '    return',
    '  fi',
    '  wget --timeout=60 -q "$url" -O "$gz" 2>/dev/null',
    '  if [ -s "$gz" ]; then',
    '    gunzip -f "$gz"',
    '    echo "OK $tile"',
    '  else',
    '    echo "FAIL $tile"',
    '    rm -f "$gz"',
    '  fi',
    '}',
    '',
    'export -f download_tile',
    'export BASE_URL',
    '',
    'echo "Starting downloads..."',
  ];

  for (const tile of TILES) {
    scriptLines.push(`download_tile ${tile} &`);
    scriptLines.push('JOBS=$((JOBS + 1))');
    scriptLines.push('if [ $JOBS -ge $MAX_JOBS ]; then wait; JOBS=0; fi');
  }
  scriptLines.push('wait');
  scriptLines.push('echo "DONE: $(ls *.hgt 2>/dev/null | wc -l) .hgt files"');

  const script = scriptLines.join('\n');

  conn.exec(script, (err, stream) => {
    if (err) { console.error('Exec error:', err); conn.end(); return; }
    stream.on('data', d => process.stdout.write(d));
    stream.stderr.on('data', d => process.stderr.write(d));
    stream.on('close', (code) => {
      console.log('\nScript exited:', code);
      conn.end();
    });
  });
});

conn.on('error', (err) => {
  console.error('SSH error:', err.message);
  process.exit(1);
});

conn.connect({
  host: '82.22.50.71',
  username: 'slin',
  password: 'motoZ@yaz2010',
  readyTimeout: 30000
});
