import express from 'express';
import cors from 'cors';
import helmet from 'helmet';
import morgan from 'morgan';
import path from 'path';
import fs from 'fs';
import { config } from './config';
import { errorHandler } from './middleware/errorHandler';
import { authRouter } from './routes/auth';
import { employeesRouter } from './routes/employees';
import { clientsRouter } from './routes/clients';
import { projectsRouter } from './routes/projects';
import { directoryRouter } from './routes/directory';
import { tasksRouter } from './routes/tasks';
import { bugsRouter } from './routes/bugs';
import { attachmentsRouter } from './routes/attachments';
import { timesheetsRouter } from './routes/timesheets';
import { timerRouter } from './routes/timer';
import { leaveRouter } from './routes/leave';
import { notificationsRouter } from './routes/notifications';
import { reportsRouter } from './routes/reports';
import { adminRouter } from './routes/admin';
import { activitiesRouter } from './routes/activities';

export function createApp() {
  const app = express();
  const webDir = path.join(__dirname, '../web');

  fs.mkdirSync(config.uploadDir, { recursive: true });

  app.use(helmet({ contentSecurityPolicy: false }));
  app.use(
    cors({
      origin: config.corsOrigin,
      credentials: true,
    })
  );
  app.use(express.json({ limit: '2mb' }));
  app.use(morgan(config.isDev ? 'dev' : 'combined'));

  app.get('/api/health', (_req, res) => {
    res.json({
      ok: true,
      service: 'zpt-server',
      env: config.nodeEnv,
    });
  });

  app.use('/api/auth', authRouter);
  app.use('/api/employees', employeesRouter);
  app.use('/api/clients', clientsRouter);
  app.use('/api/projects', projectsRouter);
  app.use('/api/tasks', tasksRouter);
  app.use('/api/bugs', bugsRouter);
  app.use('/api/attachments', attachmentsRouter);
  app.use('/api/timesheets', timesheetsRouter);
  app.use('/api/timer', timerRouter);
  app.use('/api/leave', leaveRouter);
  app.use('/api/notifications', notificationsRouter);
  app.use('/api/reports', reportsRouter);
  app.use('/api/admin', adminRouter);
  app.use('/api/directory', directoryRouter);
  app.use('/api/activities', activitiesRouter);

  // Avoid stale JS/CSS in the browser during active UI work
  if (config.isDev) {
    app.use((req, res, next) => {
      if (
        req.path.startsWith('/js/') ||
        req.path.startsWith('/css/') ||
        req.path.startsWith('/assets/') ||
        req.path === '/' ||
        req.path.endsWith('.html')
      ) {
        res.setHeader('Cache-Control', 'no-store, no-cache, must-revalidate');
        res.setHeader('Pragma', 'no-cache');
      }
      next();
    });
  }

  // Product UI: server/web (index.html, js/, css/, assets/)
  if (fs.existsSync(webDir)) {
    app.use(express.static(webDir));
    // SPA fallback (Express 5 path-to-regexp — no bare "*")
    app.use((req, res, next) => {
      if (req.method !== 'GET' && req.method !== 'HEAD') return next();
      if (req.path.startsWith('/api/')) return next();
      if (
        req.path.startsWith('/css/') ||
        req.path.startsWith('/assets/') ||
        req.path.startsWith('/js/')
      ) {
        return next();
      }
      res.sendFile(path.join(webDir, 'index.html'));
    });
  }

  app.use(errorHandler);
  return app;
}
