import { Router, Request } from 'express';
import pool from '../db';

const router = Router();

// GET /api/analytics/overview — time-series data
router.get('/overview', async (req: Request, res) => {
  try {
    const days = Math.min(90, parseInt(req.query.days as string) || 30);

    const [messagesOverTime, activeUsers, tokenUsage] = await Promise.all([
      // Messages per day by agent
      pool.query(`
        SELECT DATE(m.timestamp) as day, s.agent, COUNT(*) as count
        FROM crm_messages m
        JOIN crm_sessions s ON m.session_id = s.id
        WHERE m.timestamp > NOW() - INTERVAL '${days} days'
          AND m.content_type = 'text'
        GROUP BY DATE(m.timestamp), s.agent
        ORDER BY day
      `),
      // Active users per day
      pool.query(`
        SELECT DATE(m.timestamp) as day, COUNT(DISTINCT m.contact_id) as count
        FROM crm_messages m
        WHERE m.timestamp > NOW() - INTERVAL '${days} days'
          AND m.role = 'user'
          AND m.contact_id IS NOT NULL
        GROUP BY DATE(m.timestamp)
        ORDER BY day
      `),
      // Token usage per day by agent
      pool.query(`
        SELECT DATE(m.timestamp) as day, s.agent,
          COALESCE(SUM(m.tokens), 0) as tokens
        FROM crm_messages m
        JOIN crm_sessions s ON m.session_id = s.id
        WHERE m.timestamp > NOW() - INTERVAL '${days} days'
          AND m.tokens > 0
        GROUP BY DATE(m.timestamp), s.agent
        ORDER BY day
      `),
    ]);

    res.json({
      messagesOverTime: messagesOverTime.rows,
      activeUsers: activeUsers.rows,
      tokenUsage: tokenUsage.rows,
      days,
    });
  } catch (err: any) {
    console.error('Analytics overview error:', err);
    res.status(500).json({ error: err.message });
  }
});

// GET /api/analytics/agents — per-agent breakdown
router.get('/agents', async (_req, res) => {
  try {
    const result = await pool.query(`
      SELECT s.agent,
        COUNT(DISTINCT s.contact_id) as unique_contacts,
        COUNT(DISTINCT s.id) as total_sessions,
        (SELECT COUNT(*) FROM crm_messages m WHERE m.session_id = ANY(array_agg(s.id)) AND m.content_type = 'text') as total_messages,
        COALESCE(SUM(s.total_tokens), 0) as total_tokens,
        COALESCE(SUM(s.input_tokens), 0) as input_tokens,
        COALESCE(SUM(s.output_tokens), 0) as output_tokens,
        MAX(s.last_activity) as last_activity,
        MIN(s.started_at) as first_activity
      FROM crm_sessions s
      GROUP BY s.agent
      ORDER BY s.agent
    `);

    // Top contacts by message volume
    const topContacts = await pool.query(`
      SELECT c.id, c.display_name, c.username, c.telegram_id,
        COUNT(*) FILTER (WHERE m.content_type = 'text') as message_count,
        array_agg(DISTINCT s.agent) as agents
      FROM crm_contacts c
      JOIN crm_messages m ON m.contact_id = c.id
      JOIN crm_sessions s ON m.session_id = s.id
      GROUP BY c.id
      ORDER BY message_count DESC
      LIMIT 10
    `);

    res.json({
      agents: result.rows,
      topContacts: topContacts.rows,
    });
  } catch (err: any) {
    console.error('Analytics agents error:', err);
    res.status(500).json({ error: err.message });
  }
});

export default router;
