import { KU, Schedule } from "../db/index.js";
import sequelize from 'sequelize';

const { Op } = sequelize

const findbyId = async (req, res, next) => {
    try {
        const id = req.scheduleId
        const userId = req.userId
        let findSchedule = null
        let startDate = null
        let endDate = null
        if (id && userId) {
            if (userId === "ku") {
                findSchedule = await KU.findOne({ where: { id: id } })
                if (!findSchedule) throw new Error("해당 일정을 찾지 못했습니다.")
                else {
                    const { id, title, start, end, memo } = findSchedule
                    startDate = dateToString(start, "full")
                    endDate = dateToString(end, "full")
                    req.schedule = { id, title, startDate: startDate, endDate: endDate, memo }
                }
            } else {
                findSchedule = await Schedule.findOne({ where: { [Op.and]: [{ id: id }, { userId: userId }] } })
                if (!findSchedule) throw new Error("해당 일정을 찾지 못했습니다.")
                else {
                    const { id, title, start, end, location, memo } = findSchedule
                    startDate = dateToString(start, "full")
                    endDate = dateToString(end, "full")
                    const startTime = dateToString(start, "time")
                    const endTime = dateToString(end, "time")
                    req.schedule = { id, title, startDate, endDate, startTime, endTime, location, memo }
                }
            }
            next()
        } else next()
    } catch (error) {
        return res.status(500).send(error.message || "일정 가져오는 중 에러 발생")
    }
}

const findbyDate = async (req, res, next) => {
    try {
        if (req.date || req.month) {
            let date = ""
            let findList = null
            if (req.date) {
                date = new Date(req.date)
                if (req.userId === "ku") {
                    findList = await KU.findAll({
                        where: {
                            [Op.and]: [
                                {
                                    start: {
                                        [Op.lte]: date
                                    }
                                }, {
                                    end: {
                                        [Op.gte]: date
                                    }
                                }
                            ]
                        }, order: [['updatedAt', 'DESC']]
                    })
                    findList.forEach(schedule => {
                        schedule.dataValues.start = dateToString(schedule.start, "twoYear")
                        schedule.dataValues.end = dateToString(schedule.end, "twoYear")
                    })
                } else {
                    findList = await Schedule.findAll({
                        where: {
                            [Op.and]: [
                                {
                                    start: {
                                        [Op.lte]: date
                                    }
                                }, {
                                    end: {
                                        [Op.gte]: date
                                    }
                                }
                            ]
                        }, order: [['updatedAt', 'DESC']]
                    })
                }
            } else {
                date = new Date(req.month)
                const year = dateToString(date, "year")
                const month = dateToString(date, "month")
                const findKUList = await KU.findAll({
                    where: {
                        [Op.or]: [
                            {
                                [Op.and]: [
                                    sequelize.where(sequelize.fn('date_part', 'year', sequelize.col('start')), year),
                                    sequelize.where(sequelize.fn('date_part', 'month', sequelize.col('start')), month)
                                ]
                            }, {
                                [Op.and]: [
                                    sequelize.where(sequelize.fn('date_part', 'year', sequelize.col('end')), year),
                                    sequelize.where(sequelize.fn('date_part', 'month', sequelize.col('end')), month)
                                ]
                            }
                        ]
                    }, attributes: ['id', 'title', 'start', 'end']
                    , order: [['start']]
                })
                if (req.userId === "ku") {
                    // console.log("list==",findList)
                    findKUList.forEach(schedule => {
                        // const find = findList.find(el => {
                        //     if (el.dataValues.start <= schedule.dataValues.start) {
                        //         if (el.dataValues.end >= schedule.dataValues.start) return el
                        //     } else if (el.dataValues.start <= schedule.dataValues.end) return el
                        // })
                        // console.log("find==",find.dataValues)
                        if (dateToString(schedule.start, "full") !== dateToString(schedule.end, "full")) schedule.dataValues.end = schedule.dataValues.end.setDate(schedule.dataValues.end.getDate() + 1)
                        schedule.dataValues.allDay = true
                        schedule.dataValues.className = 'text'
                    })
                    findList = findKUList
                } else {
                    const findIndividualList = await Schedule.findAll({
                        where: {
                            [Op.or]: [
                                {
                                    [Op.and]: [
                                        sequelize.where(sequelize.fn('date_part', 'year', sequelize.col('start')), year),
                                        sequelize.where(sequelize.fn('date_part', 'month', sequelize.col('start')), month)
                                    ]
                                }, {
                                    [Op.and]: [
                                        sequelize.where(sequelize.fn('date_part', 'year', sequelize.col('end')), year),
                                        sequelize.where(sequelize.fn('date_part', 'month', sequelize.col('end')), month)
                                    ]
                                }
                            ]
                        }, attributes: ['id', 'title', 'start', 'end']
                        , order: [['start']]
                    })
                    console.log("개인 일정 찾기", findIndividualList)
                    findList = { KU: findKUList, individual: findIndividualList }
                }
            }
            req.scheduleList = findList
            next()
        } else next()
    } catch (error) {
        return res.status(500).send(error.message || "일정 가져오는 중 에러 발생")
    }
}

const create = async (req, res) => {
    try {
        let newSchedule = null
        let start = null
        let end = null
        const userId = req.userId
        if (userId === "ku") {
            const { title, startDate, endDate, memo } = req.body
            start = new Date(startDate)
            end = new Date(endDate)
            newSchedule = await KU.create({ title: title, start: start, end: end, memo: memo })
        } else {
            const { title, startDate, endDate, startTime, endTime, allDay, location, memo } = req.body
            if (allDay === "on") {
                start = new Date(startDate)
                end = new Date(endDate)
            } else {
                start = new Date(startDate + " " + startTime)
                end = new Date(endDate + " " + endTime)
            }
            newSchedule = await Schedule.create({ title: title, start: start, end: end, location: location, memo: memo, userId: userId })
        }
        return res.json(newSchedule)
    } catch (error) {
        return res.status(500).send(error.message || "일정 등록 중 에러 발생")
    }
}

const edit = async (req, res) => {
    try {
        let updated = null
        let start = null
        let end = null
        const userId = req.userId
        const { scheduleId } = req.query
        if (userId === "ku") {
            const { title, startDate, endDate, memo } = req.body
            start = new Date(startDate)
            end = new Date(endDate)
            updated = await KU.update({ title: title, start: start, end: end, memo: memo }, { where: { id: scheduleId } })
        } else {
            const { title, startDate, endDate, startTime, endTime, allDay, location, memo } = req.body
            if (allDay === "on") {
                start = new Date(startDate)
                end = new Date(endDate)
            } else {
                start = new Date(startDate + " " + startTime)
                end = new Date(endDate + " " + endTime)
            }
            updated = await Schedule.update({ title: title, start: start, end: end, location: location, memo: memo },
                { where: { [Op.and]: [{ id: scheduleId }, { userId: userId }] } })
        }
        if (!updated) throw new Error("해당 일정의 일부 정보를 수정하는데 실패하였습니다.")
        else return res.send(200)
    } catch (error) {
        return res.status(500).send(error.message || "일정 수정 중 에러 발생")
    }
}

const remove = async (req, res) => {
    try {
        let deleted = null
        const userId = req.userId
        const { scheduleId } = req.query
        if (userId === "ku") deleted = await KU.destroy({ where: { id: scheduleId } })
        else deleted = await Schedule.destroy({ where: { [Op.and]: [{ id: scheduleId }, { userId: userId }] } })
        if (!deleted) throw new Error("해당 일정을 삭제하는데 실패하였습니다.")
        else return res.send(200)
    } catch (error) {
        return res.status(500).send(error.message || "일정 삭제 중 에러 발생")
    }
}

const getParams = async (req, res, next) => {
    try {
        const { userId } = req.params
        console.log("getParams", userId)
        req.userId = userId
        next()
    } catch (error) {
        return res.status(500).send(error.message || "일정 가져오는 중 에러 발생")
    }
}

const querySeparation = async (req, res, next) => {
    try {
        const { scheduleId, date, dateMonth } = req.query
        req.scheduleId = scheduleId
        req.date = date
        req.month = dateMonth
        next()
    } catch (error) {
        return res.status(500).send(error.message || "일정 가져오는 중 에러 발생")
    }
}

const send = async (req, res) => {
    try {
        const result = req.schedule || req.scheduleList
        return res.json(result)
    } catch (error) {
        return res.status(500).send(error.message || "일정 가져오는 중 에러 발생")
    }
}

function dateToString(dateObj, method) {
    const year = dateObj.getFullYear()
    const year_disit = String(year).substring(2, 4)
    const month = dateObj.getMonth() + 1
    const date = dateObj.getDate()
    const hour = dateObj.getHours()
    const minute = dateObj.getMinutes()

    switch (method) {
        case "full":
            return [year, (month > 9 ? "" : "0") + month, (date > 9 ? "" : "0") + date].join("-")
        case "twoYear":
            return [year_disit, (month > 9 ? "" : "0") + month, (date > 9 ? "" : "0") + date].join("-")
        // case "dateTime":
        //     return [year, (month > 9 ? "" : "0") + month, (date > 9 ? "" : "0") + date, ].join("-")
        case "time":
            return [(hour > 9 ? "" : "0") + hour, (minute > 9 ? "" : "0") + minute].join(":")
        case "year":
            return year
        case "month":
            return month
    }
}

export default {
    findbyId,
    findbyDate,
    create,
    edit,
    remove,
    getParams,
    querySeparation,
    send
}