"use strict";

var express = require('express');
var router = express.Router();
var _ = require('lodash');

// ==========================================
// EDIT MODE
// ==========================================

/**
 * Edit document in Markdown
 */
router.get('/edit/*', (req, res, next) => {

	let safePath = entries.parsePath(_.replace(req.path, '/edit', ''));

	entries.fetchOriginal(safePath, {
		parseMarkdown: false,
		parseMeta: true,
		parseTree: false,
		includeMarkdown: true,
		includeParentInfo: false,
		cache: false
	}).then((pageData) => {
		if(pageData) {
			res.render('pages/edit', { pageData });
		} else {
			throw new Error('Invalid page path.');
		}
		return true;
	}).catch((err) => {
		res.render('error', {
			message: err.message,
			error: {}
		});
	});

});

router.put('/edit/*', (req, res, next) => {

	let safePath = entries.parsePath(_.replace(req.path, '/edit', ''));

	entries.update(safePath, req.body.markdown).then(() => {
		res.json({
			ok: true
		});
	}).catch((err) => {
		res.json({
			ok: false,
			error: err.message
		});
	});

});

// ==========================================
// CREATE MODE
// ==========================================

router.get('/create/*', (req, res, next) => {

	if(_.some(['create','edit','account','source','history','mk'], (e) => { return _.startsWith(req.path, '/create/' + e); })) {
		return res.render('error', {
			message: 'You cannot create a document with this name as it is reserved by the system.',
			error: {}
		});
	}
	
	let safePath = entries.parsePath(_.replace(req.path, '/create', ''));

	entries.exists(safePath).then((docExists) => {
		if(!docExists) {
			return entries.getStarter(safePath).then((contents) => {

				let pageData = {
					markdown: contents,
					meta: {
						title: _.startCase(safePath),
						path: safePath
					}
				};
				res.render('pages/create', { pageData });

				return true;

			}).catch((err) => {
				throw new Error('Could not load starter content!');
			});
		} else {
			throw new Error('This entry already exists!');
		}
	}).catch((err) => {
		res.render('error', {
			message: err.message,
			error: {}
		});
	});

});

router.put('/create/*', (req, res, next) => {

	let safePath = entries.parsePath(_.replace(req.path, '/create', ''));

	entries.create(safePath, req.body.markdown).then(() => {
		res.json({
			ok: true
		});
	}).catch((err) => {
		res.json({
			ok: false,
			error: err.message
		});
	});

});

// ==========================================
// VIEW MODE
// ==========================================

/**
 * View source of a document
 */
router.get('/source/*', (req, res, next) => {

	let safePath = entries.parsePath(_.replace(req.path, '/source', ''));

	entries.fetchOriginal(safePath, {
		parseMarkdown: false,
		parseMeta: true,
		parseTree: false,
		includeMarkdown: true,
		includeParentInfo: false,
		cache: false
	}).then((pageData) => {
		if(pageData) {
			return res.render('pages/source', { pageData });
		} else {
			throw new Error('Invalid page path.');
		}
	}).catch((err) => {
		res.render('error', {
			message: err.message,
			error: {}
		});
	});

});

/**
 * View document
 */
router.get('/*', (req, res, next) => {

	let safePath = entries.parsePath(req.path);

	entries.fetch(safePath).then((pageData) => {
		if(pageData) {
			res.render('pages/view', { pageData });
		} else {
			res.render('error-notexist', {
				newpath: safePath
			});
		}
		return true;
	}).error((err) => {
		res.render('error-notexist', {
			message: err.message,
			newpath: safePath
		});
	}).catch((err) => {
		res.render('error', {
			message: err.message,
			error: {}
		});
	});

});

/**
 * Move document
 */
router.put('/*', (req, res, next) => {

	let safePath = entries.parsePath(req.path);

	if(_.isEmpty(req.body.move)) {
		return res.json({
			ok: false,
			error: 'Invalid document action call.'
		});
	}

	let safeNewPath = entries.parsePath(req.body.move);

	entries.move(safePath, safeNewPath).then(() => {
		res.json({
			ok: true
		});
	}).catch((err) => {
		res.json({
			ok: false,
			error: err.message
		});
	});

});

module.exports = router;