const KnexMigrator = require('knex-migrator');
const config = require('../../../shared/config');
const errors = require('@tryghost/errors');

const knexMigrator = new KnexMigrator({
    knexMigratorFilePath: config.get('paths:appRoot')
});

module.exports.getState = () => {
    let state;
    let err;

    return knexMigrator.isDatabaseOK()
        .then(() => {
            state = 1;
            return state;
        })
        .catch((_err) => {
            err = _err;

            // CASE: database was never created
            if (err.code === 'DB_NOT_INITIALISED') {
                state = 2;
                return state;
            }

            // CASE: you have created the database on your own, you have an existing none compatible db?
            if (err.code === 'MIGRATION_TABLE_IS_MISSING') {
                state = 3;
                return state;
            }

            // CASE: database needs migrations
            if (err.code === 'DB_NEEDS_MIGRATION') {
                state = 4;
                return state;
            }

            // CASE: database connection errors, unknown cases
            throw err;
        });
};

module.exports.dbInit = () => {
    return knexMigrator.init();
};

module.exports.migrate = () => {
    return knexMigrator.migrate();
};

module.exports.isDbCompatible = (connection) => {
    return connection.raw('SELECT `key` FROM settings WHERE `key`="databaseVersion";')
        .then((response) => {
            if (!response || !response[0].length) {
                return;
            }

            throw new errors.DatabaseVersionError({
                message: 'Your database version is not compatible with Ghost 2.0.',
                help: 'Want to keep your DB? Use Ghost < 1.0.0 or the "0.11" branch.' +
                      '\n\n\n' +
                      'Want to migrate Ghost 0.11 to 2.0? Please visit https://ghost.org/faq/upgrade-to-ghost-1-0/'
            });
        })
        .catch((err) => {
            // CASE settings table doesn't exists
            if (err.errno === 1146 || err.errno === 1) {
                return;
            }

            throw err;
        });
};
