import express, { Request, Response } from 'express';
import cors from 'cors';
import dotenv from 'dotenv';
import routes from './routes';
import { createServer } from 'http';
import { WebSocketService } from './services/WebSocketService';
import { connectDatabase } from './config/database';

dotenv.config();

const app = express();
// const port = process.env.PORT || 3000;

const httpServer = createServer(app);

// Initialize WebSocket service
WebSocketService.initialize(httpServer);

// Middleware
app.use(cors({
  origin: ['https://dev.trackex.co', 'https://dev-api.trackex.co', 'https://app.trackex.co', 'http://localhost:3000'],
  credentials: true,
  methods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS', 'PATCH'],
  allowedHeaders: ['Content-Type', 'Authorization', 'X-Requested-With', 'Accept', 'Origin'],
  exposedHeaders: ['Content-Length', 'X-Requested-With'],
  optionsSuccessStatus: 204,
  preflightContinue: false
}));
app.use(express.json());
app.use(express.urlencoded({ extended: true }));

// API Routes
app.use('/api/v1', routes);

// Health check endpoint
app.get('/health', (req: Request, res: Response) => {
  res.json({ status: 'OK', timestamp: new Date() });
});

// Handle 404 routes
app.use((req: Request, res: Response) => {
  res.status(404).json({ message: 'Route not found' });
});

// app.listen(port, () => {
//   console.log(`Server is running on port ${port}`);
//   console.log(`API is available at http://localhost:${port}/api/v1`);
// });

const port = process.env.PORT || 3000;
httpServer.listen(port, async () => {
  try {
    await connectDatabase();
    console.log(`Server is running on port ${port}`);
    console.log(`API is available at http://localhost:${port}/api/v1`);
  } catch (error) {
    console.error('Server startup failed:', error);
    process.exit(1); // Exit if database connection fails
  }
});

export default app;