/* eslint-disable camelcase */
const UserModel = require('../../../models/UserModel')
const jwt = require('jsonwebtoken')

const setUserName = async (req, res, next) => {
  try {
    const { mobile, user_name } = req.body
    if (!mobile || !user_name) {
      return res.status(422).json({
        error: true,
        message: 'اطلاعات ارسالی اشتباه است'
      })
    }

    // جستجوی کاربر با شماره موبایل ارسالی
    const user = await UserModel.findOne({ mobile })
    if (!user) {
      return res.status(404).json({
        error: true,
        message: 'کاربری با این شماره موبایل یافت نشد'
      })
    }
    // بررسی حداقل طول نام کاربری
    if (user_name.length < 5) {
      return res.status(422).json({
        error: true,
        message: 'نام کاربری باید حداقل 5 کاراکتر باشد'
      })
    }
    // بررسی محدودیت‌های مجاز در نام کاربری
    // const usernameRegex = /^[a-zA-Z0-9_]+$/
    // if (!usernameRegex.test(user_name)) {
    //   return res.status(422).json({
    //     error: true,
    //     message: 'نام کاربری فقط می‌تواند شامل حروف الفبای انگلیسی، اعداد و کاراکتر _ باشد'
    //   })
    // }
    // بررسی تکراری بودن user_name
    const existingUser = await UserModel.findOne({ user_name: { $regex: new RegExp('^' + user_name + '$', 'i') } })
    if (existingUser && existingUser._id.toString() !== user._id.toString()) {
      return res.status(422).json({
        error: true,
        message: 'نام کاربری تکراری است'
      })
    }

    // آپدیت نام کاربری به صورت lowercase
    user.user_name = user_name.toLowerCase()
    await user.save()

    return res.json({
      message: 'نام کاربری با موفقیت به‌روزرسانی شد'
    })
  } catch (error) {
    next(error)
  }
}

const updateUserName = 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 { user_name } = req.body

    if (!user_name) {
      return res.status(422).json({
        error: true,
        message: 'اطلاعات ارسالی اشتباه است'
      })
    }

    const user = await UserModel.findByIdAndUpdate(userId, { user_name }, { new: true })

    if (!user) {
      return res.status(404).json({
        error: true,
        message: 'کاربری با این شناسه یافت نشد'
      })
    }

    return res.json({
      message: 'نام کاربری با موفقیت به‌روزرسانی شد'
    })
  } catch (error) {
    next(error)
  }
}

module.exports = {
  setUserName, updateUserName
}
