/* eslint-disable camelcase */
const { default: mongoose } = require('mongoose')
const ProjectModel = require('../../../models/ProjectModel')
const RequestModel = require('../../../models/RequestModel')
const UserModel = require('../../../models/UserModel')
const jwt = require('jsonwebtoken')
const calculateRemainingTime = (milliseconds) => {
  const days = Math.floor(milliseconds / (1000 * 60 * 60 * 24))
  const hours = Math.floor((milliseconds % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60))

  return `${days} روز و ${hours} ساعت`
}
const getProjects = async (req, res, next) => {
  try {
    // eslint-disable-next-line no-unused-vars
    const { expertise, page = 1, limit = 10, most_price, most_requests, age, gender } = req.query
    // ساخت فیلتر برای استفاده در جستجوی MongoDB
    const filter = {
      payment_status: 'done',
      status: 'accepted',
      public_status: 'public',
      $or: [
        { isExpired: false }, // پروژه‌هایی که isExpired برابر با false است
        { isExpired: { $exists: false } } // پروژه‌هایی که فیلد isExpired وجود ندارد
      ]
    }
    if (expertise) {
      filter.expertise = expertise
    }
    if (age) {
      filter.age = age
    }
    if (gender) {
      filter.gender = gender
    }
    // استفاده از مدل پیجینیت شده برای دریافت نتایج صفحه‌بندی شده

    if (most_price || most_requests) {
      // دریافت لیست پروژه‌ها با استفاده از فیلتر و گزینه‌های صفحه‌بندی
      const options = {
        page: parseInt(page), // تبدیل صفحه به عدد صحیح
        limit: parseInt(limit), // تبدیل محدودیت به عدد صحیح
        sort: most_price === 'true' ? { offer_price: -1 } : { requested_users: 'desc' }
      }
      const projects = await ProjectModel.paginate(filter, options)

      const newProj = projects.docs
      res.status(200).json({
        projects: newProj,
        totalPages: projects.totalPages, // ارسال تعداد کل صفحات
        totalItems: projects.totalDocs // ارسال تعداد کل آیتم‌ها
      })
    } else {
      // دریافت لیست پروژه‌ها با استفاده از فیلتر و گزینه‌های صفحه‌بندی
      const options = {
        page: parseInt(page), // تبدیل صفحه به عدد صحیح
        limit: parseInt(limit), // تبدیل محدودیت به عدد صحیح
        sort: { acceptedAt: -1, createdAt: -1 } // مرتب‌سازی بر اساس acceptedAt و سپس createdAt
      }
      const projects = await ProjectModel.paginate(filter, options)
      const newProj = projects.docs
      res.status(200).json({
        projects: newProj,
        totalPages: projects.totalPages, // ارسال تعداد کل صفحات
        totalItems: projects.totalDocs // ارسال تعداد کل آیتم‌ها
      })
    }
  } catch (error) {
    next(error)
  }
  // try {
  //   const token = req.header('Authorization').split(' ')[1]
  //   if (!token) return res.status(401).send('Access Denied')

  //   // eslint-disable-next-line no-unused-vars
  //   const decodedToken = jwt.verify(token, process.env.APP_SECRET)

  //   const { expertise, page = 1, limit = 10 } = req.query // افزودن پارامترهای صفحه‌بندی به درخواست

  //   // ساخت فیلتر برای استفاده در جستجوی MongoDB
  //   const filter = {
  //     payment_status: 'done',
  //     status: 'accepted',
  //     public_status: 'public'
  //   } // افزودن شرط‌های دیگر برای فیلتر

  //   if (expertise) {
  //     filter.expertise = expertise
  //   }

  //   // استفاده از مدل پیجینیت شده برای دریافت نتایج صفحه‌بندی شده
  //   const options = {
  //     page: parseInt(page), // تبدیل صفحه به عدد صحیح
  //     limit: parseInt(limit) // تبدیل محدودیت به عدد صحیح
  //   }

  //   // دریافت لیست پروژه‌ها با استفاده از فیلتر و گزینه‌های صفحه‌بندی
  //   const projects = await ProjectModel.paginate(filter, options)

  //   // تبدیل نتایج به فرمت مورد نیاز
  //   const projectsWithUserInfo = await Promise.all(projects.docs.map(async project => {
  //     const creator = await UserModel.findById(project.creator_id).select('first_name last_name user_name user_type is_verified profile_image gender province city rate')
  //     const projectWithUserInfo = {
  //       ...project.toJSON(), // تبدیل آبجکت پروژه به JSON
  //       creator // اضافه کردن اطلاعات کاربر به آبجکت پروژه
  //     }

  //     // محاسبه مدت زمان باقی‌مانده برای هر پروژه
  //     const currentTime = new Date()
  //     const projectCreatedAt = new Date(project.createdAt)
  //     const timeDiff = project.offer_time * 24 * 60 * 60 * 1000 - (currentTime - projectCreatedAt)
  //     const remainingTime = calculateRemainingTime(timeDiff)
  //     projectWithUserInfo.remainingTime = remainingTime

  //     return projectWithUserInfo
  //   }))

  //   res.status(200).json({
  //     projects: projectsWithUserInfo,
  //     totalPages: projects.totalPages, // ارسال تعداد کل صفحات
  //     totalItems: projects.totalDocs // ارسال تعداد کل آیتم‌ها
  //   })
  // } catch (error) {
  //   next(error)
  // }
}
const getUserProjects = async (req, res, next) => {
  try {
    const token = req.header('Authorization').split(' ')[1]
    if (!token) return res.status(401).send('Access Denied')
    const user_id = req.query.user_id
    // eslint-disable-next-line no-unused-vars
    const decodedToken = jwt.verify(token, process.env.APP_SECRET)
    // const userReqId = decodedToken.id

    if (!mongoose.Types.ObjectId.isValid(user_id)) {
      return res.status(400).json({ message: 'شناسه کاربر معتبر نیست' })
    }
    const user = await UserModel.findById(user_id)

    if (!user) {
      return res.status(404).json({ message: 'کاربر مورد نظر یافت نشد' })
    }
    const response = {}
    if (user.user_type === 'user') {
      const options = {
        page: req.query.page || 1, // صفحه پیش‌فرض ۱
        limit: req.query.limit || 10, // حداکثر تعداد موارد برای هر صفحه
        sort: { createdAt: -1 }
      }

      // پیجینیشن بر روی لیست پروژه‌های کاربر اعمال می‌شود
      const projects = await ProjectModel.paginate(
        { selected_user: user._id, status: 'done' }, // فیلتر
        options // گزینه‌های پیجینیشن
      )
      response.projects = projects.docs
      response.totalPages = projects.totalPages // ارسال تعداد کل صفحات
      response.totalItems = projects.totalDocs // ارسال تعداد کل آیتم‌ها
      response.allProjectsCount = await ProjectModel.countDocuments({ selected_user: user._id })
      const completedProjects = await Promise.all([
        ProjectModel.countDocuments({ selected_user: user._id, status: 'done' })
      ])
      response.successfulProjects = completedProjects
    } else {
      const options = {
        page: req.query.page || 1, // صفحه پیش‌فرض ۱
        limit: req.query.limit || 10, // حداکثر تعداد موارد برای هر صفحه
        sort: { createdAt: -1 }
      }

      // پیجینیشن بر روی لیست پروژه‌های کاربر اعمال می‌شود
      const projects = await ProjectModel.paginate(
        { creator_id: user._id, status: { $in: ['done', 'accepted'] } }, // فیلتر
        options // گزینه‌های پیجینیشن
      )
      response.projects = projects.docs
      response.totalPages = projects.totalPages // ارسال تعداد کل صفحات
      response.totalItems = projects.totalDocs
      response.allProjectsCount = await ProjectModel.countDocuments({ creator_id: user._id, payment_status: 'done' })
      // تعداد پروژه‌های موفق را به دست آورید
      const successfulProjects = await ProjectModel.countDocuments({ creator_id: user._id, status: 'done' })
      response.successfulProjects = successfulProjects
    }
    return res.status(200).json({ data: response })
  } catch (error) {
    next(error)
  }
}
const getUserProjectsWeb = async (req, res, next) => {
  try {
    const user_id = req.query.user_id
    // eslint-disable-next-line no-unused-vars

    if (!mongoose.Types.ObjectId.isValid(user_id)) {
      return res.status(400).json({ message: 'شناسه کاربر معتبر نیست' })
    }
    const user = await UserModel.findById(user_id)

    if (!user) {
      return res.status(404).json({ message: 'کاربر مورد نظر یافت نشد' })
    }
    const data = {}
    if (user.user_type === 'user') {
      const options = {
        page: req.query.page || 1, // صفحه پیش‌فرض ۱
        limit: req.query.limit || 10, // حداکثر تعداد موارد برای هر صفحه
        sort: { createdAt: -1 }
      }

      // پیجینیشن بر روی لیست پروژه‌های کاربر اعمال می‌شود
      const projects = await ProjectModel.paginate(
        { selected_user: user._id, status: 'done' }, // فیلتر
        options // گزینه‌های پیجینیشن
      )
      data.projects = projects.docs
      data.totalPages = projects.totalPages // ارسال تعداد کل صفحات
      data.totalItems = projects.totalDocs // ارسال تعداد کل آیتم‌ها
      data.allProjectsCount = await ProjectModel.countDocuments({ selected_user: user._id })
      const completedProjects = await Promise.all([
        ProjectModel.countDocuments({ selected_user: user._id, status: 'done' })
      ])
      data.successfulProjects = completedProjects
    } else {
      const options = {
        page: req.query.page || 1, // صفحه پیش‌فرض ۱
        limit: req.query.limit || 10, // حداکثر تعداد موارد برای هر صفحه
        sort: { createdAt: -1 }
      }

      // پیجینیشن بر روی لیست پروژه‌های کاربر اعمال می‌شود
      const projects = await ProjectModel.paginate(
        { creator_id: user._id, status: { $in: ['done', 'accepted'] } }, // فیلتر
        options // گزینه‌های پیجینیشن
      )
      data.projects = projects.docs
      data.totalPages = projects.totalPages // ارسال تعداد کل صفحات
      data.totalItems = projects.totalDocs
      data.allProjectsCount = await ProjectModel.countDocuments({ creator_id: user._id, payment_status: 'done' })
      // تعداد پروژه‌های موفق را به دست آورید
      const successfulProjects = await ProjectModel.countDocuments({ creator_id: user._id, status: 'done' })
      data.successfulProjects = successfulProjects
    }
    return res.status(200).json(data)
  } catch (error) {
    next(error)
  }
}
const getSingleProjects = 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 projectId = req.params.projectId
    const projectRequests = await RequestModel.find({ project: projectId })
      .populate('user', 'price time user_level first_name last_name user_name is_verified user_score rate profile_image')
      .sort({ status: 1 })
      .lean()
    const modifiedRequests = projectRequests.map(request => ({
      ...request,
      time: request.user._id.toString() === userId ? request.time : null,
      price: request.user._id.toString() === userId ? request.price : null
    }))
    const project = await ProjectModel.findById(projectId)
    if (!project) {
      return res.status(404).json({ message: 'پروژه مورد نظر یافت نشد' })
    }
    // محاسبه مبلغ باقیمانده و مجموع مبلغ پرداخت شده
    // تابع محاسبه مبلغ پرداخت شده
    const getTotalPaidAmount = (installments) => {
      let totalPaidAmount = 0
      installments.forEach(installment => {
        totalPaidAmount += installment.amount
      })
      return totalPaidAmount
    }

    // تابع محاسبه مبلغ باقیمانده
    const getRemainingAmount = (project) => {
      const totalPaidAmount = getTotalPaidAmount(project.installments)
      const remainingAmount = project.final_price - totalPaidAmount
      return remainingAmount
    }

    const totalPaidAmount = getTotalPaidAmount(project.installments)
    const remainingAmount = getRemainingAmount(project)
    // اطلاعات کاربر سازنده را نیز دریافت کنید و به آبجکت پروژه اضافه کنید
    const creator = await UserModel.findById(project.creator_id).select('first_name last_name user_name user_type is_verified profile_image gender province city rate')

    const projectWithUserInfo = {
      ...project._doc,
      creator // اضافه کردن اطلاعات کاربر به آبجکت پروژه
    }
    const selectedUser = await UserModel.findById(project.selected_user).select('_id user_name first_name last_name user_type is_verified profile_image expertise sub_expertise province city rate user_level user_score')
    projectWithUserInfo.selected_user = selectedUser
    // محاسبه مدت زمان باقی‌مانده برای پروژه
    const currentTime = new Date()
    const projectCreatedAt = new Date(project.createdAt)
    const timeDiff = project.offer_time * 24 * 60 * 60 * 1000 - (currentTime - projectCreatedAt)
    const remainingTime = calculateRemainingTime(timeDiff)
    projectWithUserInfo.remainingTime = remainingTime
    let projectDetails = projectWithUserInfo
    if ((project.selected_user && project.selected_user.toString()) === userId || project.creator_id.toString() === userId) {
      projectDetails = {
        ...projectWithUserInfo,
        total_paid_amount: totalPaidAmount,
        remaining_amount: remainingAmount
      }
    } else {
      projectDetails =
        projectWithUserInfo
    }
    // }
    res.status(200).json({ project: projectDetails, projectRequests: modifiedRequests })
  } catch (error) {
    next(error)
  }
}
const getSingleProjectsWeb = async (req, res, next) => {
  try {
    let userId = null
    let token = req.header('Authorization')

    if (token) {
      try {
        token = token.split(' ')[1]
        if (token) {
          const decodedToken = jwt.verify(token, process.env.APP_SECRET)
          userId = decodedToken.id
        }
      } catch (err) {
        console.warn('Invalid token:', err.message)
      }
    }

    const projectId = req.params.projectId
    const projectRequests = await RequestModel.find({ project: projectId })
      .populate('user', 'price time user_level first_name last_name user_name is_verified user_score rate profile_image')
      .sort({ status: 1 })
      .lean()

    // اگر کاربر لاگین کرده باشد، زمان و قیمت را نشان بده، در غیر این صورت حذف کن
    const modifiedRequests = projectRequests.map(request => ({
      ...request,
      time: userId && request.user._id.toString() === userId ? request.time : null,
      price: userId && request.user._id.toString() === userId ? request.price : null
    }))

    const project = await ProjectModel.findById(projectId)
    if (!project) {
      return res.status(404).json({ message: 'پروژه مورد نظر یافت نشد' })
    }

    // محاسبه مبلغ باقیمانده و مجموع مبلغ پرداخت شده
    const getTotalPaidAmount = (installments) => {
      return installments.reduce((total, installment) => total + installment.amount, 0)
    }

    const getRemainingAmount = (project) => {
      return project.final_price - getTotalPaidAmount(project.installments)
    }

    const totalPaidAmount = getTotalPaidAmount(project.installments)
    const remainingAmount = getRemainingAmount(project)

    // دریافت اطلاعات سازنده پروژه
    const creator = await UserModel.findById(project.creator_id).select('first_name last_name user_name user_type is_verified profile_image gender province city rate')

    const projectWithUserInfo = {
      ...project._doc,
      creator
    }

    // دریافت اطلاعات کاربر منتخب در صورت وجود
    const selectedUser = await UserModel.findById(project.selected_user).select('_id user_name first_name last_name user_type is_verified profile_image expertise sub_expertise province city rate user_level user_score')
    projectWithUserInfo.selected_user = selectedUser

    // محاسبه زمان باقی‌مانده برای پیشنهادات پروژه
    const currentTime = new Date()
    const projectCreatedAt = new Date(project.createdAt)
    const timeDiff = project.offer_time * 24 * 60 * 60 * 1000 - (currentTime - projectCreatedAt)
    projectWithUserInfo.remainingTime = calculateRemainingTime(timeDiff)

    let projectDetails = projectWithUserInfo

    // فقط اگر کاربر احراز هویت شده باشد و سازنده یا برنده پروژه باشد، اطلاعات مالی را برگردان
    if (userId && (project.selected_user?.toString() === userId || project.creator_id.toString() === userId)) {
      projectDetails = {
        ...projectWithUserInfo,
        total_paid_amount: totalPaidAmount,
        remaining_amount: remainingAmount
      }
    }

    res.status(200).json({ project: projectDetails, projectRequests: modifiedRequests })
  } catch (error) {
    next(error)
  }
}

// const projectDetails = await ProjectModel.findById(projectId).populate('requested_users', 'price time user_level first_name last_name user_name is_verified user_score rate profile_image') // جزییات درخواست‌های کاربران

module.exports = {
  getProjects, getSingleProjects, getUserProjects, getUserProjectsWeb, getSingleProjectsWeb
}
