'use strict';

const logger = require('../logger');
const ClientMetrics = require('../client-metrics');
const ClientMetricsService = require('../client-metrics/service');

module.exports = function (app, config) {
    const {
        clientMetricsStore,
        clientStrategyStore,
        clientInstanceStore,
    } = config.stores;
    const metrics = new ClientMetrics();
    const service = new ClientMetricsService(clientMetricsStore);

    service.on('metrics', (entries) => {
        entries.forEach((m) => {
            metrics.addPayload(m.metrics);
        });
    });

    app.get('/metrics', (req, res) => {
        res.json(metrics.getMetricsOverview());
    });

    app.get('/metrics/features', (req, res) => {
        res.json(metrics.getTogglesMetrics());
    });

    app.post('/client/metrics', (req, res) => {
        try {
            const data = typeof req.body === 'string' ? JSON.parse(req.body) : req.body;
            service
                .insert(data)
                .catch(e => logger.error('Error inserting metrics data', e));
        } catch (e) {
            logger.error('Error receiving metrics', e);
        }

        res.end();
    });

    app.post('/client/register', (req, res) => {
        const data = req.body;
        const clientIp = req.ip;
        console.log(data);
        clientStrategyStore.insert(data.appName, data.strategies)
            .then(() => clientInstanceStore.insert({
                appName: data.appName,
                instanceId: data.instanceId,
                clientIp,
            }))
            .then(() => console.log('new client registerd'))
            .catch((error) => logger.error('Error registering client', error));

        res.end();
    });

    app.get('/client/strategies', (req, res) => {
        clientStrategyStore.getAll().then(data => res.json(data));
    });

    app.get('/client/instances', (req, res) => {
        clientInstanceStore.getAll()
            .then(data => res.json(data))
            .catch(err => console.error(err));
    });
};