<?php
ini_set('display_errors', 1);
error_reporting(E_ALL);

// === SECURITY: Require admin login ===
// Force session cookie path = '/' (see index.php for full explanation)
if (session_status() === PHP_SESSION_NONE) {
    $cp = session_get_cookie_params();
    session_set_cookie_params([
        'lifetime' => $cp['lifetime'] ?? 0,
        'path'     => '/',
        'domain'   => $cp['domain'] ?? '',
        'secure'   => !empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off',
        'httponly' => true,
        'samesite' => 'Lax'
    ]);
    session_name('PHPSESSID');
    session_start();
}
if (empty($_SESSION['admin_logged_in']) || empty($_SESSION['user_id'])) {
    header('Location: index.php');
    exit();
}

define('DATA_DIR', __DIR__ . '/data');

function ensureDataDir() {
    if (!is_dir(DATA_DIR)) mkdir(DATA_DIR, 0755, true);
    if (!file_exists(DATA_DIR . '/.htaccess')) {
        file_put_contents(DATA_DIR . '/.htaccess', "Deny from all\n");
    }
}

function loadData($file) {
    ensureDataDir();
    $path = DATA_DIR . '/' . $file;
    if (!file_exists($path)) return [];
    $raw = file_get_contents($path);
    return json_decode($raw, true) ?: [];
}

function saveData($file, $data) {
    ensureDataDir();
    $path = DATA_DIR . '/' . $file;
    file_put_contents($path, json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES), LOCK_EX);
}

// Prepare Data for Form
$allAppsForAdmin = loadData('applications.json');
usort($allAppsForAdmin, function($a,$b){ return ($a['sort_order']??0) - ($b['sort_order']??0); });

$APP_LABELS = []; $APP_MAX = []; $APP_URLS_PHP = [];
foreach ($allAppsForAdmin as $app) {
    if ($app['is_active']) {
        $APP_LABELS[$app['id']] = $app['name'];
        $APP_MAX[$app['id']] = (int)$app['max_servers'];
        $APP_URLS_PHP[$app['id']] = $app['default_url'] ?? '';
    }
}
?>
<!DOCTYPE html>
<html lang="id">
<head>
<meta charset="UTF-8"/>
<meta name="viewport" content="width=device-width,initial-scale=1.0"/>
<title>Inject Cookies - TEKNO-APPS</title>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet"/>
<style>
*,*::before,*::after{box-sizing:border-box;margin:0;padding:0}
:root{--deep:#020c18;--blue:#0066ff;--bright:#0099ff;--light:#4db8ff;--text:#e8f4ff;--sub:#7aaed4;--muted:#4a7a9b;--glass:rgba(4,22,48,.85);--border:rgba(0,150,255,.18);--ok:#00e676;--err:#ff4d4d;--warn:#ffaa00}
body{min-height:100vh;background:var(--deep);font-family:"Inter",sans-serif;color:var(--text)}
body::before{content:"";position:fixed;inset:0;pointer-events:none;background:radial-gradient(ellipse at 15% 15%,rgba(0,80,180,.22) 0%,transparent 55%),radial-gradient(ellipse at 85% 85%,rgba(0,40,130,.16) 0%,transparent 55%)}
.wrap{max-width:940px;margin:0 auto;padding:28px 18px;position:relative;z-index:1}
.hdr{display:flex;align-items:center;gap:14px;margin-bottom:26px}
.logo{width:46px;height:46px;border-radius:13px;background:linear-gradient(135deg,#0044cc,#0099ff);display:flex;align-items:center;justify-content:center;font-size:15px;font-weight:900;box-shadow:0 0 18px rgba(0,150,255,.4)}
.hdr-text h1{font-size:20px;font-weight:800;background:linear-gradient(135deg,#e0f0ff,#4db8ff);-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text}
.hdr-text p{font-size:12px;color:var(--sub);margin-top:3px}
.card{background:var(--glass);border:1px solid var(--border);border-radius:14px;padding:20px;margin-bottom:20px;box-shadow:0 8px 32px rgba(0,0,0,.4);backdrop-filter:blur(10px)}
.ct{font-size:15px;font-weight:700;margin-bottom:18px;color:#fff;display:flex;align-items:center;gap:8px}
.ct::before{content:"";width:4px;height:16px;background:var(--bright);border-radius:2px}
.fg{display:flex;flex-wrap:wrap;gap:14px}
.fi{flex:1 1 200px;min-width:200px}
.fi.full{flex:1 1 100%}
label{display:block;font-size:11px;font-weight:600;color:var(--sub);margin-bottom:6px;text-transform:uppercase;letter-spacing:.5px}
input[type="text"],input[type="number"],input[type="url"],select,textarea{width:100%;background:rgba(0,20,50,.4);border:1px solid var(--border);color:#fff;border-radius:8px;padding:10px 14px;font-size:13px;font-family:inherit;transition:all .2s;outline:none}
input:focus,select:focus,textarea:focus{border-color:var(--bright);box-shadow:0 0 0 3px rgba(0,150,255,.15)}
textarea{min-height:200px;resize:vertical;font-family:monospace;font-size:12px;line-height:1.4}
.btn{display:inline-flex;align-items:center;justify-content:center;gap:8px;padding:10px 18px;font-size:13px;font-weight:600;border-radius:8px;border:none;cursor:pointer;transition:all .2s;text-decoration:none;font-family:inherit}
.bp{background:linear-gradient(135deg,#0066ff,#0099ff);color:#fff;box-shadow:0 4px 12px rgba(0,102,255,.3)}
.bp:hover{transform:translateY(-1px);box-shadow:0 6px 16px rgba(0,102,255,.4);filter:brightness(1.1)}
</style>
</head>
<body>
<div class="wrap">
  <div class="hdr">
    <div class="logo">TX</div>
    <div class="hdr-text">
      <h1 id="page-title">TEKNO-APPS — Inject Cookies</h1>
      <p>Tempel JSON Payload dari J2TEAM / EditThisCookie</p>
    </div>
  </div>
  
  <div class="card">
    <div class="ct">⚡ Quick-Link Auto Paste</div>
    <p style="font-size:11px;color:var(--sub);margin-bottom:12px;line-height:1.5;">
      Klik tombol di bawah untuk langsung buka form dengan App + Server sudah terpilih.
      Atau copy URL untuk dibagikan ke admin lain.
    </p>
    <div id="quick-links-container" style="display:flex;flex-wrap:wrap;gap:8px;">
      <?php
      $base_url = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? 'https' : 'http')
                . '://' . $_SERVER['HTTP_HOST']
                . dirname($_SERVER['REQUEST_URI']) . '/cookies.php';
      foreach ($APP_LABELS as $aid => $lbl):
          $maxSrv = $APP_MAX[$aid] ?? 0;
          for ($i = 1; $i <= $maxSrv; $i++):
              $linkUrl = $base_url . '?app=' . urlencode($aid) . '&server=' . $i;
              $shortLbl = htmlspecialchars(str_replace("\n", ' ', $lbl));
      ?>
        <div style="display:flex;align-items:stretch;background:rgba(0,30,80,.4);border:1px solid var(--border);border-radius:8px;overflow:hidden;">
          <a href="<?php echo htmlspecialchars($linkUrl); ?>"
             style="padding:8px 12px;font-size:12px;color:#fff;text-decoration:none;display:flex;align-items:center;gap:6px;font-weight:500;transition:background .2s;"
             onmouseover="this.style.background='rgba(0,100,200,.4)'"
             onmouseout="this.style.background='transparent'">
            <span style="color:var(--light);">▸</span>
            <span><?php echo $shortLbl; ?></span>
            <span style="background:rgba(0,150,255,.2);color:var(--light);padding:2px 6px;border-radius:4px;font-size:10px;font-weight:600;">S<?php echo $i; ?></span>
          </a>
          <button type="button"
                  onclick="copyToClipboard(this, '<?php echo htmlspecialchars($linkUrl, ENT_QUOTES); ?>')"
                  title="Copy URL"
                  style="padding:0 10px;background:rgba(0,40,90,.5);border:none;border-left:1px solid var(--border);color:var(--sub);cursor:pointer;font-size:12px;transition:all .2s;"
                  onmouseover="this.style.background='rgba(0,80,160,.6)';this.style.color='#fff'"
                  onmouseout="this.style.background='rgba(0,40,90,.5)';this.style.color='var(--sub)'">
            📋
          </button>
        </div>
      <?php endfor; endforeach; ?>
    </div>
    <div id="copy-toast" style="position:fixed;bottom:20px;left:50%;transform:translateX(-50%);background:var(--ok);color:#000;padding:10px 20px;border-radius:8px;font-size:13px;font-weight:600;opacity:0;transition:opacity .3s;pointer-events:none;z-index:9999;">
      ✓ URL berhasil disalin!
    </div>
  </div>

  <div class="card">
    <div class="ct">Inject Cookies Server</div>
    <div id="c-form">
      <div class="fg">
        <div class="fi">
          <label>Pilih Aplikasi</label>
          <select id="c-app" required>
            <option value="">-- Pilih Aplikasi --</option>
            <?php foreach ($APP_LABELS as $aid => $lbl): ?>
              <option value="<?php echo $aid; ?>"><?php echo $lbl; ?></option>
            <?php endforeach; ?>
          </select>
        </div>
        <div class="fi">
          <label>Pilih Server</label>
          <select id="c-server" required>
            <option value="">-- Pilih Server --</option>
          </select>
        </div>
        <div class="fi full" style="margin-top:10px;">
          <label>URL Tujuan Aplikasi (Opsional)</label>
          <input type="url" id="c-url" placeholder="Biarkan kosong jika tetap memakai URL bawaan" style="width:100%;box-sizing:border-box;margin-bottom:10px;">
          
          <div style="display:flex; justify-content:space-between; align-items:center; margin-bottom:10px;">
            <label style="margin:0;">Paste JSON Payload (J2TEAM / EditThisCookie)</label>
            <button type="button" class="btn" style="padding:4px 10px; font-size:11px; background:var(--glass); color:var(--light); border:1px solid var(--border);" onclick="addCookiePayloadField()">+ Tambah Payload Cookies</button>
          </div>
          
          <div id="cookie-payloads-container" style="display:flex; flex-direction:column; gap:10px;">
            <div class="cookie-payload-group" style="position:relative;">
                <div style="font-size:10px; color:var(--light); margin-bottom:4px; font-weight:bold;">Payload 1</div>
                <textarea class="c-data-input" placeholder='[{"name":"session_id","value":"xyz","domain":".google.com",...}]' required></textarea>
                <button type="button" onclick="this.parentElement.remove(); updatePayloadLabels();" style="position:absolute; top:0; right:0; background:none; border:none; color:var(--err); cursor:pointer; font-size:12px; font-weight:bold;">✕ Hapus</button>
            </div>
          </div>
        </div>
        <div class="fi full">
           <div id="c-msg" style="font-size:12px;font-weight:bold;margin-top:5px;margin-bottom:5px;"></div>
        </div>
        <div class="fi full" style="display:flex;justify-content:flex-end;margin-top:4px">
          <button type="button" class="btn bp" id="c-submit-btn" onclick="saveC()">&#x1F4BE; Simpan & Inject Sessions</button>
        </div>
      </div>
    </div>
  </div>
  
  <p style="text-align:center;font-size:10px;color:var(--muted);opacity:.5;margin-top:30px">TEKNO-APPS Member Manager &copy; 2026</p>
</div>

<script>
const APP_MAX = <?php echo json_encode($APP_MAX); ?>;
document.getElementById('c-app').addEventListener('change', function() {
    const APP_URLS = <?php echo json_encode($APP_URLS_PHP); ?>;
    const srvSelect = document.getElementById('c-server');
    const urlInput = document.getElementById('c-url');
    srvSelect.innerHTML = '<option value="">-- Pilih Server --</option>';
    const max = APP_MAX[this.value] || 0;
    if (APP_URLS[this.value]) urlInput.value = APP_URLS[this.value]; else urlInput.value = '';
    for (let i = 1; i <= max; i++) {
        const opt = document.createElement('option');
        opt.value = i; opt.textContent = 'Server ' + i;
        srvSelect.appendChild(opt);
    }
});

// Deep-link preselection: ?app=<app_id>&server=<index>
window.addEventListener('DOMContentLoaded', () => {
    const params = new URLSearchParams(window.location.search);
    const appId = params.get('app');
    const serverIdx = params.get('server');
    const appSel = document.getElementById('c-app');
    const srvSel = document.getElementById('c-server');
    const urlInput = document.getElementById('c-url');
    const titleEl = document.getElementById('page-title');

    if (appId && appSel) {
        // Set app value if exists in options
        const hasOption = Array.from(appSel.options).some(o => o.value === appId);
        if (hasOption) {
            appSel.value = appId;
            // Trigger change to populate servers and default URL
            const evt = new Event('change', { bubbles: true });
            appSel.dispatchEvent(evt);
        }
    }
    if (serverIdx && srvSel) {
        // Wait a tick to ensure servers populated
        setTimeout(() => {
            const hasSrv = Array.from(srvSel.options).some(o => o.value === serverIdx);
            if (hasSrv) srvSel.value = serverIdx;
        }, 0);
    }

    // Update page title with selection context
    setTimeout(() => {
        const appLabel = appSel && appSel.value ? appSel.options[appSel.selectedIndex].textContent : '';
        const srvLabel = srvSel && srvSel.value ? ('Server ' + srvSel.value) : '';
        if (appLabel || srvLabel) {
            titleEl.textContent = 'TEKNO-APPS — Inject Cookies' + (appLabel ? (' · ' + appLabel) : '') + (srvLabel ? (' · ' + srvLabel) : '');
        }
        // Ensure URL input reflects default for selected app
        const APP_URLS = <?php echo json_encode($APP_URLS_PHP); ?>;
        if (appSel && appSel.value && APP_URLS[appSel.value]) {
            urlInput.value = APP_URLS[appSel.value];
        }
    }, 10);
});

function addCookiePayloadField(val = '') {
    const container = document.getElementById('cookie-payloads-container');
    const div = document.createElement('div');
    div.className = 'cookie-payload-group';
    div.style.position = 'relative';
    div.innerHTML = `
        <div style="font-size:10px; color:var(--light); margin-bottom:4px; font-weight:bold;">Payload Baru</div>
        <textarea class="c-data-input" placeholder='[{"name":"session_id","value":"xyz","domain":".google.com",...}]' required></textarea>
        <button type="button" onclick="this.parentElement.remove(); updatePayloadLabels();" style="position:absolute; top:0; right:0; background:none; border:none; color:var(--err); cursor:pointer; font-size:12px; font-weight:bold;">✕ Hapus</button>
    `;
    div.querySelector('textarea').value = val;
    container.appendChild(div);
    updatePayloadLabels();
    div.querySelector('textarea').addEventListener('input', scheduleAutoSave);
    div.querySelector('textarea').addEventListener('paste', scheduleAutoSave);
}

function updatePayloadLabels() {
    const groups = document.querySelectorAll('.cookie-payload-group');
    groups.forEach((g, i) => {
        g.querySelector('div').textContent = 'Payload ' + (i + 1);
    });
}

async function loadExistingCookies() {
    const appId = document.getElementById('c-app').value;
    const srvIdx = document.getElementById('c-server').value;
    const urlInput = document.getElementById('c-url');
    const container = document.getElementById('cookie-payloads-container');
    
    if (!appId || !srvIdx) return;
    
    try {
        const res = await fetch(`index.php?action=get_cookies_info&app_id=${appId}&server_index=${srvIdx}`);
        const data = await res.json();
        
        container.innerHTML = ''; // Clear current inputs
        
        if (data.success && data.data && data.data.cookie_data && data.data.cookie_data.length > 0) {
            urlInput.value = data.data.target_url || '';
            
            data.data.cookie_data.forEach((payload, index) => {
                const div = document.createElement('div');
                div.className = 'cookie-payload-group';
                div.style.position = 'relative';
                div.innerHTML = `
                    <div style="font-size:10px; color:var(--light); margin-bottom:4px; font-weight:bold;">Payload ${index + 1}</div>
                    <textarea class="c-data-input" required></textarea>
                    <button type="button" onclick="this.parentElement.remove(); updatePayloadLabels();" style="position:absolute; top:0; right:0; background:none; border:none; color:var(--err); cursor:pointer; font-size:12px; font-weight:bold;">✕ Hapus</button>
                `;
                div.querySelector('textarea').value = JSON.stringify(payload);
                div.querySelector('textarea').addEventListener('input', scheduleAutoSave);
                div.querySelector('textarea').addEventListener('paste', scheduleAutoSave);
                container.appendChild(div);
            });
        } else {
            // No data, show 1 empty box
            addCookiePayloadField();
        }
    } catch(err) {
        console.error("Failed to load existing cookies", err);
        container.innerHTML = '';
        addCookiePayloadField();
    }
}

document.getElementById('c-server').addEventListener('change', loadExistingCookies);

async function saveC() {
    const btn = document.getElementById('c-submit-btn');
    const msg = document.getElementById('c-msg');
    const app_id = document.getElementById('c-app').value;
    const server_index = document.getElementById('c-server').value;
    const target_url = document.getElementById('c-url').value;
    
    const textareas = document.querySelectorAll('.c-data-input');
    const payloads = [];
    let hasError = false;
    textareas.forEach(t => {
        const val = t.value.trim();
        if (val) {
            try {
                const parsed = JSON.parse(val);
                payloads.push(parsed);
            } catch(e) {
                hasError = true;
            }
        }
    });
    
    if (hasError) { msg.textContent = '❌ Ada JSON Payload yang tidak valid.'; msg.style.color = '#ff4d4d'; return; }
    if (!app_id || !server_index || payloads.length === 0) { msg.textContent = '❌ Mohon lengkapi parameter & minimal 1 payload.'; msg.style.color = '#ff4d4d'; return; }
    msg.textContent = 'Menyimpan...'; msg.style.color = '#4db8ff'; btn.disabled = true;
    try {
        const fd = new FormData();
        fd.append('app_id', app_id); fd.append('server_index', server_index);
        fd.append('target_url', target_url); fd.append('cookie_data', JSON.stringify(payloads));
        const res = await fetch('index.php?action=save_cookies', { method: 'POST', body: fd });
        const data = await res.json();
        if(data.success) { 
            msg.textContent = '✅ Berhasil! Data disimpan (' + data.payloads_count + ' payload).'; msg.style.color = '#00e676'; 
            // Intentionally not clearing textareas so they remain visible
            if (data.payload_data) {
                textareas.forEach((t, i) => {
                    if (data.payload_data[i]) t.value = JSON.stringify(data.payload_data[i]);
                });
            }
        }
        else { msg.textContent = '❌ Gagal: ' + (data.message || 'Error'); msg.style.color = '#ff4d4d'; }
    } catch(err) { msg.textContent = '❌ Error koneksi.'; msg.style.color = '#ff4d4d'; }
    finally { btn.disabled = false; setTimeout(() => { if(msg.textContent.includes('Berhasil')) msg.textContent=''; }, 5000); }
}

// Auto-save when cookies payload is pasted or typed
let __autoSaveTimer = null;
function scheduleAutoSave() {
    clearTimeout(__autoSaveTimer);
    __autoSaveTimer = setTimeout(() => {
        const app_id = document.getElementById('c-app').value;
        const server_index = document.getElementById('c-server').value;
        const msg = document.getElementById('c-msg');
        let hasData = false;
        document.querySelectorAll('.c-data-input').forEach(t => { if(t.value.trim().length > 5) hasData = true; });
        if (!hasData) return;
        if (!app_id || !server_index) { msg.textContent = '⚠️ Pilih Aplikasi dan Server terlebih dahulu untuk auto-simpan.'; msg.style.color = '#ffaa00'; return; }
        saveC();
    }, 400);
}
document.querySelectorAll('.c-data-input').forEach(t => {
    ['paste','input','drop'].forEach(ev => t.addEventListener(ev, scheduleAutoSave));
});
// If user selects app/server after pasting, try auto-save again
document.getElementById('c-app').addEventListener('change', () => {
    let hasData = false; document.querySelectorAll('.c-data-input').forEach(t => { if(t.value.trim().length > 5) hasData = true; });
    if (hasData) scheduleAutoSave();
});
document.getElementById('c-server').addEventListener('change', () => {
    let hasData = false; document.querySelectorAll('.c-data-input').forEach(t => { if(t.value.trim().length > 5) hasData = true; });
    if (hasData) scheduleAutoSave();
});

// Quick-link copy to clipboard
function copyToClipboard(btn, url) {
    const fallback = () => {
        const ta = document.createElement('textarea');
        ta.value = url;
        ta.style.position = 'fixed';
        ta.style.opacity = '0';
        document.body.appendChild(ta);
        ta.select();
        try { document.execCommand('copy'); } catch(e) {}
        document.body.removeChild(ta);
    };
    if (navigator.clipboard && navigator.clipboard.writeText) {
        navigator.clipboard.writeText(url).catch(fallback);
    } else {
        fallback();
    }
    showCopyToast();
    const orig = btn.textContent;
    btn.textContent = '✓';
    btn.style.color = '#00e676';
    setTimeout(() => {
        btn.textContent = orig;
        btn.style.color = '';
    }, 1500);
}

function showCopyToast() {
    const toast = document.getElementById('copy-toast');
    if (!toast) return;
    toast.style.opacity = '1';
    setTimeout(() => { toast.style.opacity = '0'; }, 1800);
}
</script>
</body>
</html>
