import type { Request, Response } from 'express';
import type {
  CommentItem,
  CommentStatus,
  CommentStatusUpdatePayload,
} from '@/pages/CommentManagement/data';

const now = () => new Date().toISOString();

const parseString = (value: unknown): string | undefined => {
  return typeof value === 'string' && value.trim() ? value.trim() : undefined;
};

const COMMENT_STATUS_LIST: CommentStatus[] = [
  'pending',
  'approved',
  'rejected',
  'spam',
];

const isCommentStatus = (value: unknown): value is CommentStatus => {
  return (
    typeof value === 'string' &&
    COMMENT_STATUS_LIST.includes(value as CommentStatus)
  );
};

let commentList: CommentItem[] = [
  {
    id: 'cmt-1001',
    content: '这篇文章写得很实用，收藏了。',
    articleId: '1',
    articleTitle: '深入浅出 UmiJS 4 核心实战',
    userId: 'u-101',
    userName: '张伟',
    userAvatar: 'https://i.pravatar.cc/80?img=12',
    ipAddress: '10.12.3.8',
    status: 'approved',
    likeCount: 12,
    replyCount: 1,
    createdAt: '2024-02-14T10:18:00.000Z',
    updatedAt: '2024-02-14T10:18:00.000Z',
  },
  {
    id: 'cmt-1002',
    content: '能不能补一段关于路由权限控制的例子？',
    articleId: '1',
    articleTitle: '深入浅出 UmiJS 4 核心实战',
    userId: 'u-102',
    userName: '李娜',
    userAvatar: 'https://i.pravatar.cc/80?img=32',
    ipAddress: '10.12.9.21',
    status: 'pending',
    likeCount: 3,
    replyCount: 0,
    createdAt: '2024-02-14T10:45:00.000Z',
    updatedAt: '2024-02-14T10:45:00.000Z',
  },
  {
    id: 'cmt-1003',
    content: '文章不错，但封面图有点糊。',
    articleId: '2',
    articleTitle: 'Ant Design 5.0 设计趋势解析',
    userId: 'u-103',
    userName: '王强',
    userAvatar: 'https://i.pravatar.cc/80?img=7',
    ipAddress: '10.12.1.66',
    status: 'approved',
    likeCount: 1,
    replyCount: 0,
    createdAt: '2024-02-14T11:05:00.000Z',
    updatedAt: '2024-02-14T11:05:00.000Z',
  },
  {
    id: 'cmt-1004',
    content: '点这里领红包 http://example.com',
    articleId: '2',
    articleTitle: 'Ant Design 5.0 设计趋势解析',
    userId: 'u-104',
    userName: '匿名用户',
    ipAddress: '10.9.20.11',
    status: 'spam',
    likeCount: 0,
    replyCount: 0,
    createdAt: '2024-02-14T11:12:00.000Z',
    updatedAt: '2024-02-14T11:12:00.000Z',
  },
  {
    id: 'cmt-1005',
    content: '这条评论包含不当内容。',
    articleId: '1',
    articleTitle: '深入浅出 UmiJS 4 核心实战',
    userId: 'u-105',
    userName: '赵敏',
    userAvatar: 'https://i.pravatar.cc/80?img=19',
    ipAddress: '10.12.4.2',
    status: 'rejected',
    rejectReason: '包含不当词汇',
    likeCount: 0,
    replyCount: 0,
    createdAt: '2024-02-14T12:02:00.000Z',
    updatedAt: '2024-02-14T12:10:00.000Z',
  },
];

export default {
  'GET /api/comments': (req: Request, res: Response) => {
    const current = Number(req.query.current) || 1;
    const pageSize = Number(req.query.pageSize) || 10;
    const keyword = parseString(req.query.keyword);
    const status = parseString(req.query.status);
    const articleTitle = parseString(req.query.articleTitle);
    const userName = parseString(req.query.userName);

    let filtered = [...commentList];

    if (keyword) {
      filtered = filtered.filter(
        (item) =>
          item.content.includes(keyword) ||
          item.articleTitle.includes(keyword) ||
          item.userName.includes(keyword),
      );
    }

    if (status && isCommentStatus(status)) {
      filtered = filtered.filter((item) => item.status === status);
    }

    if (articleTitle) {
      filtered = filtered.filter((item) => item.articleTitle.includes(articleTitle));
    }

    if (userName) {
      filtered = filtered.filter((item) => item.userName.includes(userName));
    }

    const start = (current - 1) * pageSize;
    const data = filtered.slice(start, start + pageSize);

    res.json({
      success: true,
      data,
      total: filtered.length,
    });
  },

  'GET /api/comments/:id': (req: Request, res: Response) => {
    const { id } = req.params;
    const item = commentList.find((comment) => comment.id === id);

    if (!item) {
      res.status(404).json({ success: false, message: '评论不存在' });
      return;
    }

    res.json({ success: true, data: item });
  },

  'PUT /api/comments/:id/status': (req: Request, res: Response) => {
    const { id } = req.params;
    const status = (req.body as any)?.status as unknown;
    const rejectReason = (req.body as any)?.rejectReason as unknown;
    const item = commentList.find((comment) => comment.id === id);

    if (!item) {
      res.status(404).json({ success: false, message: '评论不存在' });
      return;
    }

    if (!isCommentStatus(status) || status === 'pending') {
      res.status(400).json({ success: false, message: '状态非法' });
      return;
    }

    item.status = status;
    item.updatedAt = now();

    if (status === 'rejected') {
      item.rejectReason = parseString(rejectReason) || '未填写原因';
    } else {
      item.rejectReason = undefined;
    }

    res.json({ success: true });
  },

  'DELETE /api/comments/:id': (req: Request, res: Response) => {
    const { id } = req.params;
    const index = commentList.findIndex((comment) => comment.id === id);

    if (index === -1) {
      res.status(404).json({ success: false, message: '评论不存在' });
      return;
    }

    commentList.splice(index, 1);
    res.json({ success: true });
  },
};
