/* eslint-disable no-unused-vars */
/* eslint-disable camelcase */
const { default: mongoose } = require('mongoose')
const UserModel = require('../../../models/UserModel')
const jMoment = require('moment-jalaali')
const NotificationModel = require('../../../models/NotificationModel')
const { default: axios } = require('axios')

const getUsers = async (req, res, next) => {
  try {
    // بررسی توکن
    const token = req.header('Authorization')?.split(' ')[1];
    if (!token) return res.status(401).send('Access Denied');

    // پارامترهای query
    const {
      page = 1,
      limit = 20,
      expertise,
      most_price,
      most_requests,
      age,
      gender,
      startDate,
      endDate,
      status,
      search
    } = req.query;

    const filter = {}; // شرط‌های فیلتر

    // فیلتر تاریخ
    if (startDate || endDate) {
      filter.createdAt = {};
      if (startDate) filter.createdAt.$gte = new Date(startDate);
      if (endDate) filter.createdAt.$lte = new Date(endDate);
    }

    // فیلتر وضعیت
    if (status) {
      filter.is_verified = status;
    }

    // فیلتر سرچ
    if (search) {
      const regex = new RegExp(search, "i"); // i = ignore case
      filter.$or = [
        { first_name: regex },
        { last_name: regex },
        { user_name: regex },
        { mobile: regex }
      ];
    }

    // فیلترهای دیگر (اختیاری)
    if (expertise) filter.expertise = expertise;
    if (age) filter.age = age;
    if (gender) filter.gender = gender;

    // گزینه‌های صفحه‌بندی
    const options = {
      page: parseInt(page),
      limit: parseInt(limit),
      sort: { createdAt: -1 }
    };

    // گرفتن کاربران با paginate
    const users = await UserModel.paginate(filter, options);

    // آماده‌سازی خروجی
    const newUsers = users.docs.map(user => ({
      _id: user._id,
      mobile: user.mobile,
      user_name: user.user_name,
      first_name: user.first_name,
      last_name: user.last_name,
      user_type: user.user_type,
      is_verified: user.is_verified,
      profile_image: user.profile_image,
      expertise: user.expertise,
      sub_expertise: user.sub_expertise,
      gender: user.gender,
      national_code: user.national_code,
      province: user.province,
      city: user.city,
      last_online: jMoment(user.last_online).format('jYYYY-jMM-jDD HH:mm'),
      createdAt: jMoment(user.createdAt).format('jYYYY-jMM-jDD HH:mm'),
      block_status: user.block_status
    }));

    res.status(200).json({
      users: newUsers,
      totalPages: users.totalPages,
      totalItems: users.totalDocs
    });
  } catch (error) {
    console.error('Error in getUsers:', error);
    res.status(500).json({ message: 'خطا در دریافت کاربران.' });
  }
};



// const getUsers = async (req, res, next) => {
//   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 {
//       page = 1,
//       limit = 10,
//       expertise,
//       most_price,
//       most_requests,
//       age,
//       gender,
//       startDate,
//       endDate,
//       status
//     } = req.query
//     const filter = {} // افزودن شرط‌های دیگر برای فیلتر

//     // Date
//     if (startDate || endDate) {
//       filter.createdAt = {}

//       if (startDate) {
//         filter.createdAt.$gte = new Date(startDate) // تاریخ شروع
//       }

//       if (endDate) {
//         filter.createdAt.$lte = new Date(endDate) // تاریخ پایان
//       }
//     }

//     if (status) {
//       filter.is_verified = status
//     }

//     // if (expertise) {
//     //   filter.expertise = expertise
//     // }
//     // if (age) {
//     //   filter.age = age
//     // }
//     // if (gender) {
//     //   filter.gender = gender
//     // }
//     // استفاده از مدل پیجینیت شده برای دریافت نتایج صفحه‌بندی شده
//     const options = {
//       page: parseInt(page), // تبدیل صفحه به عدد صحیح
//       limit: parseInt(limit), // تبدیل محدودیت به عدد صحیح
//       sort: { createdAt: -1 }
//     }
//     const users = await UserModel.paginate(filter, options)
//     const newUsers = users.docs.map(user => ({
//       _id: user._id,
//       mobile: user.mobile,
//       user_name: user.user_name,
//       first_name: user.first_name,
//       last_name: user.last_name,
//       user_type: user.user_type,
//       is_verified: user.is_verified,
//       profile_image: user.profile_image,
//       expertise: user.expertise,
//       sub_expertise: user.sub_expertise,
//       gender: user.gender,
//       national_code: user.national_code,
//       province: user.province,
//       city: user.city,
//       last_online: jMoment(user.last_online).format('jYYYY-jMM-jDD HH:mm'),
//       createdAt: jMoment(user.createdAt).format('jYYYY-jMM-jDD HH:mm'),
//       block_status: user.block_status
//     }))
//     res.status(200).json({
//       users: newUsers,
//       totalPages: users.totalPages, // ارسال تعداد کل صفحات
//       totalItems: users.totalDocs // ارسال تعداد کل آیتم‌ها
//     })
//   } catch (error) {
//     // در صورت بروز خطا، ارسال پیام خطا به کاربر
//     console.error('Error in getProjectTypes:', error)
//     res.status(500).json({ message: 'خطا در دریافت انواع پروژه.' })
//   }
// }
const getUserDetail = 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

    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 = {
      _id: user?._id,
      profile_image: user?.profile_image,
      first_name: user?.first_name,
      last_name: user?.last_name,
      user_name: user?.user_name,
      mobile: user?.mobile,
      national_code: user?.national_code,
      province: user?.province,
      city: user?.city,
      address: user?.address,
      height: user?.height,
      weight: user?.weight,
      size: user?.size,
      birthday: user?.birthday,
      show_location: user?.show_location,
      cooperation_abroad: user?.cooperation_abroad,
      conversation_projects: user?.conversation_projects,
      expertise: user?.expertise,
      sub_expertise: user?.sub_expertise,
      shaba: user?.shaba,
      national_card_image: user?.national_card_image,
      last_online: jMoment(user?.last_online).format('jYYYY-jMM-jDD HH:mm'),
      createdAt: jMoment(user?.createdAt).format('jYYYY-jMM-jDD HH:mm'),
      block_status: user?.block_status,
      user_level: user?.user_level,
      user_type: user?.user_type,
      user_score: user?.user_score,
      services :user?.services,
      is_verified: user?.is_verified,
      rate: user?.rate,
      bio: user?.bio,
      eye_color: user?.eye_color,
      hair_color: user?.hair_color,
      lat: user?.lat,
      lng: user?.lng
    }
    return res.status(200).json({ user: response })
  } catch (error) {
    next(error)
  }
}
const updateUser = async (req, res, next) => {
  try {
    const userId = req.query.userId // دریافت شناسه کاربر از درخواست

    // چک کردن اعتبار شناسه کاربر
    if (!mongoose.Types.ObjectId.isValid(userId)) {
      return res.status(400).json({ message: 'شناسه کاربر معتبر نیست' })
    }

    // فیلدهایی که می‌خواهید آپدیت شوند را از درخواست دریافت کنید
    const updateFields = req.body

    // اجرای آپدیت و بازگشت مقدار آپدیت شده
    const updatedUser = await UserModel.findByIdAndUpdate(
      userId,
      updateFields,
      { new: true }
    )

    // بررسی آیا کاربر وجود دارد یا نه
    if (!updatedUser) {
      return res.status(404).json({ message: 'کاربر مورد نظر یافت نشد' })
    }

    // ارسال پاسخ با مقادیر آپدیت شده
    res.status(200).json({ message: 'کاربر با موفقیت ویرایش شد', id: updatedUser._id })
  } catch (error) {
    const errors = []

    if (error.code === 11000) {
      // Duplicate key error
      for (const key in error.keyValue) {
        errors.push({ message: `ارور در فیلد ${key}` })
      }
    } else {
      errors.push({ message: 'خطا در آپدیت کاربر' })
    }

    res.status(500).json({ errors })
  }
}
const verifyUser = async (req, res, next) => {
  try {
    const userId = req.query.userId // دریافت شناسه کاربر از درخواست
    const user = await UserModel.findById(userId)
    if (!user) {
      return res.status(404).json({ message: 'کاربر مورد نظر یافت نشد' })
    }
    user.is_verified = 'verified';
    user.is_Register = true;
    await user.save();
    

    const notification = new NotificationModel({
      user_id: userId,
      type: 'verify',
      title: 'تایید مدارک',
      description: 'مدارک ارسالی شما با موفقیت تایید شد'
    })
    await notification.save()

    // Sms

    const userReciver = await UserModel.findById(userId)

    const data = JSON.stringify({
      mobile: userReciver?.mobile,
      templateId: '632057',
      parameters: [
        { name: 'USERS', value: userReciver?.first_name + ' ' + userReciver?.last_name }
      ]
    })

    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)
      })

    // End Sms

    // ارسال پاسخ با مقادیر آپدیت شده
    res.status(200).json({ message: 'مدارک کاربر با موفقیت تایید شد' })
  } catch (error) {
    next(error)
  }
}

const updateUserStatus = async (req, res, next) => {
  try {
    const { userId, block_status } = req.body;


    if (!mongoose.Types.ObjectId.isValid(userId)) {
      return res.status(400).json({ message: 'شناسه کاربر معتبر نیست' });
    }

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

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

    res.status(200).json({ message: 'وضعیت کاربر با موفقیت تغییر کرد', block_status: user.block_status });
  } catch (error) {
    console.error(error);
    res.status(500).json({ message: 'خطای سرور' });
  }
};

const rejectUser = async (req, res, next) => {
  try {
    const userId = req.query.userId // دریافت شناسه کاربر از درخواست
    const user = await UserModel.findById(userId)
    if (!user) {
      return res.status(404).json({ message: 'کاربر مورد نظر یافت نشد' })
    }
    user.is_verified = 'rejected'
    user.is_Register = false
    await user.save()
    const notification = new NotificationModel({
      user_id: userId,
      type: 'reject-user',
      title: 'رد مدارک',
      description: 'مدارک ارسالی شما رد شد، برای اطلاعات بیشتر از بخش تیکت به پشتیبانی پیام دهید.'
    })
    await notification.save()

    // ارسال پاسخ با مقادیر آپدیت شده
    res.status(200).json({ message: 'مدارک کاربر با موفقیت رد شد' })
  } catch (error) {
    next(error)
  }
}
const changePass = async (req, res, next) => {
  try {
    const { userId, password } = req.body;
    const user = await UserModel.findById(userId)
    if (!user) {
      return res.status(404).json({ message: 'کاربر مورد نظر یافت نشد' })
    }
    user.password = password
    await user.save()

    // ارسال پاسخ با مقادیر آپدیت شده
    res.status(200).json({ message: 'رمز عبور با موفقیت تغییر کرد' });
  } catch (error) {
    next(error)
  }
}
module.exports = {
  getUsers, getUserDetail, updateUser, verifyUser, rejectUser, updateUserStatus, changePass
}
