/* eslint-disable camelcase */
const { default: axios } = require('axios')
const NotificationModel = require('../../../models/NotificationModel')
const ProjectModel = require('../../../models/ProjectModel')
const RequestModel = require('../../../models/RequestModel')
const UserModel = require('../../../models/UserModel')
const { check, validationResult } = require('express-validator')
const jwt = require('jsonwebtoken')
const requestProjectValidationRules = () => {
  return [
    check('project_id')
      .notEmpty().withMessage('آیدی پروژه نمی‌تواند خالی باشد'),
    check('request_time')
      .notEmpty().withMessage('زمان پروژه نمی‌تواند خالی باشد'),

    check('offer_price')
      .notEmpty().withMessage('قیمت پیشنهادی نمی‌تواند خالی باشد')
  ]
}

const requestProject = 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 user = await UserModel.findById(decodedToken.id)
    if (!user || user.user_type !== 'user') {
      return res.status(422).json({
        error: true, message: 'شما دسترسی به این بخش ندارید'
      })
    }
    if (user.is_verified !== 'verified') {
      return res.status(422).json({
        error: true, message: 'مدارک شما تایید نشده است'
      })
    }
    // اعتبارسنجی درخواست
    const errors = validationResult(req)
    if (!errors.isEmpty()) {
      return res.status(422).json({ errors: errors.array() })
    }
    const { request_time, offer_price, project_id } = req.body
    if (!project_id || !offer_price || !request_time
    ) {
      return res.status(422).json({
        error: true,
        message: 'اطلاعات ارسالی اشتباه است'
      })
    }
    // چک کردن برای وجود درخواست قبلی
    const existingRequest = await RequestModel.findOne({ project: project_id, user: user._id })
    if (existingRequest) {
      return res.status(422).json({
        error: true,
        message: 'شما قبلاً برای این پروژه درخواست داده‌اید'
      })
    }
    // ایجاد یک درخواست جدید
    const request = new RequestModel({
      project: project_id,
      user: user._id,
      time: request_time,
      price: offer_price
    })
    await request.save()

    // ثبت اعلان برای سازنده پروژه
    const project = await ProjectModel.findById(project_id)
    const creatorId = project.creator_id

    const notification = new NotificationModel({
      user_id: creatorId,
      project_post_id: project_id,
      type: 'request',
      title: 'پیشنهاد جدید',
      description: `کاربر ${user.user_name} یک پیشنهاد جدید برای پروژه شما ارسال کرده است.`
    })
    await notification.save()

    const userReciver = await UserModel.findById(project.creator_id)

    const data = JSON.stringify({
      mobile: userReciver?.mobile,
      templateId: '876533',
      parameters: [
        { name: 'EMPLOYER', value: userReciver?.first_name + ' ' + userReciver?.last_name },
        { name: 'PROJECT', value: project?.title }
      ]
    })

    const config = {
      method: 'post',
      url: 'https://api.sms.ir/v1/send/verify',
      headers: {
        'Content-Type': 'application/json',
        Accept: 'text/plain',
        'x-api-key': '2JKxGbTzE64t0YTkjip6RYHnm9mq1haMlidF8WWwQunwubHFVW6iaMmfFQbMXEDt'
      },
      data
    }
    axios(config)
      .then(function (response) {
      })
      .catch(function (error) {
        console.log(error)
      })

    // به روز رسانی پروژه با افزودن کاربر به لیست کاربران درخواست دهنده
    const updatedProject = await ProjectModel.findOneAndUpdate(
      { _id: project_id },
      { $push: { requested_users: user._id } },
      { new: true }
    )

    if (!updatedProject) {
      console.error('Error adding requested user: Project not found')
      return res.status(404).json({ error: true, message: 'پروژه پیدا نشد' })
    }

    res.status(201).json({ message: 'درخواست با موفقیت شد', id: project_id }
    )
  } catch (error) {
    next(error)
  }
}

const editRequestProject = 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 user = await UserModel.findById(decodedToken.id)
    if (!user || user.user_type !== 'user') {
      return res.status(422).json({
        error: true, message: 'شما دسترسی به این بخش ندارید'
      })
    }
    if (user.is_verified !== 'verified') {
      return res.status(422).json({
        error: true, message: 'مدارک شما تایید نشده است'
      })
    }
    // اعتبارسنجی درخواست
    const errors = validationResult(req)
    if (!errors.isEmpty()) {
      return res.status(422).json({ errors: errors.array() })
    }
    const { request_time, offer_price, project_id } = req.body
    if (!project_id || !offer_price || !request_time
    ) {
      return res.status(422).json({
        error: true,
        message: 'اطلاعات ارسالی اشتباه است'
      })
    }
    // چک کردن برای وجود درخواست قبلی
    const existingRequest = await RequestModel.findOne({ project: project_id, user: user._id })
    if (!existingRequest) {
      return res.status(422).json({
        error: true,
        message: 'شما قبلاً برای این پروژه درخواست نداده‌اید'
      })
    }
    // اکنون می‌توانید اطلاعات درخواست را ویرایش کنید
    existingRequest.time = request_time
    existingRequest.price = offer_price
    await existingRequest.save()

    // ثبت اعلان برای سازنده پروژه
    const project = await ProjectModel.findById(project_id)
    const creatorId = project.creator_id

    const notification = new NotificationModel({
      user_id: creatorId,
      project_post_id: project_id,
      type: 'request',
      title: 'ویرایش پیشنهاد',
      description: `کاربر ${user.user_name} پیشنهاد خود را ویرایش کرد.`
    })
    await notification.save()
    res.status(200).json({
      message: 'درخواست با موفقیت ویرایش شد',
      id: project_id
    })
  } catch (error) {
    next(error)
  }
}
const acceptProject = async (req, res, next) => { }
module.exports = {
  requestProjectValidationRules,
  requestProject,
  acceptProject,
  editRequestProject
}
