// lib/md-export.js — genera archivos .md ricos para alimentar a Claude
// El archivo resultante le da contexto completo de la comunidad para:
//   - Responder comentarios automáticamente
//   - Redactar emails de reactivación personalizados
//   - Identificar miembros prioritarios

'use strict';

/**
 * Genera el reporte completo de la comunidad como Markdown.
 * @param {object} opts
 * @param {object} opts.stats - estadísticas generales
 * @param {Array}  opts.members - lista de miembros normalizados
 * @param {Array}  opts.feed - posts recientes
 * @param {string} opts.slug - slug de la comunidad
 */
function generateCommunityMd({ stats, members, feed, slug }) {
  const now = new Date();
  const dateStr = now.toLocaleDateString('es-MX', {
    weekday: 'long', year: 'numeric', month: 'long', day: 'numeric',
  });

  const lines = [];

  // ── ENCABEZADO ────────────────────────────────────────────
  lines.push(`# Contexto de Comunidad Skool — ${stats?.name || slug}`);
  lines.push(`**Generado**: ${dateStr} · **Slug**: \`${slug}\``);
  lines.push('');
  lines.push('> Este archivo fue generado por Skoop. Úsalo para pedirle a Claude que responda comentarios, redacte emails o analice la salud de tu comunidad.');
  lines.push('');

  // ── DASHBOARD ─────────────────────────────────────────────
  lines.push('## Dashboard de Salud');
  lines.push('');
  if (stats) {
    const { totalMembers, riskBuckets, totalPosts } = stats;
    lines.push(`| Métrica | Valor |`);
    lines.push(`|---------|-------|`);
    lines.push(`| Total miembros | **${totalMembers}** |`);
    lines.push(`| Posts indexados | ${totalPosts} |`);
    lines.push(`| 🟢 Activos (≤7 días) | ${riskBuckets?.active || 0} |`);
    lines.push(`| 🟡 Silenciosos (8-30 días) | ${riskBuckets?.silent || 0} |`);
    lines.push(`| 🔴 En riesgo (31-60 días) | ${riskBuckets?.atRisk || 0} |`);
    lines.push(`| ⚫ Churn probable (60+ días) | ${riskBuckets?.churned || 0} |`);
    if (stats.lastSync) {
      lines.push(`| Último sync | ${_relativeTime(stats.lastSync)} |`);
    }
  }
  lines.push('');

  // ── POR IRSE: cancelaron pero su acceso sigue activo (máxima prioridad) ──
  const cancelling = members
    .filter((m) => m.subStatus === 'cancelling')
    .sort((a, b) => (a.daysUntilCancel ?? 9999) - (b.daysUntilCancel ?? 9999));

  if (cancelling.length > 0) {
    lines.push('## 🔴 Por Irse — Cancelaron pero Siguen Activas (RETENCIÓN URGENTE)');
    lines.push('');
    lines.push('> Estas miembros cancelaron su suscripción pero su acceso pagado sigue vigente. Es la ventana para retenerlas: escríbeles por WhatsApp con un mensaje personalizado antes de que se vayan.');
    lines.push('');
    for (const m of cancelling.slice(0, 30)) {
      lines.push(_renderMember(m, true));
    }
  }

  // ── MIEMBROS EN RIESGO (prioridad para acción) ────────────
  const atRisk = members.filter(
    (m) => m.riskLevel === 'atRisk' || m.riskLevel === 'churned'
  ).sort((a, b) => (b.daysSinceLastPost || 999) - (a.daysSinceLastPost || 999));

  if (atRisk.length > 0) {
    lines.push('## Miembros en Riesgo — Acción Urgente');
    lines.push('');
    lines.push('> Estos miembros no han publicado en más de 30 días. Son candidatos prioritarios para emails de reactivación o mención directa en posts.');
    lines.push('');

    for (const m of atRisk.slice(0, 20)) {
      lines.push(_renderMember(m, true));
    }
  }

  // ── MIEMBROS SILENCIOSOS ──────────────────────────────────
  const silent = members.filter((m) => m.riskLevel === 'silent');

  if (silent.length > 0) {
    lines.push('## Miembros Silenciosos (8-30 días sin actividad)');
    lines.push('');
    for (const m of silent.slice(0, 15)) {
      lines.push(_renderMember(m, false));
    }
  }

  // ── MIEMBROS MÁS ACTIVOS ──────────────────────────────────
  const active = members
    .filter((m) => m.riskLevel === 'active')
    .sort((a, b) => (b.postCount || 0) - (a.postCount || 0));

  if (active.length > 0) {
    lines.push('## Miembros Más Activos esta Semana');
    lines.push('');
    for (const m of active.slice(0, 10)) {
      lines.push(_renderMember(m, false));
    }
  }

  // ── FEED RECIENTE ─────────────────────────────────────────
  if (feed && feed.length > 0) {
    lines.push('## Feed Reciente — Últimos Posts');
    lines.push('');
    lines.push('> Usa esta sección para que Claude genere respuestas a posts específicos.');
    lines.push('');

    for (const post of feed.slice(0, 30)) {
      lines.push(_renderPost(post));
    }
  }

  // ── INSTRUCCIONES PARA CLAUDE ─────────────────────────────
  lines.push('---');
  lines.push('');
  lines.push('## Cómo usar este archivo con Claude');
  lines.push('');
  lines.push('Copia todo este markdown y dile a Claude:');
  lines.push('');
  lines.push('**Para responder comentarios:**');
  lines.push('> "Aquí está el contexto de mi comunidad Skool. Responde los comentarios del feed reciente con el tono de Andrea — directo, cálido, siempre llevando a la acción. Máximo 3 líneas por respuesta."');
  lines.push('');
  lines.push('**Para emails de reactivación:**');
  lines.push('> "Basándote en los miembros en riesgo, redacta 3 emails de reactivación personalizados. Menciona cuánto tiempo llevan sin aparecer y ofréceles algo concreto para volver."');
  lines.push('');
  lines.push('**Para post motivacional:**');
  lines.push('> "Basándote en la actividad del feed, redacta un post que celebre los logros recientes de la comunidad y active a los silenciosos."');
  lines.push('');

  return lines.join('\n');
}

// ── RENDERERS INTERNOS ────────────────────────────────────

function _renderMember(m, detailed) {
  const lines = [];
  const label = m.riskLevel === 'churned' ? '⚫' :
                m.riskLevel === 'atRisk' ? '🔴' :
                m.riskLevel === 'silent' ? '🟡' : '🟢';

  lines.push(`### ${label} ${m.name || 'Sin nombre'}`);

  const details = [];
  if (m.username) details.push(`@${m.username}`);
  if (m.role) details.push(`Rol: ${m.role}`);
  if (m.level) details.push(`Nivel: ${m.level}`);
  if (m.tier) details.push(`Tier: ${m.tier}`);
  if (details.length) lines.push(details.join(' · '));

  if (m.joinedAt) {
    const mo = m.monthsInCommunity != null ? ` (hace ${m.monthsInCommunity} mes${m.monthsInCommunity === 1 ? '' : 'es'})` : '';
    lines.push(`- **Se unió**: ${_formatDate(m.joinedAt)}${mo}`);
  }
  if (m.subStatus === 'cancelling') {
    lines.push(`- **🔴 CANCELÓ — acceso activo${m.daysUntilCancel != null ? ` ${m.daysUntilCancel} días más` : ''}**: prioridad de retención`);
  } else if (m.subStatus === 'canceled') {
    lines.push(`- **⚫ Suscripción cancelada**`);
  }
  if (m.niche) lines.push(`- **Nicho**: ${m.niche}`);
  if (m.whatsapp) lines.push(`- **WhatsApp**: ${m.whatsapp}`);
  if (m.instagram) lines.push(`- **Instagram**: ${m.instagram}`);
  if (m.ltv != null) lines.push(`- **Valor (LTV)**: $${m.ltv}`);
  if (m.planPrice != null && m.planPrice !== m.ltv) {
    lines.push(`- **Plan**: ${typeof m.planPrice === 'number' ? '$' + m.planPrice : m.planPrice}`);
  }
  if (m.daysSinceLastPost !== null && m.daysSinceLastPost !== undefined) {
    lines.push(`- **Último post**: hace ${m.daysSinceLastPost} días`);
  } else if (m.lastSeenAt) {
    lines.push(`- **Última actividad**: ${_formatDate(m.lastSeenAt)}`);
  } else {
    lines.push(`- **Actividad**: sin datos aún (navega a su perfil en Skool para sincronizar)`);
  }

  if (m.postCount !== undefined && m.postCount !== null) {
    lines.push(`- **Posts totales**: ${m.postCount}`);
  }
  if (m.commentCount !== undefined && m.commentCount !== null) {
    lines.push(`- **Comentarios**: ${m.commentCount}`);
  }

  if (detailed && m.riskLevel === 'churned') {
    lines.push(`- **⚠️ Acción sugerida**: Email de reactivación + oferta de check-in 1:1`);
  }
  if (detailed && m.riskLevel === 'atRisk') {
    lines.push(`- **⚠️ Acción sugerida**: Mención directa en el próximo post o DM de Nicole`);
  }

  lines.push('');
  return lines.join('\n');
}

function _renderPost(post) {
  const lines = [];
  const timeAgo = post.createdAt ? _relativeTime(new Date(post.createdAt).getTime()) : '';
  const author = post.authorName || 'Miembro';

  lines.push(`### Post de **${author}** · ${timeAgo}`);

  if (post.likesCount > 0 || post.commentsCount > 0) {
    lines.push(`❤️ ${post.likesCount || 0} · 💬 ${post.commentsCount || 0} comentarios`);
  }

  if (post.content) {
    // Limitar contenido largo
    const preview = post.content.length > 400
      ? post.content.slice(0, 400) + '...'
      : post.content;
    lines.push('');
    lines.push('> ' + preview.replace(/\n/g, '\n> '));
  }

  lines.push('');
  return lines.join('\n');
}

// ── FORMATEO DE FECHAS ────────────────────────────────────

function _formatDate(dateStr) {
  if (!dateStr) return 'desconocido';
  try {
    return new Date(dateStr).toLocaleDateString('es-MX', {
      year: 'numeric', month: 'short', day: 'numeric',
    });
  } catch {
    return String(dateStr);
  }
}

function _relativeTime(ts) {
  if (!ts) return '';
  const diff = Date.now() - (typeof ts === 'number' ? ts : new Date(ts).getTime());
  const min = Math.floor(diff / 60000);
  const h = Math.floor(diff / 3600000);
  const d = Math.floor(diff / 86400000);

  if (min < 1) return 'justo ahora';
  if (min < 60) return `hace ${min} min`;
  if (h < 24) return `hace ${h}h`;
  if (d === 1) return 'ayer';
  if (d < 7) return `hace ${d} días`;
  if (d < 30) return `hace ${Math.floor(d / 7)} semanas`;
  if (d < 365) return `hace ${Math.floor(d / 30)} meses`;
  return `hace ${Math.floor(d / 365)} años`;
}

// Exponer en window para que popup.js lo use
if (typeof window !== 'undefined') {
  window.SkoopMdExport = { generateCommunityMd };
}
