'use strict';

const Controller = require('../controller');
const { clientRegisterSchema: schema } = require('./register-schema');

class RegisterController extends Controller {
    constructor({ clientInstanceStore, clientApplicationsStore }, getLogger) {
        super();
        this.logger = getLogger('/api/client/register');
        this.clientInstanceStore = clientInstanceStore;
        this.clientApplicationsStore = clientApplicationsStore;

        this.post('/', this.handleRegister);
    }

    async handleRegister(req, res) {
        const data = req.body;
        const { value, error } = schema.validate(data);

        if (error) {
            this.logger.warn('Invalid client data posted', error);
            return res.status(400).json(error);
        }

        value.clientIp = req.ip;

        try {
            await this.clientApplicationsStore.upsert(value);
            await this.clientInstanceStore.insert(value);
            const { appName, instanceId } = value;
            this.logger.info(
                `New client registration: appName=${appName}, instanceId=${instanceId}`,
            );
            return res.status(202).end();
        } catch (err) {
            this.logger.error('failed to register client', err);
            return res.status(500).end();
        }
    }
}

module.exports = RegisterController;
