import { Router, Request, Response } from 'express';
import { AccountsService } from './accounts.service';
import { GracePeriodService } from '../billing/grace.service';
import { InvoicePdfService } from '../billing/invoice-pdf.service';

const router = Router();

// GET /api/accounts/summary - Profit & Loss statement & expense breakdown
router.get('/accounts/summary', (req: Request, res: Response) => {
  res.json({ success: true, data: AccountsService.getFinancialSummary() });
});

// POST /api/accounts/expenses - Add operating expense
router.post('/accounts/expenses', (req: Request, res: Response) => {
  try {
    const { category, title, amount, paid_to, payment_method, expense_date } = req.body;
    if (!category || !title || !amount) {
      return res.status(400).json({ success: false, message: 'category, title, and amount required' });
    }
    const expense = AccountsService.addExpense({ category, title, amount, paid_to, payment_method, expense_date });
    res.json({ success: true, message: 'Expense recorded successfully.', data: expense });
  } catch (err: any) {
    res.status(500).json({ success: false, message: err.message });
  }
});

// POST /api/accounts/collector-cash - Record collector cash collection
router.post('/accounts/collector-cash', (req: Request, res: Response) => {
  try {
    const { subscriber_username, amount, collector_name } = req.body;
    const payment = AccountsService.recordCollectorCash({
      subscriberUsername: subscriber_username,
      amount: Number(amount),
      collectorName: collector_name || 'Field Collector'
    });
    res.json({ success: true, message: 'Cash collection recorded.', data: payment });
  } catch (err: any) {
    res.status(500).json({ success: false, message: err.message });
  }
});

// POST /api/subscribers/:username/grace-period - Grant 48-Hour Emergency Grace Extension
router.post('/subscribers/:username/grace-period', async (req: Request, res: Response) => {
  try {
    const { hours = 48 } = req.body;
    const result = await GracePeriodService.grantGracePeriod(req.params.username, Number(hours));
    res.json(result);
  } catch (err: any) {
    res.status(500).json({ success: false, message: err.message });
  }
});

// GET /api/invoices/:invoice_no/print - Render printable Tax Invoice HTML
router.get('/invoices/:invoice_no/print', (req: Request, res: Response) => {
  try {
    const html = InvoicePdfService.generatePrintableInvoiceHtml(req.params.invoice_no);
    res.setHeader('Content-Type', 'text/html');
    res.send(html);
  } catch (err: any) {
    res.status(404).send(`<h1>Invoice not found</h1><p>${err.message}</p>`);
  }
});

export const accountsRouter = router;
