import {api} from './Common/Api';
import './Manager/App.scss';

declare const OCP: any;

$(() => {
	function generateWarningElement(message: string) {
		return $(`<div id="bbb-warning"><span class="icon icon-error-color icon-visible"></span> ${message}</div>`);
	}

	function generateSuccessElement(message: string) {
		return $(`<div id="bbb-success"><span class="icon icon-checkmark icon-visible"></span> ${message}</div>`);
	}

	async function checkServer(url: string, secret: string) {
		const result = await api.checkServer(url, secret);

		if (result === 'success') {
			return;
		}

		throw result;
	}

	function checkPasswordConfirmation() {
		return new Promise<void>(resolve => {
			if (OC.PasswordConfirmation && OC.PasswordConfirmation.requiresPasswordConfirmation()) {
				OC.PasswordConfirmation.requirePasswordConfirmation(() => resolve());

				return;
			}

			resolve();
		});
	}

	async function saveApiSettings(url: string, secret: string) {
		url += url.endsWith('/') ? '' : '/';

		await checkServer(url, secret);
		await checkPasswordConfirmation();

		OCP.AppConfig.setValue('bbb', 'api.url', url);
		OCP.AppConfig.setValue('bbb', 'api.secret', secret);
	}

	$('#bbb-api').on('submit', function (ev) {
		ev.preventDefault();

		const resultElement = $(this).find('.bbb-result').empty();

		saveApiSettings(this['api.url'].value, this['api.secret'].value).then(() => {
			const successElement = generateSuccessElement(t('bbb', 'Settings saved'));

			setTimeout(() => {
				resultElement.empty();
			}, 3000);

			resultElement.append(successElement);
		}).catch(err => {
			let message = t('bbb', 'Unexpected error occurred');

			if (err === 'invalid-url') {
				message = t('bbb', 'API URL is invalid');
			} else if (err === 'invalid-secret') {
				message = t('bbb', 'API secret is invalid');
			}

			const warningElement = generateWarningElement(message);

			resultElement.append(warningElement);
		});
	});

	function generateExampleShortener(shortener: string) {
		return shortener.replace(/</g, '&lt;').replace(/\{user\}/g, `<strong>${OC.currentUser}</strong>`).replace(/\{token\}/g, '<strong>your_room_id</strong>');
	}

	async function saveAppSettings(shortener: string) {
		await checkPasswordConfirmation();

		if (shortener && shortener.indexOf('https://') !== 0) {
			throw 'https';
		}

		if (shortener && shortener.indexOf('{token}') < 0) {
			throw 'token';
		}

		OCP.AppConfig.setValue('bbb', 'app.shortener', shortener);
	}

	$('#bbb-shortener').on('submit', function (ev) {
		ev.preventDefault();

		const resultElement = $(this).find('.bbb-result').empty();

		saveAppSettings(this['app.shortener'].value).then(() => {
			const successElement = generateSuccessElement(t('bbb', 'Settings saved'));

			setTimeout(() => {
				resultElement.empty();
			}, 3000);

			resultElement.append(successElement);
		}).catch(err => {
			let message = t('bbb', 'Unexpected error occurred');

			if (err === 'https') {
				message = t('bbb', 'URL has to start with HTTPS');
			} else if (err === 'token') {
				message = t('bbb', 'URL has to contain the {token} placeholder');
			}

			const warningElement = generateWarningElement(message);

			console.warn('Could not save app settings', err);

			resultElement.append(warningElement);
		});
	});

	$<HTMLInputElement>('#bbb-shortener [name="app.shortener"]').on('keyup', (ev) => {
		ev.preventDefault();

		const {value} = ev.target;

		if (!value || value.indexOf('https://') !== 0 || value.indexOf('{token}') < 0) {
			$('#bbb-shortener-example').text(t('bbb', 'URL has to start with https:// and contain {token}. Additionally the {user} placeholder can be used.'));

			return;
		}

		const target =  window.location.origin + OC.generateUrl('apps/bbb/b/$1');
		const url = (new URL(value));
		const rewritePath = '^' + url.pathname.replace(/^\//, '').replace(/%7Buser%7D/g, '.+').replace(/%7Btoken%7D/g, '(.+)');

		$('#bbb-shortener-example').html(`<p>${generateExampleShortener(value)}</p>
		<details>
		<summary>${t('bbb', 'Example configuration for Apache and Nginx')}</summary>
		<pre>#Apache with mod_rewrite
ServerName    ${url.hostname}
RewriteEngine on
RewriteRule   "${rewritePath}"  "${target}"  [R=307,L]

#Nginx config
server_name ${url.hostname};
rewrite ${rewritePath} ${target} last;
return 307;</pre></details>
		`);
	});
	$('#bbb-shortener [name="app.shortener"]').trigger('keyup');

	$<HTMLInputElement>('.bbb-setting[type="checkbox"]').on('change', (ev) => {
		ev.preventDefault();

		console.log(`checkbox ${ev.target.name} changed to ${ev.target.checked}`);

		OCP.AppConfig.setValue('bbb', ev.target.name, ev.target.checked);
	});
});