'use strict';
process.env.NODE_ENV = 'test';

const Promise = require('bluebird');
let request = require('supertest');
const databaseUri = require('./databaseConfig').getDatabaseUri();
const knex = require('../lib/db/dbPool')(databaseUri);
const eventDb = require('../lib/db/event')(knex);
const EventStore = require('../lib/eventStore');
const eventStore = new EventStore(eventDb);
const featureDb = require('../lib/db/feature')(knex, eventStore);
const strategyDb = require('../lib/db/strategy')(knex, eventStore);

const app = require('../app')({
    baseUriPath: '',
    db: knex,
    eventDb,
    eventStore,
    featureDb,
    strategyDb,
});

Promise.promisifyAll(request);
request = request(app);

function createStrategies() {
    return Promise.map([
        {
            name: 'default',
            description: 'Default on or off Strategy.',
            parametersTemplate: {},
        },
        {
            name: 'usersWithEmail',
            description: 'Active for users defined  in the comma-separated emails-parameter.',
            parametersTemplate: {
                emails: 'String',
            },
        },
    ], strategy => strategyDb._createStrategy(strategy));
}

function createFeatures() {
    return Promise.map([
        {
            name: 'featureX',
            description: 'the #1 feature',
            enabled: true,
            strategy: 'default',
        },
        {
            name: 'featureY',
            description: 'soon to be the #1 feature',
            enabled: false,
            strategy: 'baz',
            parameters: {
                foo: 'bar',
            },
        },
        {
            name: 'featureZ',
            description: 'terrible feature',
            enabled: true,
            strategy: 'baz',
            parameters: {
                foo: 'rab',
            },
        },
        {
            name: 'featureArchivedX',
            description: 'the #1 feature',
            enabled: true,
            archived: true,
            strategy: 'default',
        },
        {
            name: 'featureArchivedY',
            description: 'soon to be the #1 feature',
            enabled: false,
            archived: true,
            strategy: 'baz',
            parameters: {
                foo: 'bar',
            },
        },
        {
            name: 'featureArchivedZ',
            description: 'terrible feature',
            enabled: true,
            archived: true,
            strategy: 'baz',
            parameters: {
                foo: 'rab',
            },
        },
    ], feature => featureDb._createFeature(feature));
}

function destroyStrategies() {
    return knex('strategies').del();
}

function destroyFeatures() {
    return knex('features').del();
}

function resetDatabase() {
    return Promise.all([destroyStrategies(), destroyFeatures()]);
}

function setupDatabase() {
    return Promise.all([createStrategies(), createFeatures()]);
}

module.exports = {
    request,
    db: {
        reset: resetDatabase,
        setup: setupDatabase,
        resetAndSetup() {
            return resetDatabase().then(setupDatabase);
        },
    },
};