import { Router } from 'express';
import { authenticate } from '../../middleware/auth';
import { requireRoles } from '../../middleware/rbac';
import { Role, ErrorCode } from '@saferoute/constants';
import { prisma } from '../../config/database';
import { sendSuccess, sendError, sendPaginated } from '../../utils/response';

export const welcomeKitRoutes = Router();

welcomeKitRoutes.get('/', authenticate, requireRoles(Role.OWNER, Role.SCHOOL_TRANSPORT_ADMIN), async (req, res) => {
  try {
    const page = parseInt(req.query.page as string) || 1;
    const limit = parseInt(req.query.limit as string) || 20;
    const skip = (page - 1) * limit;
    const [kits, total] = await Promise.all([
      prisma.welcomeKit.findMany({ skip, take: limit, orderBy: { createdAt: 'desc' }, include: { student: { select: { id: true, fullName: true } }, items: true } }),
      prisma.welcomeKit.count(),
    ]);
    sendPaginated(res, kits, total, page, limit);
  } catch (error) { sendError(res, ErrorCode.SERVER_ERROR, 'Failed to list kits.'); }
});

welcomeKitRoutes.post('/', authenticate, requireRoles(Role.OWNER, Role.SCHOOL_TRANSPORT_ADMIN), async (req, res) => {
  try {
    const { studentId } = req.body;
    const kit = await prisma.welcomeKit.create({ data: { studentId, status: 'ASSIGNED' } });
    sendSuccess(res, { id: kit.id }, 'Kit created', 201);
  } catch (error) { sendError(res, ErrorCode.SERVER_ERROR, 'Failed to create kit.'); }
});

welcomeKitRoutes.get('/:kitId', authenticate, async (req, res) => {
  try {
    const kit = await prisma.welcomeKit.findUnique({
      where: { id: req.params.kitId }, include: { student: { select: { id: true, fullName: true } }, items: true },
    });
    if (!kit) { sendError(res, ErrorCode.WELCOME_KIT_NOT_ASSIGNED, 'Kit not found.'); return; }
    sendSuccess(res, kit);
  } catch (error) { sendError(res, ErrorCode.SERVER_ERROR, 'Failed to get kit.'); }
});

welcomeKitRoutes.patch('/:kitId/status', authenticate, requireRoles(Role.OWNER, Role.SCHOOL_TRANSPORT_ADMIN), async (req, res) => {
  try {
    const { status } = req.body;
    const data: any = { status };
    if (status === 'DISPATCHED') data.dispatchedAt = new Date();
    if (status === 'DELIVERED') data.deliveredAt = new Date();
    const kit = await prisma.welcomeKit.update({ where: { id: req.params.kitId }, data });
    sendSuccess(res, { id: kit.id, status: kit.status }, 'Kit status updated');
  } catch (error) { sendError(res, ErrorCode.SERVER_ERROR, 'Failed to update kit.'); }
});

welcomeKitRoutes.get('/student/:studentId', authenticate, async (req, res) => {
  try {
    const kit = await prisma.welcomeKit.findFirst({
      where: { studentId: req.params.studentId }, include: { items: true }, orderBy: { createdAt: 'desc' },
    });
    if (!kit) { sendError(res, ErrorCode.WELCOME_KIT_NOT_ASSIGNED, 'No kit assigned.'); return; }
    sendSuccess(res, kit);
  } catch (error) { sendError(res, ErrorCode.SERVER_ERROR, 'Failed to get kit.'); }
});

welcomeKitRoutes.post('/:kitId/items', authenticate, requireRoles(Role.OWNER, Role.SCHOOL_TRANSPORT_ADMIN), async (req, res) => {
  try {
    const { itemType, status, notes } = req.body;
    const item = await prisma.welcomeKitItem.create({
      data: { kitId: req.params.kitId, itemType, status: status || 'INCLUDED', notes },
    });
    sendSuccess(res, { id: item.id }, 'Item added', 201);
  } catch (error) { sendError(res, ErrorCode.SERVER_ERROR, 'Failed to add item.'); }
});

welcomeKitRoutes.patch('/items/:itemId/status', authenticate, async (req, res) => {
  try {
    const { status } = req.body;
    const item = await prisma.welcomeKitItem.update({ where: { id: req.params.itemId }, data: { status } });
    sendSuccess(res, { id: item.id, status: item.status }, 'Item status updated');
  } catch (error) { sendError(res, ErrorCode.SERVER_ERROR, 'Failed to update item.'); }
});
