import { Body, Controller, Get, Inject, Param, Post, Query, UseGuards } from "@nestjs/common";
import type Redis from "ioredis";
import { UpdateActivityReadRequest } from "@slackwsh/contracts";
import * as messaging from "@slackwsh/messaging";
import { AuthGuard } from "../auth/auth.guard";
import { CurrentUser } from "../auth/current-user.decorator";
import type { RequestUser } from "../auth/auth.guard";
import { REDIS_PUBSUB } from "../common/redis-pubsub.provider";

@UseGuards(AuthGuard)
@Controller("workspaces/:workspaceId/search")
export class SearchController {
  constructor(@Inject(REDIS_PUBSUB) private readonly redis: Redis) {}

  @Get("mentions")
  async mentions(@CurrentUser() user: RequestUser, @Param("workspaceId") workspaceId: string) {
    return { results: await messaging.listMentionActivity(workspaceId, user.userId) };
  }

  @Post("activity/read")
  async updateActivityRead(
    @CurrentUser() user: RequestUser,
    @Param("workspaceId") workspaceId: string,
    @Body() body: unknown,
  ) {
    const { messageIds, read } = UpdateActivityReadRequest.parse(body);
    return { messageIds: await messaging.setActivityReadState(this.redis, workspaceId, user.userId, messageIds, read), read };
  }

  @Get("unreads")
  async unreads(@CurrentUser() user: RequestUser, @Param("workspaceId") workspaceId: string) {
    return { results: await messaging.listUnreadMessages(workspaceId, user.userId) };
  }

  @Get()
  async search(@CurrentUser() user: RequestUser, @Param("workspaceId") workspaceId: string, @Query("q") q: string | undefined) {
    if (!q?.trim()) return { results: [] };
    return { results: await messaging.searchMessages(workspaceId, user.userId, q) };
  }
}
