/**
 * Social Engine — API Routes
 * Public endpoints for the social feed, personas, trends, and stats.
 */
import { Router, Request, Response } from 'express';
import pool from '../db';
import {
  getPostedContent,
  getPostedContentCount,
  getActivePersonas,
  getTopTrends,
  getPersonaStatsAgg,
} from '../workers/social-engine/data-queries';

const router = Router();

// GET /api/social/feed — Posted social content for the website
router.get('/feed', async (req: Request, res: Response) => {
  try {
    const limit = Math.min(parseInt(req.query.limit as string) || 20, 50);
    const page = Math.max(parseInt(req.query.page as string) || 1, 1);
    const offset = (page - 1) * limit;
    const persona = (req.query.persona as string) || undefined;
    const sport = (req.query.sport as string) || undefined;
    const includePreview = (req.query.include_preview as string) === 'true';
    const includeReplies = (req.query.include_replies as string) === 'true';

    let effectiveIncludePreview = includePreview;

    if (!effectiveIncludePreview) {
      const params: any[] = [];
      let idx = 1;
      let recentWhere = `status = 'posted' AND posted_at > NOW() - INTERVAL '24 hours'`;

      if (persona) {
        recentWhere += ` AND persona_id IN (SELECT id FROM rm_social_personas WHERE slug = $${idx})`;
        params.push(persona);
        idx++;
      }
      if (sport) {
        recentWhere += ` AND sport = $${idx}`;
        params.push(sport);
        idx++;
      }

      const { rows } = await pool.query(
        `SELECT COUNT(*)::int AS cnt FROM rm_social_content WHERE ${recentWhere}`,
        params
      );

      if ((rows[0]?.cnt || 0) === 0) {
        effectiveIncludePreview = true;
      }
    }

    const [items, total] = await Promise.all([
      getPostedContent(limit, offset, persona, sport, { includePreview: effectiveIncludePreview, includeReplies }),
      getPostedContentCount(persona, sport, { includePreview: effectiveIncludePreview, includeReplies }),
    ]);

    res.json({
      data: items,
      feed_mode: effectiveIncludePreview ? 'preview' : 'posted',
      pagination: {
        page,
        limit,
        total,
        pages: Math.ceil(total / limit),
      },
    });
  } catch (err: any) {
    console.error('[social-api] Feed error:', err.message);
    res.status(500).json({ error: 'Failed to fetch social feed' });
  }
});

// GET /api/social/personas — Active persona configs with daily stats
router.get('/personas', async (_req: Request, res: Response) => {
  try {
    const personas = await getActivePersonas();
    res.json({ data: personas });
  } catch (err: any) {
    console.error('[social-api] Personas error:', err.message);
    res.status(500).json({ error: 'Failed to fetch personas' });
  }
});

// GET /api/social/trending — Top active trends by heat score
router.get('/trending', async (req: Request, res: Response) => {
  try {
    const limit = Math.min(parseInt(req.query.limit as string) || 10, 25);
    const trends = await getTopTrends(limit);
    res.json({ data: trends });
  } catch (err: any) {
    console.error('[social-api] Trending error:', err.message);
    res.status(500).json({ error: 'Failed to fetch trends' });
  }
});

// GET /api/social/stats — Persona performance aggregates
router.get('/stats', async (req: Request, res: Response) => {
  try {
    const days = Math.min(parseInt(req.query.days as string) || 7, 90);
    const stats = await getPersonaStatsAgg(days);
    res.json({ data: stats });
  } catch (err: any) {
    console.error('[social-api] Stats error:', err.message);
    res.status(500).json({ error: 'Failed to fetch stats' });
  }
});

export default router;
