const debug = require('ghost-ignition').debug('services:routing:controllers:entry'),
    url = require('url'),
    urlService = require('../../url'),
    filters = require('../../../filters'),
    helpers = require('../helpers');

/**
 * @TODO:
 *   - use `filter` for `findOne`?
 *   - always execute `next` until no router want's to serve and 404's
 */
module.exports = function entryController(req, res, next) {
    debug('entryController', res.locals.routerOptions);

    return helpers.postLookup(req.path, res.locals.routerOptions)
        .then(function then(lookup) {
            // Format data 1
            const post = lookup ? lookup.post : false;

            if (!post) {
                debug('no post');
                return next();
            }

            // CASE: postlookup can detect options for example /edit, unknown options get ignored and end in 404
            if (lookup.isUnknownOption) {
                debug('isUnknownOption');
                return next();
            }

            // CASE: last param is of url is /edit, redirect to admin
            if (lookup.isEditURL) {
                debug('redirect. is edit url');
                return urlService.utils.redirectToAdmin(302, res, '/editor/' + post.id);
            }

            /**
             * CASE: check if type of router owns this resource
             *
             * Static pages have a hardcoded permalink, which is `/:slug/`.
             * Imagine you define a collection under `/` with the permalink `/:slug/`.
             *
             * The router hierarchy is:
             *
             * 1. collections
             * 2. static pages
             *
             * Both permalinks are registered in express. If you serve a static page, the
             * collection router will try to serve this as a post resource.
             *
             * That's why we have to check against the router type.
             */
            if (urlService.getResourceById(post.id).config.type !== res.locals.routerOptions.type) {
                debug('not my resource type');
                return next();
            }

            /**
             * CASE: Permalink is not valid anymore, we redirect him permanently to the correct one
             *       This should only happen if you have date permalinks enabled and you change
             *       your publish date.
             *
             * @NOTE:
             *
             * Ensure we redirect to the correct post url including subdirectory.
             */
            if (post.url !== req.path) {
                debug('redirect');

                return urlService.utils.redirect301(res, url.format({
                    pathname: urlService.utils.createUrl(post.url, false, false, true),
                    search: url.parse(req.originalUrl).search
                }));
            }

            helpers.secure(req, post);

            filters.doFilter('prePostsRender', post, res.locals)
                .then(helpers.renderEntry(req, res));
        })
        .catch(helpers.handleError(next));
};
