import express from 'express';
import cors from 'cors';
import helmet from 'helmet';
import morgan from 'morgan';
import { config } from './config';
import { errorHandler } from './middleware/error-handler';

import { authRoutes } from './modules/auth/routes';
import { userRoutes } from './modules/users/routes';
import { schoolRoutes } from './modules/schools/routes';
import { studentRoutes } from './modules/students/routes';
import { parentRoutes } from './modules/parents/routes';
import { vehicleRoutes } from './modules/vehicles/routes';
import { driverRoutes } from './modules/drivers/routes';
import { routeRoutes } from './modules/routes/routes';
import { tripRoutes } from './modules/trips/routes';
import { gpsRoutes } from './modules/gps/routes';
import { geofenceRoutes } from './modules/geofence/routes';
import { rfidRoutes } from './modules/rfid/routes';
import { notificationRoutes } from './modules/notifications/routes';
import { ticketRoutes } from './modules/tickets/routes';
import { insuranceRoutes } from './modules/insurance/routes';
import { welcomeKitRoutes } from './modules/welcome-kits/routes';
import { reportRoutes } from './modules/reports/routes';
import { subscriptionRoutes } from './modules/subscriptions/routes';
import { auditLogRoutes } from './modules/audit-logs/routes';
import { parentAppRoutes } from './modules/parent-app/routes';
import { driverAppRoutes } from './modules/driver-app/routes';

const app = express();

app.use(helmet());
app.use(cors());
app.use(morgan(config.nodeEnv === 'production' ? 'combined' : 'dev'));
app.use(express.json({ limit: '10mb' }));
app.use(express.urlencoded({ extended: true }));

app.get('/health', (_req, res) => {
  res.json({
    success: true,
    message: 'SafeRoute API is running',
    data: {
      version: '1.0.0',
      environment: config.nodeEnv,
      timestamp: new Date().toISOString(),
    },
  });
});

const apiV1 = express.Router();

apiV1.use('/auth', authRoutes);
apiV1.use('/users', userRoutes);
apiV1.use('/roles', userRoutes);
apiV1.use('/schools', schoolRoutes);
apiV1.use('/students', studentRoutes);
apiV1.use('/guardians', parentRoutes);
apiV1.use('/vehicles', vehicleRoutes);
apiV1.use('/drivers', driverRoutes);
apiV1.use('/attendants', driverRoutes);
apiV1.use('/routes', routeRoutes);
apiV1.use('/route-stops', routeRoutes);
apiV1.use('/trips', tripRoutes);
apiV1.use('/gps', gpsRoutes);
apiV1.use('/geofence', geofenceRoutes);
apiV1.use('/geofences', geofenceRoutes);
apiV1.use('/rfid', rfidRoutes);
apiV1.use('/notifications', notificationRoutes);
apiV1.use('/tickets', ticketRoutes);
apiV1.use('/insurance', insuranceRoutes);
apiV1.use('/welcome-kits', welcomeKitRoutes);
apiV1.use('/welcome-kit-items', welcomeKitRoutes);
apiV1.use('/reports', reportRoutes);
apiV1.use('/subscriptions', subscriptionRoutes);
apiV1.use('/invoices', subscriptionRoutes);
apiV1.use('/payments', subscriptionRoutes);
apiV1.use('/audit-logs', auditLogRoutes);
apiV1.use('/parent', parentAppRoutes);
apiV1.use('/driver', driverAppRoutes);
apiV1.use('/attendant', driverAppRoutes);

app.use('/api/v1', apiV1);

app.use((_req, res) => {
  res.status(404).json({
    success: false,
    message: 'Endpoint not found',
    errorCode: 'RESOURCE_NOT_FOUND',
    details: {},
  });
});

app.use(errorHandler);

app.listen(config.port, () => {
  console.log(`SafeRoute Backend API v1.0.0`);
  console.log(`Port: ${config.port}`);
  console.log(`Env:  ${config.nodeEnv}`);
  console.log(`API:  http://localhost:${config.port}/api/v1/`);
});

export default app;
