import { Router, Response } from 'express';
import { authenticate, AuthRequest } from '../middleware/auth';
import { requireRole } from '../middleware/requireRole';
import { validate } from '../middleware/validate';
import { CreateUserSchema, UpdateUserSchema } from '@nobel/shared';
import { hashPassword } from '../services/auth.service';
import prisma from '../lib/prisma';

const router = Router();
router.use(authenticate, requireRole('admin'));

router.get('/', async (_req, res: Response) => {
  const users = await prisma.user.findMany({
    select: { id: true, name: true, email: true, role: true, phone: true, active: true, createdAt: true },
    orderBy: { createdAt: 'desc' },
  });
  res.json({ data: users });
});

router.post('/', validate(CreateUserSchema), async (req: AuthRequest, res: Response) => {
  const { password, ...rest } = req.body as { password: string; [k: string]: unknown };
  const passwordHash = await hashPassword(password);
  const user = await prisma.user.create({
    data: { ...(rest as { name: string; email: string; role: 'admin' | 'staff' | 'technician' | 'accounts'; phone?: string }), passwordHash },
    select: { id: true, name: true, email: true, role: true, phone: true, active: true, createdAt: true },
  });
  res.status(201).json(user);
});

router.get('/:id', async (req, res: Response) => {
  const user = await prisma.user.findUnique({
    where: { id: req.params.id },
    select: { id: true, name: true, email: true, role: true, phone: true, active: true, createdAt: true },
  });
  if (!user) { res.status(404).json({ error: 'User not found' }); return; }
  res.json(user);
});

router.patch('/:id', validate(UpdateUserSchema), async (req: AuthRequest, res: Response) => {
  const user = await prisma.user.update({
    where: { id: req.params.id },
    data: req.body,
    select: { id: true, name: true, email: true, role: true, phone: true, active: true, createdAt: true },
  });
  res.json(user);
});

export default router;
