import { Router, Response } from 'express';
import { authenticate, AuthRequest } from '../middleware/auth';
import { requireRole } from '../middleware/requireRole';
import { validate } from '../middleware/validate';
import { CreateVehicleSchema, UpdateVehicleSchema } from '@nobel/shared';
import { qstr, qstrDef } from '../lib/query';
import prisma from '../lib/prisma';

const router = Router();
router.use(authenticate);

router.get('/', async (req: AuthRequest, res: Response) => {
  const search = qstr(req, 'search');
  const customerId = qstr(req, 'customerId');
  const cursor = qstr(req, 'cursor');
  const take = Math.min(parseInt(qstrDef(req, 'limit', '50')) || 50, 100);

  const where = {
    deletedAt: null as null,
    ...(customerId ? { customerId } : {}),
    ...(search ? {
      OR: [
        { plate: { contains: search, mode: 'insensitive' as const } },
        { vin: { contains: search, mode: 'insensitive' as const } },
        { make: { contains: search, mode: 'insensitive' as const } },
        { model: { contains: search, mode: 'insensitive' as const } },
        { customer: { name: { contains: search, mode: 'insensitive' as const } } },
      ],
    } : {}),
  };

  const [vehicles, total] = await Promise.all([
    prisma.vehicle.findMany({
      where,
      take: take + 1,
      ...(cursor ? { cursor: { id: cursor }, skip: 1 } : {}),
      orderBy: { id: 'desc' },
      include: { customer: { select: { id: true, name: true } } },
    }),
    prisma.vehicle.count({ where }),
  ]);

  const hasMore = vehicles.length > take;
  if (hasMore) vehicles.pop();

  res.json({
    data: vehicles,
    nextCursor: hasMore ? vehicles[vehicles.length - 1]?.id : null,
    total,
  });
});

router.post('/', requireRole('admin', 'staff'), validate(CreateVehicleSchema), async (req: AuthRequest, res: Response) => {
  const vehicle = await prisma.vehicle.create({ data: req.body });
  res.status(201).json(vehicle);
});

router.get('/:id', async (req: AuthRequest, res: Response) => {
  const vehicle = await prisma.vehicle.findFirst({
    where: { id: req.params.id, deletedAt: null },
    include: {
      customer: true,
      orders: {
        orderBy: { createdAt: 'desc' },
        include: { items: true, receipt: true },
      },
    },
  });
  if (!vehicle) { res.status(404).json({ error: 'Vehicle not found' }); return; }
  res.json(vehicle);
});

router.patch('/:id', requireRole('admin', 'staff'), validate(UpdateVehicleSchema), async (req: AuthRequest, res: Response) => {
  const vehicle = await prisma.vehicle.update({
    where: { id: req.params.id },
    data: req.body,
  });
  res.json(vehicle);
});

router.delete('/:id', requireRole('admin'), async (req: AuthRequest, res: Response) => {
  await prisma.vehicle.update({
    where: { id: req.params.id },
    data: { deletedAt: new Date() },
  });
  res.json({ ok: true });
});

export default router;
