/* eslint-disable camelcase */
const { ProvinceModel, CityModel } = require('../../../models/StateCity')
const ProjectModel = require('../../../models/ProjectModel')
const UserModel = require('../../../models/UserModel')
const { check, validationResult } = require('express-validator')
const jwt = require('jsonwebtoken')
const createProjectValidationRules = () => {
  return [
    check('title').notEmpty().withMessage('عنوان نمی‌تواند خالی باشد'),

    check('expertise').notEmpty().withMessage('تخصص نمی‌تواند خالی باشد'),

    check('gender')
      .isIn(['male', 'female'])
      .withMessage('جنسیت باید male یا female باشد'),

    check('age').notEmpty().withMessage('سن نمی‌تواند خالی باشد'),

    check('conversation_projects')
      .notEmpty()
      .withMessage('پروژه‌های مکالمه نمی‌تواند خالی باشد')
      .isBoolean()
      .withMessage('مقدار پروژه‌های مکالمه باید یک مقدار boolean باشد'),

    check('province').notEmpty().withMessage('استان نمی‌تواند خالی باشد'),

    check('city').notEmpty().withMessage('شهر نمی‌تواند خالی باشد'),

    check('offer_time')
      .notEmpty()
      .withMessage('زمان پروژه نمی‌تواند خالی باشد'),

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

    check('description')
      .notEmpty()
      .withMessage('توضیحات نمی‌تواند خالی باشد'),

    check('project_type')
      .notEmpty()
      .withMessage('نوع پروژه نمی‌تواند خالی باشد')
      .isIn(['free', 'normal', 'force', 'highlight'])
      .withMessage('نوع پروژه باید normal یا force یا highlight باشد')
  ]
}

const createProject = 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) {
      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 {
      title,
      expertise,
      sub_expertise,
      gender,
      age,
      conversation_projects,
      province,
      city,
      offer_time,
      offer_price,
      description,
      project_type,
      public_status,
      created_for_user,
      number_of_person
    } = req.body
    if (
      !title ||
      !expertise ||
      !age ||
      conversation_projects === null ||
      !province ||
      !city ||
      !offer_time ||
      !offer_price ||
      !description ||
      !project_type
    ) {
      return res.status(422).json({
        error: true,
        message: 'اطلاعات ارسالی اشتباه است'
      })
    }

    const provinceFind = await ProvinceModel.findOne(
      { id: province },
      { _id: 0 }
    )
    const cityFind = await CityModel.findOne({ id: city })
    // اگر پروژه برای یک کاربر خاص باید ساخته شود
    if (public_status && public_status === 'private' && created_for_user) {
      const createdUser = await UserModel.findById(created_for_user)
      if (!createdUser) {
        return res.status(422).json({
          error: true, message: 'کاربر مورد نظر برای ساخت پروژه یافت نشد'
        })
      }
      // ایجاد شیء پروژه
      const projectData = {
        title,
        expertise,
        sub_expertise,
        gender,
        age,
        conversation_projects,
        province,
        city,
        offer_time,
        offer_price,
        description,
        project_type,
        creator_id: user._id, // ارتباط با کاربر
        public_status,
        created_for_user
      }

      // ساخت شیء پروژه
      const project = new ProjectModel(projectData)

      // ذخیره کردن رکورد در پایگاه داده
      await project.save()

      res.status(201).json({ message: 'پروژه با موفقیت ساخته شد', id: project._id }
      )
    } else {
      if (number_of_person > 1) {
        for (let i = 1; i <= number_of_person; i++) {
          let currentProjectType

          if (project_type === 'free' && i === 1) {
            currentProjectType = 'free'
          } else if (project_type === 'highlight' || project_type === 'force') {
            currentProjectType = project_type
          } else {
            currentProjectType = 'normal'
          }

          const newProject = new ProjectModel({
            title: `${title}_${i}`,
            expertise,
            sub_expertise,
            gender,
            age,
            conversation_projects,
            province: provinceFind,
            city: cityFind,
            offer_time,
            offer_price,
            description,
            creator_id: user._id, // ارتباط با کاربر
            project_type: currentProjectType,
            public_status,
            created_for_user
          })

          // ذخیره کردن رکورد در پایگاه داده
          await newProject.save()
        }

        res.status(201).json({
          message: 'پروژه‌ها با موفقیت ساخته شدند'
        })
      } else {
        const project = new ProjectModel({
          title,
          expertise,
          sub_expertise,
          gender,
          age,
          conversation_projects,
          province: provinceFind,
          city: cityFind,
          offer_time,
          offer_price,
          description,
          creator_id: user._id, // ارتباط با کاربر
          project_type
        })

        // ذخیره کردن رکورد در پایگاه داده
        await project.save()

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

module.exports = {
  createProjectValidationRules,
  createProject
}
