import { Router, Request, Response } from 'express';
import { db } from '../../database/db';
import { DisconnectionWorker } from './disconnection.worker';
import { LaserScraperWorker } from './laser-scraper.worker';

const router = Router();

// POST /api/workers/trigger-disconnection - Immediate run of 5m Disconnection scan
router.post('/trigger-disconnection', async (req: Request, res: Response) => {
  try {
    const report = await DisconnectionWorker.executeScan();
    res.json({
      success: true,
      message: `Automated Disconnection Scan executed. Scanned ${report.subscribersScanned}, disconnected ${report.expiredCount} expired subscribers to walled-garden.`,
      report
    });
  } catch (err: any) {
    res.status(500).json({ success: false, message: err.message });
  }
});

// POST /api/workers/trigger-laser-scraper - Immediate run of 15m Laser Scraper
router.post('/trigger-laser-scraper', async (req: Request, res: Response) => {
  try {
    const results = await LaserScraperWorker.executeScan();
    res.json({
      success: true,
      message: `Laser Scraper executed across all OLTs. Polled ${results.length} ONUs.`,
      results
    });
  } catch (err: any) {
    res.status(500).json({ success: false, message: err.message });
  }
});

// GET /api/workers/stats - High-level metrics for dashboard header
router.get('/stats', (req: Request, res: Response) => {
  const totalSubscribers = db.subscribers.length;
  const activeSubscribers = db.subscribers.filter(s => s.status === 'active').length;
  const expiredSubscribers = db.subscribers.filter(s => s.status === 'expired').length;
  const suspendedSubscribers = db.subscribers.filter(s => s.status === 'suspended').length;
  const totalOlts = db.olts.length;
  const onlineOlts = db.olts.filter(o => o.status === 'online').length;
  const totalOnus = db.onus.length;
  const healthyOnus = db.onus.filter(o => o.laser_status === 'healthy').length;
  const warningOnus = db.onus.filter(o => o.laser_status === 'warning').length;
  const criticalOnus = db.onus.filter(o => o.laser_status === 'critical_fault').length;
  const unregisteredOnus = db.onus.filter(o => !o.is_registered || !o.subscriber_id).length;
  const totalInvoices = db.invoices.length;
  const totalRevenue = db.payments.reduce((sum, p) => sum + p.amount, 0);
  const openTickets = db.support_tickets.filter(t => t.status === 'open').length;

  res.json({
    success: true,
    data: {
      subscribers: {
        total: totalSubscribers,
        active: activeSubscribers,
        expired: expiredSubscribers,
        suspended: suspendedSubscribers
      },
      olts: {
        total: totalOlts,
        online: onlineOlts
      },
      onus: {
        total: totalOnus,
        healthy: healthyOnus,
        warning: warningOnus,
        critical: criticalOnus,
        unregistered: unregisteredOnus
      },
      finances: {
        totalInvoices,
        totalRevenueBDT: totalRevenue
      },
      tickets: {
        open: openTickets
      }
    }
  });
});

// GET /api/workers/audit-logs - Real-time audit logs stream
router.get('/audit-logs', (req: Request, res: Response) => {
  res.json({
    success: true,
    count: db.audit_logs.length,
    data: db.audit_logs.slice(0, 50)
  });
});

export const workerRouter = router;
