import { Router } from 'express';
import { AuthedRequest, requireAuth } from '../middleware/auth';
import {
  buildDashboard,
  buildMyWork,
  buildDeadlineTracking,
  buildReportRows,
  rowsToCsv,
  ReportFilters,
} from '../services/reports';
import { badRequest } from '../lib/errors';

export const reportsRouter = Router();
reportsRouter.use(requireAuth);

const REPORT_TYPES = new Set([
  'project',
  'employee',
  'task',
  'bug',
  'overbudget',
  'daily',
  'transitions',
  'qa',
]);

function filtersFromQuery(q: AuthedRequest['query']): ReportFilters {
  return {
    from: q.from ? String(q.from) : undefined,
    to: q.to ? String(q.to) : undefined,
    projectId: q.projectId ? String(q.projectId) : undefined,
    clientId: q.clientId ? String(q.clientId) : undefined,
    employeeId: q.employeeId ? String(q.employeeId) : undefined,
    billingType: q.billingType ? String(q.billingType) : undefined,
  };
}

reportsRouter.get('/dashboard', async (req: AuthedRequest, res, next) => {
  try {
    const data = await buildDashboard(req.user!);
    res.json(data);
  } catch (err) {
    next(err);
  }
});

reportsRouter.get('/my-work', async (req: AuthedRequest, res, next) => {
  try {
    const data = await buildMyWork(req.user!);
    res.json(data);
  } catch (err) {
    next(err);
  }
});

reportsRouter.get('/deadlines', async (req: AuthedRequest, res, next) => {
  try {
    const data = await buildDeadlineTracking(req.user!);
    res.json(data);
  } catch (err) {
    next(err);
  }
});

reportsRouter.get('/:type', async (req: AuthedRequest, res, next) => {
  try {
    const type = String(req.params.type || '');
    if (!REPORT_TYPES.has(type)) throw badRequest('Unknown report type');
    const filters = filtersFromQuery(req.query);
    if (!filters.from) filters.from = undefined;
    if (!filters.to) filters.to = undefined;
    // Defaults for date-scoped reports when omitted
    if ((type === 'project' || type === 'employee' || type === 'daily') && !filters.from) {
      const d = new Date();
      d.setDate(d.getDate() - 30);
      filters.from = d.toISOString().slice(0, 10);
    }
    if ((type === 'project' || type === 'employee' || type === 'daily') && !filters.to) {
      filters.to = new Date().toISOString().slice(0, 10);
    }

    const rows = await buildReportRows(type, req.user!, filters);
    if (String(req.query.format || '') === 'csv') {
      const csv = rowsToCsv(rows);
      res.setHeader('Content-Type', 'text/csv; charset=utf-8');
      res.setHeader(
        'Content-Disposition',
        `attachment; filename="${type}-report.csv"`
      );
      return res.send(csv);
    }
    res.json({ type, rows, filters });
  } catch (err) {
    next(err);
  }
});
