"use strict";
// Credenciales efimeras para un TURN propio (coturn con use-auth-secret).
//
// Es el mecanismo REST de coturn: el servidor no guarda usuarios, valida que
//   credential == base64(HMAC-SHA1(static-auth-secret, username))
// y que el timestamp del username no haya caducado. Asi las credenciales se
// generan sin hablar con coturn y caducan solas.
//
// Portado del turn.js de karvan-web, cambiando sessionId por el feed id: lo que
// identifica a quien llama en Oasis es su feed, no una sesion anonima.

const crypto = require("crypto");

const DEFAULT_TTL = 3600;

// username = <caduca en unix> ":" <identificador>
function mintTurnCredentials({ urls, secret, ttlSec = DEFAULT_TTL }, who, now = Date.now()) {
  if (!secret || !Array.isArray(urls) || !urls.length) return null;
  const expiry = Math.floor(now / 1000) + ttlSec;
  const username = expiry + ":" + String(who || "anon").slice(0, 64);
  const credential = crypto.createHmac("sha1", secret).update(username).digest("base64");
  return { urls, username, credential, ttl: ttlSec, expiry };
}

// Lee la configuracion de rtc y devuelve lo que el navegador espera en iceServers.
// Formas admitidas en oasis-config.json:
//   "rtc": { "stun": ["stun:mi.pub:3478"] }
//   "rtc": { "turn": { "urls": [...], "secret": "...", "ttlSec": 3600 }, "relayOnly": true }
//   "rtc": { "turn": { "urls": [...], "username": "...", "credential": "..." } }   (estatico)
function buildIceServers(rtc, who, now = Date.now()) {
  const out = [];
  if (!rtc || typeof rtc !== "object") return { iceServers: out, relayOnly: false };

  if (Array.isArray(rtc.stun)) {
    for (const u of rtc.stun) if (typeof u === "string" && u) out.push({ urls: u });
  }

  const t = rtc.turn;
  if (t && Array.isArray(t.urls) && t.urls.length) {
    if (t.secret) {
      const c = mintTurnCredentials(t, who, now);
      if (c) out.push({ urls: c.urls, username: c.username, credential: c.credential });
    } else if (t.username && t.credential) {
      out.push({ urls: t.urls, username: t.username, credential: t.credential });
    }
  }
  return { iceServers: out, relayOnly: !!rtc.relayOnly && out.some(s => s.credential) };
}

module.exports = { mintTurnCredentials, buildIceServers };
