<?php
$pageTitle = 'Troca em Massa';
require_once __DIR__ . '/_header.php';

$csrf = gpc_csrf_token();
$self = basename($_SERVER['PHP_SELF']);
$canBulk = ((int)($reseller['can_bulk_dns'] ?? 0) === 1) && syntra_reseller_can_dns($reseller);

function rv_base_url(string $url): string {
    return rtrim(gpc_base_url($url), '/');
}

if ($_SERVER['REQUEST_METHOD'] === 'POST' && gpc_csrf_check($_POST['csrf'] ?? null)) {
    if (!$canBulk) {
        gpc_flash('bad', 'Troca em massa bloqueada pelo admin para sua revenda.');
        header('Location: '.$self); exit;
    }

    $oldCode = strtoupper(trim((string)($_POST['old_code'] ?? '')));
    $newCode = strtoupper(trim((string)($_POST['new_code'] ?? '')));
    $oldDns  = rv_base_url((string)($_POST['old_dns'] ?? ''));
    $newDns  = rv_base_url((string)($_POST['new_dns'] ?? ''));
    $applyDevices = isset($_POST['apply_devices']) ? 1 : 0;

    if ($oldCode === '' && $oldDns === '') {
        gpc_flash('bad', 'Informe pelo menos o código antigo ou a DNS antiga.');
        header('Location: '.$self); exit;
    } elseif ($newCode !== '' && !preg_match('/^[A-Z0-9\-_]{3,20}$/', $newCode)) {
        gpc_flash('bad', 'Novo código inválido. Use 3 a 20 caracteres, letras/números, hífen ou underline.');
        header('Location: '.$self); exit;
    } elseif ($newDns === '' && $newCode === '') {
        gpc_flash('bad', 'Informe uma nova DNS e/ou um novo código.');
        header('Location: '.$self); exit;
    } else {
        try {
            $db->beginTransaction();

            $where = ['reseller_id=:rid'];
            $params = [':rid'=>$resellerId];
            if ($oldCode !== '') { $where[]='code=:oldc'; $params[':oldc']=$oldCode; }
            if ($oldDns !== '') { $where[]='url=:oldd'; $params[':oldd']=$oldDns; }

            $stmt = $db->prepare('SELECT * FROM dns_servers WHERE '.implode(' AND ', $where).' LIMIT 1');
            $stmt->execute($params);
            $dnsRow = $stmt->fetch();

            if (!$dnsRow) {
                throw new RuntimeException('Nenhuma DNS/código da sua revenda foi encontrada com esses dados.');
            }

            if ($newCode !== '') {
                $check = $db->prepare('SELECT id FROM dns_servers WHERE code=:c AND id<>:id LIMIT 1');
                $check->execute([':c'=>$newCode, ':id'=>(int)$dnsRow['id']]);
                if ($check->fetch()) {
                    throw new RuntimeException('O novo código já está em uso no sistema.');
                }
            }

            $finalCode = $newCode !== '' ? $newCode : (string)$dnsRow['code'];
            $finalDns  = $newDns  !== '' ? $newDns  : rv_base_url((string)$dnsRow['url']);
            $oldDnsDb  = rv_base_url((string)$dnsRow['url']);
            $oldCodeDb = (string)$dnsRow['code'];

            $updDns = $db->prepare('UPDATE dns_servers SET code=:c, url=:u WHERE id=:id AND reseller_id=:rid');
            $updDns->execute([':c'=>$finalCode, ':u'=>$finalDns, ':id'=>(int)$dnsRow['id'], ':rid'=>$resellerId]);

            $changedDevices = 0;
            $changedLogs = 0;

            if ($applyDevices) {
                $devStmt = $db->prepare("SELECT id, username, password, dns, playlist_url, notes FROM devices 
                    WHERE COALESCE(access_type,'')='partner_code'
                    AND (notes LIKE :oldNote OR dns=:oldDns OR playlist_url LIKE :oldDnsLike)
                    LIMIT 1000");
                $devStmt->execute([
                    ':oldNote'=>'%Código DNS: '.$oldCodeDb.'%',
                    ':oldDns'=>$oldDnsDb,
                    ':oldDnsLike'=>$oldDnsDb.'%'
                ]);
                $devices = $devStmt->fetchAll();

                $updDev = $db->prepare('UPDATE devices SET dns=:dns, playlist_url=:pl, notes=:notes WHERE id=:id');
                foreach ($devices as $d) {
                    $notes = (string)($d['notes'] ?? '');
                    if (strpos($notes, 'Código DNS: '.$oldCodeDb) === false && rv_base_url((string)($d['dns'] ?? '')) !== $oldDnsDb) {
                        continue;
                    }
                    $user = (string)($d['username'] ?? '');
                    $pass = (string)($d['password'] ?? '');
                    $playlist = $finalDns;
                    if ($user !== '' && $pass !== '') {
                        $playlist = rtrim($finalDns, '/') . '/get.php?username=' . rawurlencode($user) . '&password=' . rawurlencode($pass) . '&type=m3u_plus&output=mpegts';
                    } else {
                        $playlist = str_replace([$oldDnsDb, $oldDnsDb.'/'], [$finalDns, $finalDns.'/'], (string)($d['playlist_url'] ?? ''));
                    }
                    $newNotes = str_replace('Código DNS: '.$oldCodeDb, 'Código DNS: '.$finalCode, $notes);
                    $updDev->execute([':dns'=>$finalDns, ':pl'=>$playlist, ':notes'=>$newNotes, ':id'=>(int)$d['id']]);
                    $changedDevices++;
                }

                $logSql = 'UPDATE registration_logs SET dns_url=:newdns'.($newCode!=='' ? ', cod_revenda=:newcode' : '').' WHERE cod_revenda=:oldcode OR dns_url=:olddns';
                $logParams = [':newdns'=>$finalDns, ':oldcode'=>$oldCodeDb, ':olddns'=>$oldDnsDb];
                if ($newCode !== '') $logParams[':newcode']=$finalCode;
                $updLog = $db->prepare($logSql);
                $updLog->execute($logParams);
                $changedLogs = $updLog->rowCount();
            }

            $db->commit();
            gpc_flash('ok', 'Troca em massa concluída. DNS/código atualizado. MACs/listas alterados: '.$changedDevices.'. Logs atualizados: '.$changedLogs.'.');
        } catch (Throwable $e) {
            if ($db->inTransaction()) $db->rollBack();
            gpc_flash('bad', 'Erro na troca em massa: '.$e->getMessage());
        }
        header('Location: '.$self); exit;
    }
}

$stmt=$db->prepare('SELECT * FROM dns_servers WHERE reseller_id=:rid ORDER BY id DESC');
$stmt->execute([':rid'=>$resellerId]);
$dnsRows=$stmt->fetchAll();
?>
<div class="section-title">
  <div>
    <span class="eyebrow">SYNTRA Revenda</span>
    <h2>Troca de DNS/Código em Massa</h2>
    <p>Ferramenta para trocar servidor ou código dos seus próprios clientes sem mexer em dados do admin ou de outras revendas.</p>
  </div>
  <span class="badge <?= $canBulk?'badge-ok':'badge-bad' ?>"><?= $canBulk?'Liberada pelo admin':'Bloqueada pelo admin' ?></span>
</div>

<?php if(!$canBulk): ?>
<div class="alert alert-bad">Esta função está bloqueada pelo admin master. Peça liberação para usar troca em massa.</div>
<?php endif; ?>

<div class="card">
  <div class="card-head"><h2>Aplicar troca</h2></div>
  <div class="card-body">
    <form method="post">
      <input type="hidden" name="csrf" value="<?= rv_h($csrf) ?>">
      <div class="alert alert-info">A troca só procura DNS/códigos pertencentes à sua revenda. Para maior segurança, informe o código antigo e a DNS antiga.</div>
      <div class="form-grid">
        <div class="field"><label>Código antigo</label><input name="old_code" placeholder="Ex: 8676"></div>
        <div class="field"><label>Novo código opcional</label><input name="new_code" placeholder="Ex: 9999"></div>
        <div class="field"><label>DNS antiga</label><input name="old_dns" placeholder="http://servidor-antigo:80"></div>
        <div class="field"><label>DNS nova</label><input name="new_dns" placeholder="http://servidor-novo:80"></div>
        <div class="field"><label>Aplicação</label><label class="check"><input type="checkbox" name="apply_devices" checked> Atualizar também MACs/listas já cadastradas com esse código/DNS</label></div>
      </div>
      <div class="form-actions"><button class="btn" type="submit" data-confirm="Confirmar troca em massa da sua revenda?"><i data-lucide="repeat"></i> Executar troca</button></div>
    </form>
  </div>
</div>

<div class="card">
  <div class="card-head"><h2>Minhas DNS atuais</h2></div>
  <div class="card-body flush">
    <div class="table-scroll"><table><thead><tr><th>Nome</th><th>Código</th><th>DNS</th><th>Status</th></tr></thead><tbody>
    <?php foreach($dnsRows as $r): $ok=((int)$r['status']===1) && (empty($r['validity']) || !gpc_expired((string)$r['validity'])); ?>
      <tr><td><?= rv_h($r['name']) ?></td><td><span class="badge badge-ok"><?= rv_h($r['code']) ?></span></td><td><code><?= rv_h($r['url']) ?></code></td><td><span class="badge <?= $ok?'badge-ok':'badge-bad' ?>"><?= $ok?'Ativa':'Bloqueada' ?></span></td></tr>
    <?php endforeach; if(!$dnsRows): ?><tr><td colspan="4" class="empty">Nenhuma DNS cadastrada.</td></tr><?php endif; ?>
    </tbody></table></div>
  </div>
</div>
<?php require_once __DIR__ . '/_footer.php'; ?>
