import express, { Request, Response, NextFunction } from 'express';
import cors from 'cors';
import helmet from 'helmet';
import cookieParser from 'cookie-parser';
import 'reflect-metadata';
import env from './config/env';
import { initializeDatabase } from './config/database';
import linkRoutes from './routes/linkRoutes';
import bannerRoutes from './routes/bannerRoutes';
import socialRoutes from './routes/socialRoutes';
import trackingRoutes from './routes/trackingRoutes';
import youtubeRoutes from './routes/youtubeRoutes';

// Adicione esta linha após importar as variáveis de ambiente
const baseUrl = process.env.BASE_URL || '';

// E modifique as rotas para incluir a base URL
app.use(`${baseUrl}/api/links`, linkRoutes) ;
app.use(`${baseUrl}/api/banners`, bannerRoutes);
app.use(`${baseUrl}/api/socials`, socialRoutes);
app.use(`${baseUrl}/api/tracking`, trackingRoutes);
app.use(`${baseUrl}/api/youtube`, youtubeRoutes);

// Adicione uma rota para a página principal
app.get(`${baseUrl}/`, (_req, res) => {
  res.send('API do Sistema de Rastreamento está funcionando!');
});

// Inicializar o aplicativo Express
const app = express();

// Middleware para parsing de JSON e cookies
app.use(express.json());
app.use(express.urlencoded({ extended: true }));
app.use(cookieParser());

// Middleware de segurança
app.use(helmet());
app.use(cors());

// Middleware para logging de requisições
app.use((req: Request, _res: Response, next: NextFunction) => {
  console.log(`[${new Date().toISOString()}] ${req.method} ${req.url}`);
  next();
});

// Rotas da API
app.use('/api/links', linkRoutes);
app.use('/api/banners', bannerRoutes);
app.use('/api/socials', socialRoutes);
app.use('/api/tracking', trackingRoutes);
app.use('/api/youtube', youtubeRoutes);

// Rota de status da API
app.get('/api/status', (_req: Request, res: Response) => {
  res.json({
    status: 'online',
    version: '1.0.0',
    timestamp: new Date().toISOString()
  });
});

// Middleware para tratamento de erros
app.use((err: Error, _req: Request, res: Response, _next: NextFunction) => {
  console.error('Erro na aplicação:', err);
  res.status(500).json({
    success: false,
    message: env.DEBUG_MODE ? err.message : 'Erro interno do servidor'
  });
});

// Middleware para rotas não encontradas
app.use((_req: Request, res: Response) => {
  res.status(404).json({
    success: false,
    message: 'Rota não encontrada'
  });
});

// Inicializar o banco de dados e iniciar o servidor
const startServer = async () => {
  try {
    // Inicializar conexão com o banco de dados
    await initializeDatabase();
    
    // Iniciar o servidor
    app.listen(env.PORT, () => {
      console.log(`Servidor rodando na porta ${env.PORT}`);
      console.log(`Ambiente: ${env.NODE_ENV}`);
    });
  } catch (error) {
    console.error('Erro ao iniciar o servidor:', error);
    process.exit(1);
  }
};

// Iniciar o servidor
startServer();
