import express, { Router } from 'express';
import cors from 'cors';
import helmet from 'helmet';
import pinoHttp from 'pino-http';

import { logger } from './logger';
import trackingRouter from './routes/tracking';
import campaignsRouter from './routes/campaigns';
import contactsRouter from './routes/contacts';
import listsRouter from './routes/lists';
import templatesRouter from './routes/templates';
import transactionalRouter from './routes/transactional';
import analyticsRouter from './routes/analytics';
import settingsRouter from './routes/settings';
import usersRouter from './routes/users';
import campaignEnrichmentRouter from './routes/campaignEnrichment';
import { errorHandler } from './middleware/errorHandler';
import { requireAuth } from './middleware/auth';
import { apiLimiter, trackLimiter } from './middleware/rateLimit';
import { startMailboxPoller } from './services/mailboxService';
import { recoverStuckSendingCampaigns } from './services/sendRecovery';
import { startSchedulePoller } from './services/schedulePoller';

/** JWT gate for /api/* (tracking stays public). usersRouter applies its own auth. */
function withAuth(r: Router) {
  const stack = Router();
  stack.use(requireAuth());
  stack.use(r);
  return stack;
}

const app = express();
const PORT = process.env.PORT || 3002;

app.set('trust proxy', true);

app.use(helmet({ contentSecurityPolicy: false }));
app.use(cors({ origin: '*' }));
app.use(pinoHttp({ logger }));
app.use(express.json({ limit: '10mb' }));
app.use(express.urlencoded({ extended: true }));

// Health check
app.get('/health', (_req, res) => res.json({ status: 'ok' }));

// Tracking routes — no /api prefix, no auth (rate-limited)
app.use('/track', trackLimiter, trackingRouter);

// API routes (PRD: authenticated product APIs)
app.use('/api', apiLimiter);
const campaignsStack = Router();
campaignsStack.use(requireAuth());
campaignsStack.use(campaignsRouter);
campaignsStack.use(campaignEnrichmentRouter);
app.use('/api/campaigns', campaignsStack);

app.use('/api/contacts', withAuth(contactsRouter));
app.use('/api/lists', withAuth(listsRouter));
app.use('/api/templates', withAuth(templatesRouter));
app.use('/api/transactional', withAuth(transactionalRouter));
app.use('/api/analytics', withAuth(analyticsRouter));
app.use('/api/settings', withAuth(settingsRouter));
app.use('/api/users', usersRouter);

app.use(errorHandler);

app.listen(PORT, () => {
  logger.info({ port: PORT }, 'Email Campaigner API listening');
  recoverStuckSendingCampaigns().catch(e => logger.error(e, 'recoverStuckSendingCampaigns'));
  startMailboxPoller();
  startSchedulePoller();
});

export default app;
