import { ChatService } from "@/services/chatService.js";
import {
  AddChatRoomMemberRequest,
  AuthenticatedRequest,
  CreateChatRoomRequest,
  GetMessagesQuery,
  RemoveChatRoomMemberRequest,
  UpdateChatRoomRequest,
} from "@/types/index.js";
import type { Response } from "express";

export class ChatController {
  static async getChatRooms(req: AuthenticatedRequest, res: Response) {
    if (!req.user) {
      res.status(401).json({ success: false, error: "Unauthorized" });
      return;
    }

    const result = await ChatService.getChatRooms(req.user.userId);
    res.status(result.success ? 200 : 500).json(result);
  }

  static async createChatRoom(req: AuthenticatedRequest, res: Response) {
    if (!req.user) {
      res.status(401).json({ success: false, error: "Unauthorized" });
      return;
    }

    const data: CreateChatRoomRequest = req.body;
    const result = await ChatService.createChatRoom(req.user.userId, data);

    res.status(result.success ? 201 : 500).json(result);
  }

  static async getMessages(req: AuthenticatedRequest, res: Response) {
    if (!req.user) {
      res.status(401).json({ success: false, error: "Unauthorized" });
      return;
    }

    const query: GetMessagesQuery = {
      roomId: req.params.roomId,
      page: req.query.page as string,
      limit: req.query.limit as string,
    };

    const result = await ChatService.getMessages(query);
    res.status(result.success ? 200 : 500).json(result);
  }

  static async updateChatRoom(req: AuthenticatedRequest, res: Response) {
    if (!req.user) {
      res.status(401).json({ success: false, error: "Unauthorized" });
      return;
    }

    const roomId = req.params.roomId;
    const data: UpdateChatRoomRequest = req.body;

    const result = await ChatService.updateChatRoom(req.user.userId, roomId, data);
    res.status(result.success ? 200 : result.status || 400).json(result);
  }

  static async deleteChatRoom(req: AuthenticatedRequest, res: Response) {
    if (!req.user) {
      res.status(401).json({ success: false, error: "Unauthorized" });
      return;
    }

    const roomId = req.params.roomId;

    const result = await ChatService.deleteChatRoom(req.user.userId, roomId);
    res.status(result.success ? 200 : result.status || 500).json(result);
  }

  static async addChatRoomMember(req: AuthenticatedRequest, res: Response) {
    if (!req.user) {
      res.status(401).json({ success: false, error: "Unauthorized" });
      return;
    }

    const roomId = req.params.roomId;
    const data: AddChatRoomMemberRequest = req.body;

    const result = await ChatService.addChatRoomMember(req.user.userId, roomId, data);
    res.status(result.success ? 200 : result.status || 500).json(result);
  }

  static async removeChatRoomMember(req: AuthenticatedRequest, res: Response) {
    if (!req.user) {
      res.status(401).json({ success: false, error: "Unauthorized" });
      return;
    }

    const roomId = req.params.roomId;
    const data: RemoveChatRoomMemberRequest = req.body;

    const result = await ChatService.removeChatRoomMember(req.user.userId, roomId, data);
    res.status(result.success ? 200 : result.status || 500).json(result);
  }
}
