import { Router } from 'express';
import { spawn } from 'child_process';
import path from 'path';
import { SystemRole } from '@prisma/client';
import { config } from '../config';
import { forbidden } from '../lib/errors';
import { AuthedRequest, requireAuth } from '../middleware/auth';

export const adminRouter = Router();
adminRouter.use(requireAuth);

adminRouter.post('/reset-demo', async (req: AuthedRequest, res, next) => {
  try {
    if (!config.isDev) {
      throw forbidden('Demo reset is disabled in production');
    }
    if (req.user!.role !== SystemRole.SuperAdmin) {
      throw forbidden('Super Admin only');
    }

    const seedScript = path.resolve(__dirname, '../../prisma/seed.ts');
    const cwd = path.resolve(__dirname, '../..');

    await new Promise<void>((resolve, reject) => {
      const child = spawn('npx', ['tsx', seedScript], {
        cwd,
        env: process.env,
        stdio: ['ignore', 'pipe', 'pipe'],
      });
      let stderr = '';
      child.stderr.on('data', (chunk) => {
        stderr += String(chunk);
      });
      child.on('error', reject);
      child.on('close', (code) => {
        if (code === 0) resolve();
        else reject(new Error('Seed failed: ' + (stderr.slice(0, 500) || `exit ${code}`)));
      });
    });

    res.json({ ok: true, message: 'Demo data reset' });
  } catch (err) {
    next(err);
  }
});
