/** 
 * @file Cree le serveur express avec tous les middleware qui vont bien
*/
import express from 'express';
import bodyParser from 'body-parser';
import favicon from 'serve-favicon';
import morgan from 'morgan';
import path from 'path';
import cors from 'cors';
import schema from './graphql/schema';
import setupLdapAuth from './ldap/ldap_auth';
import { express as graphqlVoyager } from 'graphql-voyager/middleware';
import { graphqlExpress, graphiqlExpress } from 'graphql-server-express';
import flash from 'connect-flash';

const server = express();

// on sait pas a quoi ca sert mais il parait que c'est utile
server.use(bodyParser.json());
server.use(bodyParser.urlencoded({
    extended: true
}));

/**
 * @description Configuration authentification
 */
setupLdapAuth(server);

/**
 * @description Cache le fait que l'application tourne sous Express dans le header HTTP.
 */
server.disable('x-powered-by');
// setting up view engine for pug
let viewpath = path.resolve('./','src','views');
server.set('views', viewpath);
server.set('view engine', 'pug');

// favicon: capital sigma symbol
server.use(favicon(path.resolve('./','assets','favicon.ico')));

server.use('/assets',express.static(path.resolve('./','assets')));

// Morgan is middleware for logging requests
server.use(morgan('dev'));

// Charge le middleware express pour GraphQL
server.use('/graphql', bodyParser.json(), cors(),
    graphqlExpress(req => {
        let uid;
        let password;
        
        try {
            uid = req.session.passport.user.uid;
            password = "mythe";
        } catch (err) {
            uid = "anonymous";
            password = "";
        }

        console.log("Accessing GraphQL as:",uid);

        return {
            schema : schema,
            context : {user : {uid : uid, password : password}}
        };
    }));

// GraphiQL est une console interactive pour faire des requêtes au schéma GraphQL
server.use('/graphiql', graphiqlExpress({endpointURL: '/graphql'}));

// GraphQL voyager
server.use('/voyager', graphqlVoyager({ endpointUrl: '/graphql' }));

// connect-flash is middleware for flashing messages
server.use(flash());

export default server;