import { FastifyInstance } from 'fastify';
import { prisma } from '../../config/database.js';
import { authMiddleware } from '../middleware/auth.middleware.js';
import { linkUserSchema, paginationSchema } from '../middleware/validate.js';
import { successResponse, errorResponse, paginatedResponse, normalizeIgUsername } from '../../utils/helpers.js';

export async function userRoutes(app: FastifyInstance) {
  app.addHook('preHandler', authMiddleware);

  // GET /api/v1/users
  app.get('/', async (request, reply) => {
    const { page, limit } = paginationSchema.parse(request.query);
    const tenantId = request.tenantId!;
    const skip = (page - 1) * limit;

    const [users, total] = await Promise.all([
      prisma.user.findMany({
        where: { tenantId },
        skip,
        take: limit,
        orderBy: { createdAt: 'desc' },
      }),
      prisma.user.count({ where: { tenantId } }),
    ]);

    return paginatedResponse(reply, users, total, page, limit);
  });

  // GET /api/v1/users/:id/history
  app.get('/:id/history', async (request, reply) => {
    const { id } = request.params as { id: string };
    const tenantId = request.tenantId!;

    const user = await prisma.user.findFirst({
      where: { id, tenantId },
    });
    if (!user) return errorResponse(reply, 'User not found', 404);

    const bids = await prisma.bid.findMany({
      where: { userId: id },
      orderBy: { createdAt: 'desc' },
      take: 50,
      include: {
        auctionItem: {
          include: {
            product: { select: { name: true, imageUrl: true } },
          },
        },
      },
    });

    return successResponse(reply, { user, bids });
  });

  // PUT /api/v1/users/:id/block
  app.put('/:id/block', async (request, reply) => {
    const { id } = request.params as { id: string };
    const tenantId = request.tenantId!;

    const user = await prisma.user.findFirst({ where: { id, tenantId } });
    if (!user) return errorResponse(reply, 'User not found', 404);

    const updated = await prisma.user.update({
      where: { id },
      data: { isBlocked: !user.isBlocked },
    });

    return successResponse(reply, updated);
  });
}
