/* eslint-disable camelcase */
const UserModel = require('../../../models/UserModel')
const { check, validationResult } = require('express-validator')
const jwt = require('jsonwebtoken')

const saveAuthValidationRules = () => {
  return [
    check('shaba').notEmpty().withMessage('شماره شبا نمی‌تواند خالی باشد')
      .matches(/^(?=.{24}$)[0-9]*$/).withMessage('فرمت شماره شبا صحیح نیست'),
    check('birthday').notEmpty().withMessage('تاریخ تولد نمی‌تواند خالی باشد'),
    check('national_code').notEmpty().withMessage('کد ملی نمی‌تواند خالی باشد')
      .isLength({ min: 10, max: 10 }).withMessage('کد ملی باید 10 رقم باشد')
  ]
}

const saveAuth = async (req, res, next) => {
  try {
    const token = req.header('Authorization').split(' ')[1]
    if (!token) return res.status(401).send('Access Denied')
    const errors = validationResult(req)
    if (!errors.isEmpty()) {
      return res.status(422).json({ errors: errors.array() })
    }
    const { shaba, birthday, national_code } = req.body
    if (!shaba || !birthday || !national_code) {
      return res.status(422).json({
        error: true,
        message: 'اطلاعات ارسالی اشتباه است'
      })
    }

    // جستجوی کاربر با شماره موبایل ارسالی
    const decodedToken = jwt.verify(token, process.env.APP_SECRET)
    const user = await UserModel.findById(decodedToken.id)
    if (!user) {
      return res.status(404).json({
        error: true,
        message: 'کاربری با این شماره موبایل یافت نشد'
      })
    }

    // بررسی تکراری بودن کد ملی
    const existingUserWithNationalCode = await UserModel.findOne({ national_code })
    if (existingUserWithNationalCode && existingUserWithNationalCode._id.toString() !== user._id.toString()) {
      return res.status(409).json({
        error: true,
        message: 'کد ملی تکراری است'
      })
    }
    user.shaba = shaba
    user.birthday = birthday
    user.national_code = national_code
    await user.save()

    return res.json({
      message: 'اطلاعات با موفقیت به‌روزرسانی شد'
    })
  } catch (error) {
    next(error)
  }
}
const updateShaba = async (req, res, next) => {
  try {
    const token = req.header('Authorization').split(' ')[1]
    if (!token) return res.status(401).send('Access Denied')

    const errors = validationResult(req)
    if (!errors.isEmpty()) {
      return res.status(422).json({ errors: errors.array() })
    }

    const { shaba } = req.body

    if (!shaba) {
      return res.status(422).json({
        error: true,
        message: 'شبا ارسال نشده است'
      })
    }

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

    // جستجوی کاربر با استفاده از شناسه کاربر
    const user = await UserModel.findById(userId)

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

    // فقط شبا را به‌روزرسانی کنید
    user.shaba = shaba
    await user.save()

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

module.exports = {
  saveAuth, saveAuthValidationRules, updateShaba
}
