import Product from "../schemas/Product.js";
import multer from 'multer';

const upload = multer({ dest: 'uploads/' })

const imageUpload = upload.fields([
    { name: 'main_image' },
    { name: 'detail_image' }
])

const regist = async (req, res) => {
    try {
        const { pro_name, price, stock, main_category, sub_category, description, colors, sizes } = req.body
        const main_img = req.files['main_image'][0]
        const detail_img = req.files['detail_image']
        const main_imgUrl = main_img.filename
        const detail_imgUrls = []
        detail_img.forEach(file => {
            detail_imgUrls.push(file.filename)
        })
        const newProduct = await new Product({
            pro_name, price, stock, main_category, sub_category, description, main_imgUrl, detail_imgUrls, colors, sizes
        }).save()
        res.json(newProduct)
    } catch (error) {
        console.log(error)
        res.status(500).send('제품 정보 등록에 실패하였습니다. 다시 진행해 주십시오.')
    }
}

const getToHome = async (req, res) => {
    try {
        const bestProduct = await Product.find({}).sort({ purchase: -1 }).limit(6)
        const newProduct = await Product.find({}).sort({ createdAt: -1 }).limit(6)
        res.json({ bestProduct, newProduct })
    } catch {
        console.log(error)
        res.status(500).send('상품을 불러오지 못했습니다.')
    }
}

const getAll = async (req, res) => {
    const per = 9;
    try {
        if (req.query.product) {
            const productslist = await Product.find({ pro_name: { $regex: new RegExp(req.query.product) } }).sort({ createdAt: -1 })
            const length = productslist.length
            const productPiece = await Product.find({ pro_name: { $regex: new RegExp(req.query.product) } }).sort({ createdAt: -1 }).skip((req.query.page - 1) * per).limit(per)
            if (productslist.length == 0) {
                res.status(404).send('상품을 찾을 수 없습니다.')
            } else {
                res.json({ productPiece, length })
            }
        } else {
            const productslist = await Product.find({}).sort({ createdAt: -1 })
            const length = productslist.length
            const productPiece = await Product.find({}).sort({ createdAt: -1 }).skip((req.query.page - 1) * per).limit(per)
            res.json({ productPiece, length })
        }
    } catch (error) {
        console.log(error)
        res.status(500).send('상품을 불러오지 못했습니다.')
    }
}

const getlist = (req, res) => {
    try {
        if (req.str && req.length) {
            const str = req.str
            const productsPiece = req.productsPiece
            const length = req.length
            res.json({ productsPiece, length, str })
        } else if (req.str) {
            const str = req.str
            const productsPiece = req.productsPiece
            res.json({ productsPiece, str })
        } else {
            const productsPiece = req.productsPiece
            const length = req.length
            res.json({ productsPiece, length })
        }
    } catch (error) {
        console.log(error)
        res.status(500).send('상품을 불러오지 못했습니다.')
    }
}

const categoryId = async (req, res, next, category) => {
    const per = 9;
    try {
        if (req.query.product && req.query.method) {
            let method = ''
            let methodStr = ''
            switch (req.query.method) {
                case "purchase":
                    method = "purchase"
                    methodStr = '인기상품'
                    break;
                case "newest":
                    method = "createdAt"
                    methodStr = '신상품'
                    break;
                case "lowest":
                    method = "price"
                    methodStr = '낮은가격'
                    break;
                case "highest":
                    method = "price"
                    methodStr = '높은가격'
                    break;
            }
            req.str = methodStr
            if (req.query.method == 'lowest') {
                let productslist = await Product.find({ main_category: category, pro_name: { $regex: new RegExp(req.query.product) } }).sort({ [method]: 1 })
                let length = productslist.length
                req.length = length
                let productsPiece = await Product.find({ main_category: category, pro_name: { $regex: new RegExp(req.query.product) } }).sort({ [method]: 1 }).skip((req.query.page - 1) * per).limit(per)
                req.productsPiece = productsPiece
            } else {
                let productslist = await Product.find({ main_category: category, pro_name: { $regex: new RegExp(req.query.product) } }).sort({ [method]: -1 })
                let length = productslist.length
                req.length = length
                let productsPiece = await Product.find({ main_category: category, pro_name: { $regex: new RegExp(req.query.product) } }).sort({ [method]: -1 }).skip((req.query.page - 1) * per).limit(per)
                req.productsPiece = productsPiece
            }
        } else if (req.query.method) {
            let method = ''
            let methodStr = ''
            switch (req.query.method) {
                case "purchase":
                    method = "purchase"
                    methodStr = '인기상품'
                    break;
                case "newest":
                    method = "createdAt"
                    methodStr = '신상품'
                    break;
                case "lowest":
                    method = "price"
                    methodStr = '낮은가격'
                    break;
                case "highest":
                    method = "price"
                    methodStr = '높은가격'
                    break;
            }
            req.str = methodStr
            if (req.query.method == 'lowest') {
                let productsPiece = await Product.find({ main_category: category }).sort({ [method]: 1 }).skip((req.query.page - 1) * per).limit(per)
                req.productsPiece = productsPiece
            } else {
                let productsPiece = await Product.find({ main_category: category }).sort({ [method]: -1 }).skip((req.query.page - 1) * per).limit(per)
                req.productsPiece = productsPiece
            }
        } else if (req.query.product) {
            const productslist = await Product.find({ main_category: category, pro_name: { $regex: new RegExp(req.query.product) } }).sort({ createdAt: -1 })
            const length = productslist.length
            req.length = length
            const productsPiece = await Product.find({ main_category: category, pro_name: { $regex: new RegExp(req.query.product) } }).sort({ createdAt: -1 }).skip((req.query.page - 1) * per).limit(per)
            req.productsPiece = productsPiece
        } else {
            const productslist = await Product.find({ main_category: category }).sort({ createdAt: -1 })
            const length = productslist.length
            req.length = length
            const productsPiece = await Product.find({ main_category: category }).sort({ createdAt: -1 }).skip((req.query.page - 1) * per).limit(per)
            req.productsPiece = productsPiece
        }
        next()
    } catch (error) {
        console.log(error)
        res.status(500).send('상품을 불러오지 못했습니다.')
    }
}

const subname = async (req, res) => {
    const per = 9;
    try {
        if (req.query.method) {
            let method = ''
            let methodStr = ''
            switch (req.query.method) {
                case "purchase":
                    method = "purchase"
                    methodStr = '인기상품'
                    break;
                case "newest":
                    method = "createdAt"
                    methodStr = '신상품'
                    break;
                case "lowest":
                    method = "price"
                    methodStr = '낮은가격'
                    break;
                case "highest":
                    method = "price"
                    methodStr = '높은가격'
                    break;
            }
            let str = methodStr
            if (req.query.method == 'lowest') {
                let productsPiece = await Product.find({ sub_category: req.query.subname }).sort({ [method]: 1 }).skip((req.query.page - 1) * per).limit(per)
                res.send({ productsPiece, str })
            } else {
                let productsPiece = await Product.find({ sub_category: req.query.subname }).sort({ [method]: -1 }).skip((req.query.page - 1) * per).limit(per)
                res.send({ productsPiece, str })
            }
        } else {
            const productslist = await Product.find({ sub_category: req.query.subname }).sort({ createdAt: -1 })
            const length = productslist.length
            const productsPiece = await Product.find({ sub_category: req.query.subname }).sort({ createdAt: -1 }).skip((req.query.page - 1) * per).limit(per)
            res.send({ productsPiece, length })
        }
    } catch (error) {
        console.log(error)
        res.status(500).send('상품을 불러오지 못했습니다.')
    }
}

const plusPurchase = async (req, res) => {
    const { products } = req.body
    try {
        for (let i = 0; i < products.length; i++) {
            const count = products[i].count
            const product = await Product.findOne(
                { _id: products[i].productId._id }
            )
            const purchase = product.purchase
            const stock = product.stock
            await Product.updateOne(
                { _id: products[i].productId._id },
                {
                    $set:
                    {
                        purchase: count + purchase,
                        stock: stock - count
                    }
                }
            )
        }
        res.send("구매수 늘리기, 재고수 줄이기 성공")
    } catch (error) {
        console.log(error)
        res.status(500).send('구매숫자를 늘리지 못함')
    }
}

const deletePro = async (req, res) => {
    const pro_id = req.query.pro_id
    try {
        const productOne = await Product.findById(pro_id)
        if (productOne) {
            await Product.remove({ _id: pro_id })
        }
        res.send('삭제 성공')
    } catch (error) {
        console.log(error)
        res.status(500).send('삭제할 상품을 찾지 못하거나 삭제 중 문제가 발생했습니다.')
    }
}

export default { imageUpload, regist, getToHome, getAll, categoryId, getlist, subname, plusPurchase, deletePro }