const EncryptionService = require('lib/services/EncryptionService');
const { _ } = require('lib/locale.js');
const BaseItem = require('lib/models/BaseItem.js');
const Setting = require('lib/models/Setting.js');

const shared = {};

shared.constructor = function(comp) {
	comp.state = {
		masterKeys: [],
		passwords: {},
		passwordChecks: {},
		stats: {
			encrypted: null,
			total: null,
		},
	};
	comp.isMounted_ = false;

	comp.refreshStatsIID_ = null;
};

shared.initState = function(comp, props) {
	comp.setState(
		{
			masterKeys: props.masterKeys,
			passwords: props.passwords ? props.passwords : {},
		},
		() => {
			comp.checkPasswords();
		}
	);

	comp.refreshStats();

	if (comp.refreshStatsIID_) {
		clearInterval(comp.refreshStatsIID_);
		comp.refreshStatsIID_ = null;
	}

	comp.refreshStatsIID_ = setInterval(() => {
		if (!comp.isMounted_) {
			clearInterval(comp.refreshStatsIID_);
			comp.refreshStatsIID_ = null;
			return;
		}
		comp.refreshStats();
	}, 3000);
};

shared.refreshStats = async function(comp) {
	const stats = await BaseItem.encryptedItemsStats();
	comp.setState({ stats: stats });
};

shared.checkPasswords = async function(comp) {
	const passwordChecks = Object.assign({}, comp.state.passwordChecks);
	for (let i = 0; i < comp.state.masterKeys.length; i++) {
		const mk = comp.state.masterKeys[i];
		const password = comp.state.passwords[mk.id];
		const ok = password ? await EncryptionService.instance().checkMasterKeyPassword(mk, password) : false;
		passwordChecks[mk.id] = ok;
	}
	comp.setState({ passwordChecks: passwordChecks });
};

shared.decryptedStatText = function(comp) {
	const stats = comp.state.stats;
	const doneCount = stats.encrypted !== null ? stats.total - stats.encrypted : '-';
	const totalCount = stats.total !== null ? stats.total : '-';
	return _('Decrypted items: %s / %s', doneCount, totalCount);
};

shared.onSavePasswordClick = function(comp, mk) {
	const password = comp.state.passwords[mk.id];
	if (!password) {
		Setting.deleteObjectKey('encryption.passwordCache', mk.id);
	} else {
		Setting.setObjectKey('encryption.passwordCache', mk.id, password);
	}

	comp.checkPasswords();
};

shared.onPasswordChange = function(comp, mk, password) {
	const passwords = comp.state.passwords;
	passwords[mk.id] = password;
	comp.setState({ passwords: passwords });
};

module.exports = shared;