/**
 * Required External Modules and Interfaces
 */
import express, {Request, Response} from 'express';
import * as UserService from '../user/user.service';
import logger from '../../../middleware/logger';

/**
 * Router Definition
 */
export const registerRouter = express.Router();

registerRouter.post('/:isDevCall', async (req: Request, res: Response) => {
    try {
        let username: string = '';
        let email: string = '';
        let firstName: string = '';
        let lastName: string = '';
        let password: string = '';
        let useDev: boolean = (req.params.isDevCall ?? '') === 'dev'; // TBD

        // Send error when content-type header is missing
        if (!req.headers['content-type']) {
            res.status(400).send({
                'status': 'MISSING_CONTENT_TYPE',
                'message': 'Please set the content-type header field'
            });
            return;
        }

        // API accepts both JSON in body and HTTP parameters
        if (req.headers['content-type'] === 'application/json') {
            username = req.body.username;
            email = req.body.email;
            firstName = req.body.firstName;
            lastName = req.body.lastName;
            password = req.body.password;
        } else if (req.headers['content-type'] === 'application/x-www-form-urlencoded') {
            username = (req.query.username ?? '').toString();
            email = (req.query.email ?? '').toString();
            firstName = (req.query.firstName ?? '').toString();
            lastName = (req.query.lastName ?? '').toString();
            password = (req.query.password ?? '').toString();
        }
        let userIP = req.socket.remoteAddress ?? '';
        let deviceInfo = req.headers['user-agent'] ?? '';

        if (username === '' || email === '' || firstName === '' || lastName === '' || password === '') {
            res.status(400).send({
                'status': 'WRONG_PARAMS',
                'message': 'Missing or wrong parameters'
            });
            return;
        }

        // Check for invalid username / email
        const status = await UserService.checkUsernameAndEmail(useDev, username, email);
        if (status.hasProblems) {
            // Username and/or email are duplicates, return error
            res.status(400).send({
                'message': status.messages[0],
                'status': status.status[0],
                'additionalMessages': status.messages.slice(1),
                'additionalStatus': status.status.slice(1)
            });
            return;
        }

        // Create user
        let session = await UserService.registerUser(useDev, username, email, firstName, lastName, password, userIP, deviceInfo);

        res.status(201).send(session);
    } catch (e) {
        logger.error('Error handling a request: ' + e.message);
        res.status(500).send({'message': 'Internal Server Error. Try again later.'});
    }
});