import { Router } from 'express';
import { checkSocialEnabled } from './social.middleware';
import { socialActionRateLimit } from './social.rate-limits';
import { pokeService } from './poke.service';
import { sendFriendRequestSchema, friendsPaginationSchema } from './social.schemas';

const router = Router();

// All poke routes require social to be enabled
router.use(checkSocialEnabled);

/** POST /api/social/pokes — Send a poke */
router.post('/', socialActionRateLimit, async (req, res, next) => {
  try {
    const { userId } = sendFriendRequestSchema.parse(req.body); // reuse schema: { userId: cuid }
    const poke = await pokeService.sendPoke(req.user!.id, userId);
    res.status(201).json(poke);
  } catch (err: any) {
    if (err.statusCode) {
      res.status(err.statusCode).json({ error: { message: err.message } });
      return;
    }
    next(err);
  }
});

/** GET /api/social/pokes — List received pokes */
router.get('/', async (req, res, next) => {
  try {
    const { page, limit } = friendsPaginationSchema.parse(req.query);
    const result = await pokeService.listReceivedPokes(req.user!.id, page, limit);
    res.json(result);
  } catch (err) {
    next(err);
  }
});

/** GET /api/social/pokes/count — Unread poke count */
router.get('/count', async (req, res, next) => {
  try {
    const count = await pokeService.getUnreadPokeCount(req.user!.id);
    res.json({ count });
  } catch (err) {
    next(err);
  }
});

/** POST /api/social/pokes/:id/read — Mark poke as read */
router.post('/:id/read', async (req, res, next) => {
  try {
    const id = parseInt(req.params.id as string, 10);
    if (isNaN(id)) {
      res.status(400).json({ error: { message: 'Invalid poke ID' } });
      return;
    }
    const poke = await pokeService.markPokeRead(req.user!.id, id);
    res.json(poke);
  } catch (err: any) {
    if (err.statusCode) {
      res.status(err.statusCode).json({ error: { message: err.message } });
      return;
    }
    next(err);
  }
});

/** GET /api/social/pokes/cooldown/:userId — Check poke cooldown */
router.get('/cooldown/:userId', async (req, res, next) => {
  try {
    const targetUserId = req.params.userId as string;
    const ttl = await pokeService.getPokeCooldown(req.user!.id, targetUserId);
    res.json({ onCooldown: ttl !== null, ttlSeconds: ttl });
  } catch (err) {
    next(err);
  }
});

export { router as pokeRouter };
