import express from 'express';
import cors from 'cors';
import helmet from 'helmet';
import path from 'path';
import { createServer } from 'http';
import { Server } from 'socket.io';
import authRoutes from './routes/auth.routes';
import eventRoutes from './routes/events.routes';
import attendeeRoutes from './routes/attendees.routes';
import scannerRoutes from './routes/scanner.routes';
import categoryRoutes from './routes/categories.routes';
import emailRoutes from './routes/email.routes';
import galleryRoutes from './routes/gallery.routes';
import documentRoutes from './routes/documents.routes';
import rsvpRoutes from './routes/rsvp.routes';
import paymentRoutes from './routes/payment.routes';
import checkpointRoutes from './routes/checkpoints.routes';
import superAdminRoutes from './routes/super-admin.routes';
import notificationsRoutes from './routes/notifications.routes';
import { errorHandler } from './middleware/errorHandler';
import { autoSyncAllSheets } from './controllers/google-sheet-sync.controller';
import { fireBefore24hReminders } from './utils/email-triggers';

const app = express();
const httpServer = createServer(app);

const corsOrigin = process.env.FRONTEND_URL === '*' ? true : (process.env.FRONTEND_URL || 'http://localhost:3000');

export const io = new Server(httpServer, {
  cors: { origin: corsOrigin, credentials: true },
});

app.use(helmet({ crossOriginResourcePolicy: { policy: 'cross-origin' } }));
app.use(cors({ origin: corsOrigin, credentials: true }));
app.use(express.json({ limit: '50mb' }));
app.use(express.urlencoded({ limit: '50mb', extended: true }));

// Serve uploaded files
app.use('/uploads', express.static(path.join(__dirname, '..', 'uploads')));

// Routes
app.use('/api/auth', authRoutes);
app.use('/api/events', eventRoutes);
app.use('/api', attendeeRoutes);
app.use('/api/scanner', scannerRoutes);
app.use('/api', categoryRoutes);
app.use('/api', emailRoutes);
app.use('/api', galleryRoutes);
app.use('/api', documentRoutes);
app.use('/api/payment', paymentRoutes);
app.use('/api', checkpointRoutes);
app.use('/api/rsvp', rsvpRoutes);
app.use('/api/super-admin', superAdminRoutes);
app.use('/api/notifications', notificationsRoutes);

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

app.use(errorHandler);

// Socket.io
io.on('connection', (socket) => {
  socket.on('join', (room: string) => {
    socket.join(room);
  });
  socket.on('leave', (room: string) => {
    socket.leave(room);
  });
});

const PORT = process.env.PORT || 4000;
httpServer.listen(PORT, () => {
  console.log(`API running on port ${PORT}`);

  // Auto-sync Google Sheets every 1 minute
  const SYNC_INTERVAL = 1 * 60 * 1000;
  setInterval(() => {
    autoSyncAllSheets().catch((err) => console.error('[Auto-Sync] Unhandled error:', err));
  }, SYNC_INTERVAL);
  console.log(`Google Sheet auto-sync enabled (every 1 minute)`);

  // 24h reminder check every 30 minutes
  const REMINDER_INTERVAL = 30 * 60 * 1000;
  setInterval(() => {
    fireBefore24hReminders().catch((err) => console.error('[24h Reminder] Unhandled error:', err));
  }, REMINDER_INTERVAL);
  console.log(`24h email reminders enabled (checked every 30 minutes)`);
});
