import express from 'express';
import session from 'express-session';
import helmet from 'helmet';
import { rateLimit } from 'express-rate-limit';
import { resolve } from 'node:path';
import { env } from '../config/env.js';
import { SQLiteSessionStore } from '../database/session-store.js';
import { authRouter } from './routes/auth.js';
import { dashboardRouter } from './routes/dashboard.js';

export function createWebServer() {
  const app = express();
  app.set('trust proxy', 1);
  app.set('view engine', 'ejs');
  app.set('views', resolve('src/web/views'));

  app.use(helmet({ contentSecurityPolicy: false }));
  app.use(rateLimit({ windowMs: 60_000, limit: 180, standardHeaders: 'draft-8', legacyHeaders: false }));
  app.use(express.urlencoded({ extended: false, limit: '64kb' }));
  app.use(express.json({ limit: '64kb' }));
  app.use(session({
    name: 'vxbot.sid',
    store: new SQLiteSessionStore(),
    secret: env.SESSION_SECRET,
    resave: false,
    saveUninitialized: false,
    cookie: {
      httpOnly: true,
      sameSite: 'lax',
      secure: env.IS_PRODUCTION,
      maxAge: 7 * 24 * 60 * 60 * 1000,
      path: env.BASE_PATH || '/'
    }
  }));

  app.use(`${env.BASE_PATH}/assets`, express.static(resolve('src/web/public'), { maxAge: env.IS_PRODUCTION ? '7d' : 0 }));
  app.get('/', (_req, res) => res.redirect(`${env.BASE_PATH}/dashboard`));
  app.get(env.BASE_PATH || '/', (_req, res) => res.redirect(`${env.BASE_PATH}/dashboard`));
  app.use(env.BASE_PATH, authRouter);
  app.use(env.BASE_PATH, dashboardRouter);

  app.use((error: unknown, req: express.Request, res: express.Response, _next: express.NextFunction) => {
    console.error(error);
    const message = error instanceof Error ? error.message : 'Erreur inattendue.';
    res.status(500).render('error', {
      basePath: env.BASE_PATH,
      message: env.IS_PRODUCTION ? 'Une erreur est survenue. Consulte les journaux de VX BOT.' : message
    });
  });

  return app;
}

export function startWebServer() {
  const app = createWebServer();
  return app.listen(env.PORT, '127.0.0.1', () => {
    console.log(`Panneau VX BOT : http://127.0.0.1:${env.PORT}${env.BASE_PATH}`);
  });
}
