import SettingsActions from '../actions/SettingsActions';
import ApiUtils, {
	REQUEST_TYPE_POST,
	CONTENT_TYPE_FORM,
	CONTENT_TYPE_JSON
} from '../../../src/com/utils/APIUtils';
import * as DataEvent from '../../../src/com/events/DataEvent';
import Mailer from '../actions/Mailer';
import Notifications from '../ui/Notifications';
const api = new ApiUtils();
const notify = new Notifications();
const mailer = new Mailer();
export default class SettingsIndex {
	//--------------------------
	// constructor
	//--------------------------
	constructor() {
		api.authStatus();
		this.start();
	}
	//--------------------------
	// methods
	//--------------------------
	start() {
		let self = this;
		//handle save button
		document.getElementById('save-toggle').addEventListener('click', () =>
			new SettingsActions()
				.getInfo()
				.then(data => {
					api.request(
						'/api/v1/settings/sync',
						DataEvent.API_SETTINGS_WRITE,
						REQUEST_TYPE_POST,
						CONTENT_TYPE_JSON,
						data
					).then(response => {
						let r = JSON.parse(response.request['response']);
						if (r.type == DataEvent.SETTINGS_UPDATED) {
							notify.alert(r.message, true);
						} else {
							notify.alert(r.message, true);
						}
					});
				})
				.catch(() => {
					//console.log(err);
				})
		);
		//handle set up image uploads
		document.getElementById('avatar').addEventListener('click', () => {
			document.getElementById('avatar-upload').click();
		});
		document.getElementById('background').addEventListener('click', () => {
			document.getElementById('background-upload').click();
		});
		document.getElementById('avatar-upload').addEventListener(
			'change',
			e => {
				self.handleImageUpload(e.target.id, e.target.files);
			},
			false
		);
		document.getElementById('background-upload').addEventListener(
			'change',
			e => {
				self.handleImageUpload(e.target.id, e.target.files);
			},
			false
		);
		//handle privacy toggle
		document
			.getElementById('privacy-toggle')
			.addEventListener('click', e => this.togglePrivacy(e));
		document
			.getElementById('render-toggle')
			.addEventListener('click', e => this.toggleRender(e));
		document.getElementById('send-mail').addEventListener('click', e => this.handleMailer(e));
		document
			.getElementById('publish-pages')
			.addEventListener('click', e => this.handlePublished(e));
		//handle theme toggle
		let themeBtns = document.querySelectorAll('.theme-select');
		for (var i = 0, length = themeBtns.length; i < length; i++) {
			themeBtns[i].addEventListener('click', e => this.handleThemes(e));
		}
		//handle mail options
		let mailBtn = document.querySelectorAll('.mail-option');
		for (i = 0, length = mailBtn.length; i < length; i++) {
			mailBtn[i].addEventListener('click', e => this.handleMailOptions(e));
		}
	}
	//--------------------------
	// event handlers
	//--------------------------
	togglePrivacy(e) {
		e.stopPropagation();
		e.preventDefault();
		if (e.target.getAttribute('data-private') == 'false') {
			e.target.setAttribute('data-private', 'true');
			e.target.innerHTML = 'SITE IS PUBLIC';
		} else {
			e.target.setAttribute('data-private', 'false');
			e.target.innerHTML = 'SITE IS PRIVATE';
		}
	}
	toggleRender(e) {
		e.stopPropagation();
		e.preventDefault();
		if (e.target.getAttribute('data-render') == 'false') {
			e.target.setAttribute('data-render', 'true');
			e.target.innerHTML = 'RENDER PAGES ON SAVE';
		} else {
			e.target.setAttribute('data-render', 'false');
			e.target.innerHTML = "DON'T RENDER PAGES ON SAVE";
		}
	}
	handleMailer() {
		mailer.sendMail();
	}
	handleThemes(e) {
		e.stopPropagation();
		e.preventDefault();
		let themes = document.querySelectorAll('.theme-select');
		for (var i = 0, length = themes.length; i < length; i++) {
			e.target.id == themes[i].id
				? themes[i].setAttribute('data-enabled', 'true')
				: themes[i].setAttribute('data-enabled', 'false');
		}
	}
	handleMailOptions(e) {
		e.preventDefault();
		e.stopPropagation();
		let smtp = document.getElementById('mail-smtp');
		let mailgun = document.getElementById('mail-mg');
		let mail = document.querySelectorAll('.mail-option');
		for (var i = 0, length = mail.length; i < length; i++) {
			if (e.target.id == mail[i].id) {
				mail[i].setAttribute('data-enabled', 'true');
				if (e.target.id == 'option-smtp') {
					smtp.setAttribute('data-enabled', 'true');
					mailgun.setAttribute('data-enabled', 'false');
				} else if (e.target.id == 'option-none') {
					smtp.setAttribute('data-enabled', 'false');
					mailgun.setAttribute('data-enabled', 'false');
				} else {
					smtp.setAttribute('data-enabled', 'false');
					mailgun.setAttribute('data-enabled', 'true');
				}
			} else {
				mail[i].setAttribute('data-enabled', 'false');
			}
		}
	}
	handleImageUpload(type, files) {
		let url = '';
		let eventType = DataEvent.API_IMAGES_UPLOAD;
		type == 'avatar-upload'
			? (url = '/api/v1/settings/add-avatar')
			: (url = '/api/v1/settings/add-feature-background');
		var imageData = new FormData();
		for (var i = 0; i < files.length; i++) {
			var file = files[i];
			// Check the file type.
			if (!file.type.match('image.*')) {
				continue;
			}
			type == 'avatar-upload'
				? imageData.append('avatar_upload', file, file.name)
				: imageData.append('background_upload', file, file.name);
		}
		api.request(url, eventType, REQUEST_TYPE_POST, CONTENT_TYPE_FORM, imageData)
			.then(response => {
				//TODO: Move JSON processing to API class
				let r = JSON.parse(response.request['response']);
				if (r.type == DataEvent.AVATAR_UPLOADED) {
					notify.alert(r.message, true);
					document.getElementById('avatar').src = r.url;
				} else {
					notify.alert(r.message, true);
					document.getElementById('background').src = r.url;
				}
			})
			.catch(() => {
				//console.log(err)
			});
	}
	handlePublished(e) {
		e.preventDefault();
		e.stopPropagation();
		let task = { task: 'publish all pages' };
		api.request(
			'/api/v1/settings/publish-pages',
			DataEvent.API_RENDER_PAGES,
			REQUEST_TYPE_POST,
			CONTENT_TYPE_JSON,
			task
		)
			.then(response => {
				let r = JSON.parse(response.request['response']);
				notify.alert(r.message, true);
			})
			.catch(err => {
				notify.alert(err, false);
			});
	}
}