<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Google Short Link Generator v2</title>
<style>
  body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; background:#0f0f0f; color:#eee; max-width:850px; margin:30px auto; padding:0 20px; }
  h1 { font-size:22px; margin-bottom:6px; }
  .row { display:flex; gap:12px; align-items:center; margin:12px 0; flex-wrap:wrap; }
  textarea { width:100%; background:#1a1a1a; color:#fff; border:1px solid #333; border-radius:8px; padding:12px; font-size:13px; font-family:monospace; }
  #urls { height:180px; }
  #shortList { height:140px; background:#111; border:1px dashed #444; }
  button { background:#fff; color:#000; border:none; padding:10px 18px; border-radius:8px; font-weight:600; cursor:pointer; }
  button:disabled { opacity:.5; cursor:not-allowed; }
  button.secondary { background:#222; color:#eee; }
  button.small { padding:6px 12px; font-size:12px; }
  input[type="number"] { background:#1a1a1a; color:#fff; border:1px solid #333; border-radius:6px; padding:8px 10px; width:90px; }
  .item { background:#1a1a1a; border:1px solid #2a2a2a; border-radius:8px; padding:10px 12px; margin-top:8px; display:flex; justify-content:space-between; align-items:center; gap:10px; font-size:13px; }
  .item .orig { font-size:11px; color:#888; word-break:break-all; margin-top:3px; }
  .item .short { font-size:14px; color:#6cf; font-weight:600; }
  .error { color:#ff6b6b; } .ok { color:#51cf66; }
  .hint { font-size:12px; color:#666; margin-top:16px; line-height:1.5; }
  .badge { background:#222; border:1px solid #333; padding:4px 8px; border-radius:20px; font-size:11px; color:#aaa; }
  a { color:#6cf; text-decoration:none; }
  a:hover { text-decoration:underline; }
  code { background:#222; padding:2px 6px; border-radius:4px; font-size:12px; }
</style>
</head>
<body>

<h1>Генератор g.co/kgs/ — v2</h1>

<div class="row">
  <label>Задержка: <input type="number" id="delay" value="0.1" min="0" max="10" step="0.1"> сек</label>
  <span class="badge">{rand} / {rand-0-1000} / {rand-5-50}</span>
  <span style="font-size:12px;color:#666">Макрос заменится на случайное число</span>
</div>

<textarea id="urls" placeholder="Примеры:
https://www.logogala.com/gallery{rand-0-1000}/
https://example.com/page/{rand}/
https://site.com/item-{rand-1-100}/">https://www.logogala.com/gallery{rand-0-1000}/
https://www.logogala.com/gallery{rand-0-1000}/
https://www.logogala.com/gallery{rand-0-1000}/</textarea>

<div class="row">
  <button id="btn" onclick="start()">Сгенерировать</button>
  <button class="secondary" onclick="stop()">Стоп</button>
  <button class="secondary" onclick="clearAll()">Очистить</button>
  <span id="counter" style="font-size:12px;color:#888"></span>
</div>

<div id="results"></div>

<div id="copyBlock" style="display:none; margin-top:20px;">
  <div class="row" style="justify-content:space-between">
    <b style="font-size:14px">Только шорт-ссылки (для копирования):</b>
    <div style="display:flex;gap:8px">
      <button class="small" onclick="copyShorts()">Скопировать все</button>
      <button class="small" style="background:#6cf;color:#000" onclick="createFeedFromShorts()">Создать feed.php для PubSubHubbub</button>
    </div>
  </div>
  <textarea id="shortList" readonly placeholder="Здесь появятся только https://g.co/kgs/... по одной на строку"></textarea>
  <div class="row">
    <span id="shortCount" style="font-size:12px;color:#888"></span>
  </div>
</div>

<div class="hint">
  • Макросы: <code>{rand}</code> = 0-1000, <code>{rand-0-1000}</code> = от 0 до 1000, <code>{rand-1-50}</code> = от 1 до 50. Работает везде в URL, можно несколько в одном урле.<br>
  • Задержка 0.1 сек по дефолту, можешь поставить 0 для максимальной скорости.<br>
  • Использует внутренний API Google <code>GetShortenedKpSharingUrl</code>. Если перестанет — обнови Cookie в <code>shorten.php</code>.
</div>

<script>
let abort = false;
let shortLinks = [];

function sleep(ms){ return new Promise(r=>setTimeout(r, ms)); }

function randInt(min, max){
  min = Math.ceil(min); max = Math.floor(max);
  return Math.floor(Math.random() * (max - min + 1)) + min;
}

function expandMacros(str){
  return str.replace(/\{rand(?:-(\d+)-(\d+))?\}/gi, (match, p1, p2)=>{
    if(p1 !== undefined && p2 !== undefined){
      return randInt(parseInt(p1), parseInt(p2));
    }
    return randInt(0, 1000);
  });
}

function clearAll(){
  document.getElementById('results').innerHTML='';
  document.getElementById('shortList').value='';
  document.getElementById('copyBlock').style.display='none';
  document.getElementById('counter').textContent='';
  document.getElementById('shortCount').textContent='';
  shortLinks = [];
}

function stop(){ abort = true; }

function copyShorts(){
  const ta = document.getElementById('shortList');
  ta.select();
  document.execCommand('copy');
  const btn = event.target;
  const old = btn.textContent;
  btn.textContent = 'Скопировано!';
  setTimeout(()=>btn.textContent=old, 1500);
}

async function start(){
  const btn = document.getElementById('btn');
  const ta = document.getElementById('urls');
  const delayInput = document.getElementById('delay');
  const delaySec = parseFloat(delayInput.value) || 0;
  const delayMs = delaySec * 1000;

  let rawUrls = ta.value.split('\n').map(s=>s.trim()).filter(Boolean);
  if(!rawUrls.length){ alert('Вставь хотя бы 1 URL'); return; }

  btn.disabled = true;
  btn.textContent = 'Генерирую...';
  document.getElementById('results').innerHTML = '';
  document.getElementById('shortList').value = '';
  document.getElementById('copyBlock').style.display = 'none';
  shortLinks = [];
  abort = false;

  for(let i=0;i<rawUrls.length;i++){
    if(abort) break;
    const raw = rawUrls[i];
    const expanded = expandMacros(raw);

    const div = document.createElement('div');
    div.className = 'item';
    div.innerHTML = `<div><div class="short">⏳ ${i+1}/${rawUrls.length}</div><div class="orig">${expanded}<br><span style="color:#555">${raw !== expanded ? 'из: '+raw : ''}</span></div></div><div class="status">...</div>`;
    document.getElementById('results').appendChild(div);
    document.getElementById('counter').textContent = `${i+1} / ${rawUrls.length}`;

    if(i>0 && delayMs>0) await sleep(delayMs);

    try{
      const res = await fetch('shorten.php', {
        method:'POST',
        headers:{'Content-Type':'application/json'},
        body: JSON.stringify({url: expanded})
      });
      const data = await res.json();
      
      if(data.success){
        shortLinks.push(data.short);
        div.innerHTML = `<div><div class="short"><a href="${data.short}" target="_blank">${data.short}</a></div><div class="orig">${data.original}<br><span style="color:#555">${raw !== data.original ? 'шаблон: '+raw : ''}</span></div></div><div class="status ok">OK</div>`;
        updateShortList();
      } else {
        div.innerHTML = `<div><div class="short error">FAIL</div><div class="orig">${expanded}<div style="font-size:11px;color:#666;max-width:400px;word-break:break-all">${(data.raw||data.error||'unknown').toString().substring(0,400)}</div></div></div><div class="status error">ERR</div>`;
        console.log('fail', data);
      }
    }catch(e){
      div.innerHTML = `<div><div class="short error">JS error</div><div class="orig">${expanded}<br>${e.message}</div></div><div class="status error">ERR</div>`;
    }
  }

  btn.disabled = false;
  btn.textContent = 'Сгенерировать';
  document.getElementById('counter').textContent = `Готово: ${shortLinks.length}/${rawUrls.length}`;
}

function updateShortList(){
  const ta = document.getElementById('shortList');
  const block = document.getElementById('copyBlock');
  ta.value = shortLinks.join('\n');
  block.style.display = 'block';
  document.getElementById('shortCount').textContent = `${shortLinks.length} ссылок`;
  ta.scrollTop = ta.scrollHeight;
}

function createFeedFromShorts(){
  if(!shortLinks.length){ alert('Сначала сгенерируй шорт-ссылки'); return; }
  // Собираем пары оригинал -> шорт для сохранения в фид
  const taUrls = document.getElementById('urls').value.split('\n').map(s=>s.trim()).filter(Boolean);
  // Кодируем список шортов в base64 и открываем билдер фида
  // Пробуем найти feed_builder.php рядом или в /feed/
  const encoded = btoa(JSON.stringify(shortLinks));
  const possiblePaths = [
    '../feed/feed_builder.php?shorts=' + encodeURIComponent(encoded),
    '/feed/feed_builder.php?shorts=' + encodeURIComponent(encoded),
    'feed_builder.php?shorts=' + encodeURIComponent(encoded)
  ];
  // Открываем первый вариант, пользователь может поменять
  const target = possiblePaths[0];
  window.open(target, '_blank');
  // Также показываем инструкцию
  alert('Откроется feed_builder.php. Если не открылся, скопируй список шортов и вставь вручную в https://www.logogala.com/feed/feed_builder.php');
}

</script>

</body>
</html>
