const { getDB } = require('../../../utils/mongo')

let db = null

const connect = async () => {
    db = await getDB('stc-21-03')
}

const _idToId = (data) => {
    const { _id, ...rest } = data

    return {
        id: _id, ...rest,
    }
}

const FILM_TOMATOS_COLL = 'films-tomatos'
const getFilmData = async (filmId) => {
    if (db === null) throw new Error('no db connection')

    const filmsCollection = db.collection(FILM_TOMATOS_COLL)
    const data = await filmsCollection.find({
        filmId,
    }).toArray()

    if (data.length === 0) {
        const newData = {
            filmId,
            views: 0,
            ratings: [],
            likes: 0,
        }

        filmsCollection.insertMany([newData])

        return _idToId(newData)
    }
    const filmData = data[0]
    filmsCollection.updateOne({
        filmId,
    }, [
        {
            $set: {
                views: ++filmData.views,
            },
        },
    ])
    return _idToId(filmData)
}

const setLike = async (filmId) => {
    if (db === null) throw new Error('no db connection')

    const filmsCollection = db.collection(FILM_TOMATOS_COLL)
    const data = await filmsCollection.find({
        filmId,
    }).toArray()

    if (data.length === 0) {
        throw new Error('no film data')
    }

    const filmData = data[0]
    filmsCollection.updateOne({
        filmId,
    }, [
        {
            $set: {
                likes: ++filmData.likes,
            },
        },
    ])
    return _idToId(filmData)
}

const setRating = async ({ filmId, rating }) => {
    if (db === null) throw new Error('no db connection')

    const filmsCollection = db.collection(FILM_TOMATOS_COLL)
    const data = await filmsCollection.find({
        filmId,
    }).toArray()

    if (data.length === 0) {
        throw new Error('no film data')
    }

    const filmData = data[0]
    filmData.ratings = [...filmData.ratings, rating]
    filmsCollection.updateOne({
        filmId,
    }, [
        {
            $set: {
                ratings: filmData.ratings,
            },
        },
    ])
    return _idToId(filmData)
}

module.exports = {
    connect,
    getFilmData,
    setLike,
    setRating,
}