const MessageModel = require('../../../models/MessageModel')
const UserModel = require('../../../models/UserModel')
const jwt = require('jsonwebtoken')
const moment = require('moment-jalaali')
const getMessages = async (req, res, next) => {
  try {
    const token = req.header('Authorization').split(' ')[1]
    if (!token) return res.status(401).send('Access Denied')

    const decodedToken = jwt.verify(token, process.env.APP_SECRET)
    const userId = decodedToken.id

    const { search } = req.query

    // پیدا کردن تمام پیام‌هایی که کاربر مورد نظر آنها فرستنده یا گیرنده بوده است
    const messageFilter = {
      $or: [
        { senderId: userId },
        { receiverId: userId }
      ]
    }

    // پیدا کردن تمام پیام‌ها با فیلتر و سورت براساس جدیدترین پیام
    const messages = await MessageModel.find(messageFilter).sort({ createdAt: -1 })

    // استخراج شناسه‌های تمام کاربران مرتبط با این پیام‌ها (بدون تکرار)
    const userIdToLastMessageDate = {}
    messages.forEach(message => {
      if (!userIdToLastMessageDate[message.senderId]) {
        userIdToLastMessageDate[message.senderId] = message.createdAt
      }
      if (!userIdToLastMessageDate[message.receiverId]) {
        userIdToLastMessageDate[message.receiverId] = message.createdAt
      }
    })

    // تبدیل مجموعه شناسه‌های کاربر به آرایه
    const userIdsArray = Object.keys(userIdToLastMessageDate)

    // ساخت فیلتر جستجو برای کاربران مرتبط
    const userFilter = { _id: { $in: userIdsArray } }

    if (search) {
      userFilter.$and = [
        { _id: { $in: userIdsArray } }, // فقط کاربران مرتبط
        {
          $or: [
            { first_name: { $regex: search, $options: 'i' } },
            { last_name: { $regex: search, $options: 'i' } },
            { user_name: { $regex: search, $options: 'i' } }
          ]
        }
      ]
    }

    // پیدا کردن اطلاعات کاربران مرتبط بر اساس فیلتر جستجو و شمارش تعداد پیام‌های خوانده نشده برای هر کاربر
    const usersData = await UserModel.find(userFilter)
    const usersWithUnreadCount = await Promise.all(usersData.map(async (user) => {
      const unreadMessagesCount = await MessageModel.countDocuments({ receiverId: userId, senderId: user._id, readStatus: 0 })

      let lastOnlineStatus
      const now = moment()
      const lastOnline = moment(user.last_online)
      const diffMinutes = now.diff(lastOnline, 'minutes')

      if (diffMinutes < 1) {
        lastOnlineStatus = 'آنلاین'
      } else if (diffMinutes < 60) {
        lastOnlineStatus = `${diffMinutes} دقیقه پیش`
      } else if (diffMinutes < 1440) {
        lastOnlineStatus = `${Math.floor(diffMinutes / 60)} ساعت پیش`
      } else {
        lastOnlineStatus = `${Math.floor(diffMinutes / 1440)} روز پیش`
      }

      // بررسی آیا کاربر فعلی در لیست بلاک‌شده‌های این کاربر است یا خیر
      const blockedByCurrentUser = user.blocked_by.includes(userId)
      const blockedYou = user.blocked_users.includes(userId)

      return {
        first_name: user.first_name,
        last_name: user.last_name,
        user_name: user.user_name,
        is_verified: user.is_verified,
        profile_image: user.profile_image,
        last_online: lastOnlineStatus,
        _id: user._id,
        unread_messages_count: unreadMessagesCount,
        is_blocked: blockedByCurrentUser,
        blocked_you: blockedYou,
        last_message_date: userIdToLastMessageDate[user._id]
      }
    }))

    // حذف کاربر فعلی از آرایه و سورت کردن کاربران براساس آخرین پیام
    const filteredUsersData = usersWithUnreadCount
      .filter(user => user._id.toString() !== userId)
      .sort((a, b) => new Date(b.last_message_date) - new Date(a.last_message_date))

    res.status(200).json({
      filteredUsersData,
      totalMessages: messages.length
    })
  } catch (error) {
    next(error)
  }
}

const getUnreadMessages = async (req, res, next) => {
  try {
    const token = req.header('Authorization').split(' ')[1]
    if (!token) return res.status(401).send('Access Denied')

    const decodedToken = jwt.verify(token, process.env.APP_SECRET)
    const userId = decodedToken.id

    // پیدا کردن تمام پیام‌های کاربر که هنوز خوانده نشده‌اند
    const unreadMessagesCount = await MessageModel.countDocuments({ receiverId: userId, readStatus: 0 })

    res.status(200).json({ unread_messages_count: unreadMessagesCount })
  } catch (error) {
    next(error)
  }
}
module.exports = {
  getMessages, getUnreadMessages
}
