'use strict';

const layergroupToken = require('../middlewares/layergroup-token');
const cleanUpQueryParams = require('../middlewares/clean-up-query-params');
const credentials = require('../middlewares/credentials');
const dbConnSetup = require('../middlewares/db-conn-setup');
const authorize = require('../middlewares/authorize');
const rateLimit = require('../middlewares/rate-limit');
const { RATE_LIMIT_ENDPOINTS_GROUPS } = rateLimit;
const dbParamsFromResLocals = require('../../utils/database-params');

module.exports = class AnalysisLayergroupController {
    constructor (analysisStatusBackend, pgConnection, userLimitsBackend, authBackend) {
        this.analysisStatusBackend = analysisStatusBackend;
        this.pgConnection = pgConnection;
        this.userLimitsBackend = userLimitsBackend;
        this.authBackend = authBackend;
    }

    register (mapRouter) {
        mapRouter.get('/:token/analysis/node/:nodeId', this.middlewares());
    }

    middlewares () {
        return [
            layergroupToken(),
            credentials(),
            authorize(this.authBackend),
            dbConnSetup(this.pgConnection),
            rateLimit(this.userLimitsBackend, RATE_LIMIT_ENDPOINTS_GROUPS.ANALYSIS),
            cleanUpQueryParams(),
            analysisNodeStatus(this.analysisStatusBackend)
        ];
    }
};

function analysisNodeStatus (analysisStatusBackend) {
    return function analysisNodeStatusMiddleware(req, res, next) {
        const { nodeId } = req.params;
        const dbParams = dbParamsFromResLocals(res.locals);

        analysisStatusBackend.getNodeStatus(nodeId, dbParams, (err, nodeStatus, stats = {}) => {
            req.profiler.add(stats);

            if (err) {
                err.label = 'GET NODE STATUS';
                return next(err);
            }

            res.set({
                'Cache-Control': 'public,max-age=5',
                'Last-Modified': new Date().toUTCString()
            });

            res.statusCode = 200;
            res.body = nodeStatus;

            next();
        });
    };
}
