import * as DataEvent from '../../../src/com/events/DataEvent';
import Auth from '../../data/Auth';
import Render from '../../data/Render';
import Settings, { SETTINGS_FILE, SETTINGS_FOLKS } from '../../data/Settings';
import Navigation from '../../data/Navigation';
import Book from '../../data/Book';
const express = require('express');
const router = express.Router();
const multer = require('multer');
const fs = require('fs-extra');
const moment = require('moment');
const _ = require('lodash');
const auth = new Auth();
const render = new Render();
const book = new Book();
const settings = new Settings();
const nav = new Navigation();
const uploadPath =
	'./public/assets/images/user/' + moment().format('YYYY') + '/' + moment().format('MM');

var storage = multer.diskStorage({
	destination: function (req, file, cb) {
		fs.ensureDir(uploadPath, () => {
			// dir has now been created, including the directory it is to be placed in
			cb(null, uploadPath);
		});
	},
	filename: function (req, file, cb) {
		var splice = file.originalname.split(':');
		cb(null, splice[0]);
	}
});
var avatar_upload = multer({
	storage: storage
}).array('avatar_upload');
var background_upload = multer({
	storage: storage
}).array('background_upload');
//** SYNC POSTS */
router.post('/sync', (req, res) => {
	auth.authCheck(req)
		.then(() => {
			settings
				.sync(req, res)
				.then(() => {
					res.json({
						type: DataEvent.SETTINGS_UPDATED,
						message: 'Settings Saved'
					});
				})
				.catch(err => {
					res.json({
						type: DataEvent.REQUEST_LAME,
						error: err.message,
						message: "Uh oh. Settings didn't take, sport"
					});
				});
		})
		.catch(err => {
			res.json({
				type: err.type,
				message: err.message
			});
		});
});

router.post('/nav-sync', (req, res) => {
	auth.authCheck(req)
		.then(() => {
			// find removoed menu item page and set menu to false
			book.getPage(req.body.remove).then(page => {
				let body = page.metadata;
				body.content = page.content;
				body.menu = false;
				book.editPage(body, body.uuid, DataEvent.API_PAGE_WRITE, req.session.user);
			});
			nav.sync(req.body)
				.then(response => {
					res.json({
						type: response.type,
						message: response.message
					});
				})
				.catch(err => {
					res.json({
						type: DataEvent.REQUEST_LAME,
						message: err
					});
				});
		})
		.catch(err => {
			res.json({
				type: err.type,
				message: err.message
			});
		});
});

router.post('/publish-pages', (req, res) => {
	auth.authCheck(req)
		.then(() => {
			getBookData()
				.then(result => {
					render
						.publishAll(
							result.pages,
							result.settings.global.theme,
							req.session.user.handle
						)
						.then(response => {
							res.json({
								type: response.type,
								message: response.message
							});
						})
						.catch(err => {
							res.json({
								type: DataEvent.PAGES_NOT_RENDERED,
								message: 'Uh oh. Pages not rendered, sport',
								error: err
							});
						});
				})
				.catch(err => {
					res.json({
						type: DataEvent.PAGES_NOT_RENDERED,
						message: 'Uh oh. Pages not rendered, sport',
						error: err
					});
				});
		})
		.catch(err => {
			res.json({
				type: err.type,
				message: err.message
			});
		});
});

/***
    UPLOAD AVATAR
*/

router.post('/add-avatar', avatar_upload, (req, res) => {
	if (req.session.user) {
		let user = req.session.user;
		settings
			.load(SETTINGS_FOLKS)
			.then(folks => {
				let found = _.find(folks, { handle: user.handle });
				if (found) {
					var index = found.id - 1;
					var path = req.files[0].path;
					var image = path.substr(7, path.length);
					folks[index].avi = '/' + image;
					fs.writeJson('site/folks.json', folks);
					user.avi = '/' + image;
					res.json({
						type: DataEvent.AVATAR_UPLOADED,
						message: 'Changed avi. You look great.',
						url: '/' + image
					});
				}
			})
			.catch(() => {
				res.json({
					type: DataEvent.REQUEST_LAME,
					message: 'Members Not found'
				});
			});
	} else {
		res.json({
			type: DataEvent.REQUEST_LAME,
			message: "You're not logged in, champ"
		});
	}
});

/***
    UPLOAD FEATURE BACKGROUND
*/

router.post('/add-feature-background', background_upload, (req, res) => {
	if (req.session.user) {
		settings
			.load(SETTINGS_FILE)
			.then(settings => {
				var path = req.files[0].path;
				var image = path.substr(7, path.length);
				settings.global.background = '/' + image;
				fs.writeJson('site/settings.json', settings);
				res.json({
					type: DataEvent.SITE_BACKGROUND_UPLOADED,
					message: 'Background Uploaded',
					url: '/' + image
				});
			})
			.catch(() => {
				//console.log('ERROR', err);
			});
	} else {
		res.json({
			type: DataEvent.REQUEST_LAME,
			message: "You're not logged in, champ"
		});
	}
});

module.exports = router;

function getBookData() {
	return new Promise((resolve, reject) => {
		let getSettings = settings.load(SETTINGS_FILE);
		let getBook = book.getPage();
		Promise.all([getSettings, getBook])
			.then(result => {
				const [settings, pages] = result;
				let data = { settings: settings, pages: pages };
				resolve(data);
			})
			.catch(err => {
				reject(err);
			});
	});
}
