const ghostBookshelf = require('./base');
const ghostVersion = require('@tryghost/version');
let Webhook;
let Webhooks;

Webhook = ghostBookshelf.Model.extend({
    tableName: 'webhooks',

    actionsCollectCRUD: true,
    actionsResourceType: 'webhook',

    defaults() {
        return {
            api_version: `v${ghostVersion.safe}`,
            status: 'available'
        };
    },

    integration() {
        return this.belongsTo('Integration');
    },

    emitChange: function emitChange(event, options) {
        const eventToTrigger = 'webhook' + '.' + event;
        ghostBookshelf.Model.prototype.emitChange.bind(this)(this, eventToTrigger, options);
    },

    onCreated: function onCreated(model, options) {
        const result = ghostBookshelf.Model.prototype.onCreated.apply(this, arguments);

        model.emitChange('added', options);

        return result;
    },

    onUpdated: function onUpdated(model, options) {
        const result = ghostBookshelf.Model.prototype.onUpdated.apply(this, arguments);

        model.emitChange('edited', options);

        return result;
    },

    onDestroyed: function onDestroyed(model, options) {
        const result = ghostBookshelf.Model.prototype.onDestroyed.apply(this, arguments);

        model.emitChange('deleted', options);

        return result;
    }
}, {
    findAllByEvent: function findAllByEvent(event, unfilteredOptions) {
        const options = this.filterOptions(unfilteredOptions, 'findAll');
        const webhooksCollection = Webhooks.forge();

        return webhooksCollection
            .query('where', 'event', '=', event)
            .fetch(options);
    },

    getByEventAndTarget: function getByEventAndTarget(event, targetUrl, unfilteredOptions) {
        const options = ghostBookshelf.Model.filterOptions(unfilteredOptions, 'getByEventAndTarget');
        options.require = true;

        return Webhooks.forge().fetch(options).then(function then(webhooks) {
            const webhookWithEventAndTarget = webhooks.find(function findWebhook(webhook) {
                return webhook.get('event').toLowerCase() === event.toLowerCase()
                    && webhook.get('target_url').toLowerCase() === targetUrl.toLowerCase();
            });

            if (webhookWithEventAndTarget) {
                return webhookWithEventAndTarget;
            }
        }).catch(function (error) {
            if (error.message === 'NotFound' || error.message === 'EmptyResponse') {
                return Promise.resolve();
            }

            return Promise.reject(error);
        });
    }
});

Webhooks = ghostBookshelf.Collection.extend({
    model: Webhook
});

module.exports = {
    Webhook: ghostBookshelf.model('Webhook', Webhook),
    Webhooks: ghostBookshelf.collection('Webhooks', Webhooks)
};
