const Slider = require('../models/Slider')
const dateFormat = require('dateformat')
const {body, validationResult} = require('express-validator')
const jimp = require('jimp')
const fs = require('fs')
const v_m = require('../validation_messages')

//////////////////////////////////////////////////////////////////////////////// create
module.exports.create = [
   [
      body('fa_title')
         .isLength({max: 40}).withMessage(v_m['fa'].max_char.max40),

      body('en_title')
         .isLength({max: 40}).withMessage(v_m['fa'].max_char.max40),

      body('fa_caption')
         .isLength({max: 100}).withMessage(v_m['fa'].max_char.max100),

      body('en_caption')
         .isLength({max: 100}).withMessage(v_m['fa'].max_char.max100)
   ],
   (req, res) => {
      const errors = validationResult(req)
      if (!errors.isEmpty()) return res.status(422).json({validation: errors.mapped()})

      if (req.files) {
         let file = req.files.image
         jimp.read(file.data)
            .then(img => {
               let fileName = 'image_' + Date.now() + '.' + img.getExtension()
               if (img.bitmap.width >= 1920 && img.bitmap.height >= 1080) {
                  if (file.size / 1024 < 450) {
                     file.mv(`./static/uploads/images/slider/${fileName}`, (err, img) => {
                        const slider = new Slider({
                           image: fileName,
                           slider_details: {
                              fa: {
                                 title: req.body.fa_title,
                                 caption: req.body.fa_caption
                              },
                              en: {
                                 title: req.body.en_title,
                                 caption: req.body.en_caption
                              }
                           },
                           created_at: dateFormat(Date.now(), 'yyyy-mm-dd HH:MM:ss')
                        })
                        slider.save((err, data) => {
                           if (err) return res.status(500).json({error: err})
                           return res.json({message: v_m['fa'].response.success_save})
                        })
                     })
                  } else {
                     return res.status(422).json({validation: {image: {msg: 'حجم تصویر نباید بیشتر از 450 کیلوبایت باشد'}}})
                  }
               } else {
                  return res.status(422).json({validation: {image: {msg: 'ابعاد تصویر حداقل 1920*1080 پیکسل قابل قبول میباشد.'}}})
               }
            })
            .catch(err => {
               console.log(err)
            })
      } else {
         return res.status(422).json({validation: {image: {msg: v_m['fa'].required.image}}})
      }
   }
]

//////////////////////////////////////////////////////////////////////////////// get all
module.exports.getAll = [
   (req, res) => {
      Slider.find({}, (err, slides) => {
         if (err) return res.status(404).json({error: err})
         return res.json(slides)
      })
   }
]

//////////////////////////////////////////////////////////////////////////////// get one
module.exports.getOne = [
   (req, res) => {
      Slider.findById(req.params.id, (err, slide) => {
         if (err) return res.status(404).json({error: v_m['fa'].not_found.item_id})
         return res.json(slide)
      })
   }
]

//////////////////////////////////////////////////////////////////////////////// update
module.exports.update = [
   [
      body('fa_title')
         .isLength({max: 40}).withMessage(v_m['fa'].max_char.max40),

      body('en_title')
         .isLength({max: 40}).withMessage(v_m['fa'].max_char.max40),

      body('fa_caption')
         .isLength({max: 100}).withMessage(v_m['fa'].max_char.max100),

      body('en_caption')
         .isLength({max: 100}).withMessage(v_m['fa'].max_char.max100)
   ],
   (req, res) => {
      const errors = validationResult(req)
      if (!errors.isEmpty()) return res.status(422).json({validation: errors.mapped()})

      const data = {
         slider_details: {
            fa: {
               title: req.body.fa_title,
               caption: req.body.fa_caption
            },
            en: {
               title: req.body.en_title,
               caption: req.body.en_caption
            }
         },
         updated_at: dateFormat(Date.now(), 'yyyy-mm-dd HH:MM:ss')
      }

      if (req.files) {
         let file = req.files.image
         jimp.read(file.data)
            .then(img => {
               let fileName = 'image_' + Date.now() + '.' + img.getExtension()
               data.image = fileName
               if (img.bitmap.width >= 1920 && img.bitmap.height >= 1080) {
                  if (file.size / 1024 < 450) {
                     file.mv(`./static/uploads/images/slider/${fileName}`, (err) => {
                        if (err) console.log(err)

                        Slider.findByIdAndUpdate(req.params.id, data, (err, oldSlide) => {
                           if (err) return res.status(500).json({error: err})
                           fs.unlink(`./static/${oldSlide.image}`, err => {
                              if (err) console.log(err)
                           })
                           return res.json({message: v_m['fa'].response.success_save})
                        })
                     })
                  } else {
                     return res.status(422).json({validation: {image: {msg: 'حجم تصویر نباید بیشتر از 450 کیلوبایت باشد'}}})
                  }
               } else {
                  return res.status(422).json({validation: {image: {msg: 'ابعاد تصویر حداقل 1920*1080 پیکسل قابل قبول میباشد.'}}})
               }
            })
            .catch(err => {
               console.log(err)
            })

      } else {
         Slider.findByIdAndUpdate(req.params.id, data, (err, oldSlide) => {
            if (err) return res.status(500).json({error: err})
            return res.json({message: v_m['fa'].response.success_save})
         })
      }
   }
]

//////////////////////////////////////////////////////////////////////////////// delete
module.exports.delete = [
   (req, res) => {
      Slider.findByIdAndRemove(req.params.id, (err, data) => {
         if (err) return res.json({error: err})
         fs.unlink(`./static/${data.image}`, err => {
            if (err) console.log(err)
         })
         return res.json({message: v_m['fa'].response.success_remove})
      })
   }
]
