import express from "express";
import path from "path";
import createError from "http-errors";
import logger from "morgan";
import mongoose from "mongoose";
import helmet from "helmet";
import rateLimit from 'express-rate-limit';
//import cookieParser from "cookie-parser";
import { fileURLToPath } from "url";
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);

// komponenty aplikacji - baza danych
import connectDB from "./db/mongoose.js";
// Połączenie z bazą danych
connectDB();

// routery
import indexRouter from "./routes/index.js";
import apiRouter from "./routes/api.js";

// Instancja Express
const app = express();
const PORT = 3001;
const HOST = "127.0.0.1"; // tylko lokalnie
app.listen(PORT, HOST, () => {
  console.log(`Serwer działa na http://${HOST}:${PORT}`);
});

// Zabezpieczenia, nagłówki HTTP, limitowanie zapytań
app.use(helmet());
const limiter = rateLimit({
  windowMs: 10 * 60 * 1000, // 10 minut
  max: 12000 // limit dla IP do 1200 requests przez windowMs
});
app.use(limiter);

// Middleware z Express
app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
//app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

// Routery aplikacji
app.use('/', indexRouter);
app.use('/', apiRouter);

// System szablonów, widoki
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');

app.use(function(req, res, next) {
  next(createError(404));  // Obługa 404 - nie znaleziono strony
});

// Aktywacja schedulera do pobierania danych
import startDataFetcher from "./services/sheduler.js";
startDataFetcher();

// error handler
app.use(function(err, req, res, next) {
  // ustawia locals, dostępne w szablonach widoków, tylko w trybie development
  res.locals.message = err.message;
  res.locals.error = req.app.get('env') === 'development' ? err : {};

  // renderuje stronę błędu
  res.status(err.status || 500);
  res.render('error');
});

export default app;

