//TOOLS
import FipamoAdminAPI, {
	TASK_PAGE_CREATE,
	TASK_PAGE_EDIT,
	TASK_PAGE_DELETE
} from '../../libraries/FipamoAdminAPI';
import Maintenance from './MaintenanceManager';
import * as DataEvent from '../events/DataEvent';
import PageActions from '../actions/PageActions';
import * as EditorEvent from '../events/EditorEvent';
//import TinyDatePicker from 'tiny-date-picker'; TODO: Reactivate for scheduled publishing
import TextEditor from '../ui/TextEditor';
import Notfications from '../ui/Notifications';
import FileManager from '../ui/FileManager';
const notify = new Notfications();
export default class PostEditor {
	//--------------------------
	// constructor
	//--------------------------
	constructor() {
		this.processing = false;
		let self = 'this';
		this.admin = new FipamoAdminAPI(null, document.getElementById('notify-progress'));
		this.mm = new Maintenance(null, null);
		this.urlPieces = document.URL.split('/');
		this.post = [];
		this.postID = null;
		this.postUUID = null;
		this.postLayout = null;
		this.fm = null;
		if (document.querySelector('[role="file-manager"]').getAttribute('data-index')) {
			this.postID = document
				.querySelector('[role="file-manager"]')
				.getAttribute('data-index');
			this.postUUID = document
				.querySelector('[role="file-manager"]')
				.getAttribute('data-uuid');
			this.postLayout = document
				.querySelector('[role="file-manager"]')
				.getAttribute('data-layout');
		}
		if (document.getElementById('edit')) {
			this.editor = new TextEditor(
				document.getElementById('edit'),
				document.querySelector('[role="file-manager"]').offsetHeight +
					document.querySelector('[role="page-meta"]').offsetHeight +
					document.querySelector('[role="text-editor"]').offsetHeight
			);
			this.editor.addListener(
				EditorEvent.EDITOR_DELETE,
				() => this.handleEditorOptions(EditorEvent.EDITOR_DELETE),
				false
			);
			this.editor.addListener(
				EditorEvent.EDITOR_UPLOAD_POST_IMAGE,
				() => this.handleEditorOptions(EditorEvent.EDITOR_UPLOAD_POST_IMAGE),
				false
			);
			this.editor.addListener(
				EditorEvent.EDITOR_UPDATE,
				() => this.handleEditorOptions(EditorEvent.EDITOR_UPDATE),
				false
			);
			this.editor.addListener(
				EditorEvent.EDITOR_SAVE,
				() => this.handleEditorOptions(EditorEvent.EDITOR_SAVE),
				false
			);
			document.getElementById('post-image-upload').addEventListener(
				'change',
				e => {
					this.handleImageUpload(e.target.id, e.target.files);
				},
				false
			);
			/*
			TinyDatePicker(document.getElementById('post-date'), {
				mode: 'dp-below',
				format() {
					//return self.dateUtils.getDate('origin', date);
				}
			});
			*/

			this.start();
		}
	}
	//--------------------------
	// methods
	//--------------------------
	start() {
		if (document.querySelector('[role="file-drop"]')) {
			//insert fileManager here
			this.fm = new FileManager(
				document.querySelector('[role="file-drop"]'),
				document.getElementById('page-files-upload'),
				document.querySelector('[role="page-images-list"]'),
				document.querySelector('[role="page-files-list"]')
			);
			var optionButtons = document.querySelectorAll('.post-option-btn');
			for (var i = 0, length = optionButtons.length; i < length; i++) {
				optionButtons[i].addEventListener(
					'click',
					e => this.handlePostOptions(e),
					false
				);
			}
		}
	}
	//--------------------------
	// event handlers
	//--------------------------
	handlePostOptions(e) {
		let currentOption = null;
		switch (e.target.id) {
			case 'option-page-icon':
			case 'option-menu-pin':
				currentOption = document.getElementById('option-menu-pin');
				break;
			case 'option-feature-icon':
			case 'option-feature':
				currentOption = document.getElementById('option-feature');
				break;
			case 'option-published-icon':
			case 'option-published':
				currentOption = document.getElementById('option-published');
				break;
		}
		if (currentOption != null) {
			let active = currentOption.getAttribute('aria-pressed');
			
			currentOption.setAttribute('data-active', 'false');
			currentOption.setAttribute('aria-pressed', 'false');
			
			if (active == 'false') {
				currentOption.setAttribute('data-active', 'true');
				currentOption.setAttribute('aria-pressed', 'true');
			}
		}
	}
	handleEditorOptions(e) {
		if (this.processing) return;
		let self = this;
		switch (e) {
			case EditorEvent.EDITOR_SAVE:
			case EditorEvent.EDITOR_UPDATE:
				var task = '';
				e === EditorEvent.EDITOR_SAVE
					? (task = TASK_PAGE_CREATE)
					: (task = TASK_PAGE_EDIT);
				new PageActions().collectInfo(this.fm.getFileOrder()).then(page => {
					self.processing = true;
					notify.alert('Writing down changes', null);
					self.admin
						.pageActions(task, page)
						.then(r => {
							self.processing = false;
							if (
								r.type === DataEvent.PAGE_ERROR ||
								r.type === DataEvent.API_REQUEST_LAME
							) {
								notify.alert(r.message, false);
							} else {
								if (r.type === DataEvent.PAGE_UPDATED) {
									notify.alert(r.message, true);
								} else {
									notify.alert(r.message, true);
									window.location = '/dashboard/page/edit/' + r.id;
								}
							}
						})
						.catch(err => {
							self.processing = false;
							notify.alert(err, false);
						});
				});
				break;
			case EditorEvent.EDITOR_DELETE:
				if (this.postLayout === 'index') {
					notify.alert('Index cannot be deleted', false);
					return;
				}
				if (confirm("AYE! You know you're deleting this post, right?")) {
					new PageActions()
						.collectInfo(this.fm.getFileOrder())
						.then(page => {
							self.processing = true;
							this.admin
								.pageActions(TASK_PAGE_DELETE, page)
								.then(() => {
									self.processing = false;
									window.location = '/dashboard/pages';
								})
								.catch(err => {
									self.processing = false;
									notify.alert(err, false);
								});
						})
						.catch(() => {});
				} else {
					// Do nothing!
				}
				break;
			case EditorEvent.EDITOR_UPLOAD_POST_IMAGE:
				document.getElementById('post-image-upload').click();
				break;
		}
	}

	handleImageUpload(type, files) {
		let self = this;
		notify.alert('Uploading Image', null);
		let upload = new FormData();
		upload.enctype = 'multipart/form-data';
		upload.append('upload_files[]', files[0], files[0].name);
		this.mm
			.filesUpload(files[0].type, upload)
			.then(result => {
				if (result.message == 'File Uploaded. Great!') {
					self.editor.notify(
						EditorEvent.EDITOR_UPLOAD_POST_IMAGE,
						result.filePath
					);
					notify.alert('Image Added to Entry', true);
				} else {
					notify.alert('Uh oh. Image not added', false);
				}
			})
			.catch(() => {
				notify.alert('Uh oh. Image not added', false);
			});
	}
}
