const parseBoolean = (value) => {
    return value === 'true'
}

const register = (app, pool) => {

    app.get('/v1/categories/count', (req, res, next) => {
        pool.query(
            "SELECT COUNT(*) AS counter FROM categories",
            (err, rows, fields) => {
                if (err) {
                    return next(err)
                }
                if (rows.length === 0) {
                    res.status(404).end()
                    return
                }
                res.json(rows[0])
            }
        )
    })

    app.get('/v1/collections/:collectionId/categories/count', (req, res, next) => {
        pool.query(
            `SELECT COUNT(DISTINCT s.category_id) AS counter
              FROM collections_series cs
              JOIN series s
                ON s.id = cs.series_id
             WHERE cs.collection_id = :collectionId`,
            {
                "collectionId": req.params.collectionId
            },
            (err, rows, fields) => {
                if (err) {
                    return next(err)
                }
                if (rows.length === 0) {
                    res.status(404).end()
                    return
                }
                res.json(rows[0])
            }
        )
    })

    app.get('/v1/categories', (req, res, next) => {
        pool.query(
            `SELECT id
                 , name
                 , name_ru
                 , slug
                 , hidden
             FROM categories`,
            (err, rows, fields) => {
                if (err) {
                    return next(err)
                }
                res.json(rows)
            }
        )
    })

    app.post('/v1/categories', (req, res, next) => {
        pool.query(
            `INSERT
              INTO categories
                 ( name
                 , name_ru
                 , slug
                 , hidden
                 , created_at
                 , created_by
                 , updated_at
                 , updated_by
                 )
            VALUES
                ( :name
                , :name_ru
                , :slug
                , :hidden
                , CURRENT_TIMESTAMP
                , :user_id
                , CURRENT_TIMESTAMP
                , :user_id
                )`,
            {
                "name": req.body.name,
                "name_ru": req.body.name_ru,
                "slug": req.body.slug,
                "hidden": req.body.hidden,
                "user_id": req.body.user_id
            },
            (err, rows, fields) => {
                if (err) {
                    return next(err)
                }
                res.sendStatus(204)
            }
        )
    })

    app.get('/v1/categories/search', (req, res, next) => {
        pool.query(
            `SELECT id
                 , name
                 , name_ru
                 , slug
                 , hidden
             FROM categories
            WHERE hidden = :hidden`,
            {
                "hidden": parseBoolean(req.query.hidden)
            },
            (err, rows, fields) => {
                if (err) {
                    return next(err)
                }
                res.json(rows)
            }
        )
    })

    app.get('/v1/categories/:categoryId', (req, res, next) => {
        pool.query(
            `SELECT id
                 , name
                 , name_ru
                 , slug
                 , hidden
              FROM categories
             WHERE id = :categoryId`,
            {
                "categoryId": req.params.categoryId
            },
            (err, rows, fields) => {
                if (err) {
                    return next(err)
                }
                if (rows.length === 0) {
                    res.status(404).end()
                    return
                }
                res.json(rows[0])
            }
        )
    })

    app.put('/v1/categories/:categoryId', (req, res, next) => {
        pool.query(
            `UPDATE categories
               SET name = :name
                 , name_ru = :name_ru
                 , slug = :slug
                 , hidden = :hidden
                 , updated_at = CURRENT_TIMESTAMP
                 , updated_by = :user_id
             WHERE id = :categoryId`,
            {
                "name": req.body.name,
                "name_ru": req.body.name_ru,
                "slug": req.body.slug,
                "hidden": req.body.hidden,
                "user_id": req.body.user_id,
                "categoryId": req.params.categoryId
            },
            (err, rows, fields) => {
                if (err) {
                    return next(err)
                }
                res.sendStatus(204)
            }
        )
    })

    app.delete('/v1/categories/:categoryId', (req, res, next) => {
        pool.query(
            `DELETE
              FROM categories
             WHERE id = :categoryId`,
            {
                "categoryId": req.params.categoryId
            },
            (err, rows, fields) => {
                if (err) {
                    return next(err)
                }
                res.sendStatus(204)
            }
        )
    })

}

exports.register = register