/**
 * Serbian (Српски / Srpski) specific code.
 * @module
 */

'use strict';

require('../../core-upgrade.js');

const { Language } = require('./Language.js');
const { LanguageConverter } = require('./LanguageConverter.js');
const { ReplacementMachine } = require('wikimedia-langconv');

class SrConverter extends LanguageConverter {
	loadDefaultTables() {
		this.mTables = new ReplacementMachine('sr', 'sr-ec', 'sr-el');
	}
	// do not try to find variants for usernames
	findVariantLink(link, nt, ignoreOtherCond) {
		const ns = nt.getNamespace();
		if (ns.isUser() || ns.isUserTalk) {
			return { nt, link };
		}
		// FIXME check whether selected language is 'sr'
		return super.findVariantLink(link, nt, ignoreOtherCond);
	}

	/**
	 * Guess if a text is written in Cyrillic or Latin.
	 * Overrides LanguageConverter::guessVariant()
	 */
	guessVariant(text, variant) {
		return this.guessVariantParsoid(text, variant);
	}

	// Variant based on the ReplacementMachine's bracketing abilities
	guessVariantParsoid(text, variant) {
		const r = [];
		for (const code of this.mTables.codes) {
			for (const othercode of this.mTables.codes) {
				if (code === othercode) { return; }
				r.push({
					code,
					othercode,
					stats: this.mTables.countBrackets(text, code, othercode),
				});
			}
		}
		r.sort((a,b) => a.stats.unsafe - b.stats.unsafe);
		return r[0].othercode === variant;
	}

	// Faithful translation of PHP heuristic
	guessVariantPHP(text, variant) {
		// XXX: Should use the `u` regexp flag, in Node 6
		// but for these particular regexps it's actually not needed.
		// http://node.green/#ES2015-syntax-RegExp--y--and--u--flags--u--flag
		const numCyrillic = text.match(/[шђчћжШЂЧЋЖ]/g).length;
		const numLatin = text.match(/[šđč枊ĐČĆŽ]/g).length;
		if (variant === 'sr-ec') {
			return numCyrillic > numLatin;
		} else if (variant === 'sr-el') {
			return numLatin > numCyrillic;
		} else {
			return false;
		}
	}
}

class LanguageSr extends Language {
	constructor() {
		super();
		const variants = ['sr', 'sr-ec', 'sr-el'];
		const variantfallbacks = new Map([
			['sr','sr-ec'],
			['sr-ec','sr'],
			['sr-el','sr']
		]);
		const flags = new Map([
			['S', 'S'], ['писмо', 'S'], ['pismo', 'S'],
			['W', 'W'], ['реч', 'W'], ['reč', 'W'], ['ријеч', 'W'],
			['riječ', 'W']
		]);
		this.mConverter = new SrConverter(
			this, 'sr', variants, variantfallbacks, flags
		);
	}
}

module.exports = LanguageSr;