import { Router, Request, Response } from 'express';
import { db, SupportTicket } from '../../database/db';

const router = Router();

// GET /api/tickets - List support tickets
router.get('/', (req: Request, res: Response) => {
  const { subscriber_id, reseller_id, status, severity, category } = req.query;

  let tickets = [...db.support_tickets];

  if (subscriber_id) {
    tickets = tickets.filter(t => t.subscriber_id === subscriber_id);
  }
  if (reseller_id) {
    tickets = tickets.filter(t => t.reseller_id === reseller_id);
  }
  if (status) {
    tickets = tickets.filter(t => t.status === status);
  }
  if (severity) {
    tickets = tickets.filter(t => t.severity === severity);
  }
  if (category) {
    tickets = tickets.filter(t => t.category === category);
  }

  const enriched = tickets.map(t => {
    const sub = db.subscribers.find(s => s.id === t.subscriber_id);
    const onu = sub?.onu_id ? db.onus.find(o => o.id === sub.onu_id) : undefined;
    return {
      ...t,
      subscriber_name: sub?.full_name,
      subscriber_username: sub?.username,
      subscriber_phone: sub?.phone,
      subscriber_address: sub?.address,
      onu_rx_power: onu?.rx_power_dbm,
      onu_laser_status: onu?.laser_status
    };
  });

  res.json({ success: true, count: enriched.length, data: enriched });
});

// POST /api/tickets - Create a new support ticket
router.post('/', (req: Request, res: Response) => {
  const { subscriber_id, title, category, description, severity = 'medium' } = req.body;

  if (!subscriber_id || !title || !description) {
    return res.status(400).json({ success: false, message: 'subscriber_id, title, and description required' });
  }

  const sub = db.subscribers.find(s => s.id === subscriber_id || s.username === subscriber_id);
  if (!sub) {
    return res.status(404).json({ success: false, message: 'Subscriber not found' });
  }

  const ticket: SupportTicket = {
    id: `tick_${Date.now()}_${Math.random().toString(36).substring(2, 6)}`,
    ticket_no: `TCK-${Date.now().toString().slice(-4)}`,
    tenant_id: sub.tenant_id,
    reseller_id: sub.reseller_id,
    subscriber_id: sub.id,
    title,
    category: category || 'General',
    severity: severity as any,
    status: 'open',
    description,
    assigned_to: 'NOC Support Queue',
    created_at: new Date().toISOString(),
    updated_at: new Date().toISOString()
  };

  db.support_tickets.unshift(ticket);
  db.logAudit('SUBSCRIBER', sub.id, 'SUPPORT_TICKET_SUBMITTED', {
    ticketId: ticket.id,
    category: ticket.category,
    title: ticket.title
  });

  db.persist();

  res.status(201).json({
    success: true,
    message: 'Support ticket submitted to sub-ISP service queue.',
    data: ticket
  });
});

// PATCH /api/tickets/:id - Update ticket status / resolution
router.patch('/:id', (req: Request, res: Response) => {
  const ticket = db.support_tickets.find(t => t.id === req.params.id);
  if (!ticket) {
    return res.status(404).json({ success: false, message: 'Ticket not found' });
  }

  const { status, assigned_to } = req.body;
  if (status) ticket.status = status;
  if (assigned_to) ticket.assigned_to = assigned_to;
  ticket.updated_at = new Date().toISOString();

  db.logAudit('SYSTEM', 'TICKET_SYSTEM', 'TICKET_UPDATED', { ticketId: ticket.id, status, assigned_to });
  db.persist();

  res.json({ success: true, message: 'Ticket updated successfully', data: ticket });
});

export const ticketRouter = router;
