package text

func DetectEncoding(text string) map[string]int {
	charsets := map[string]int{
		"UTF-8":      0,
		"CP1251":     0,
		"KOI8-R":     0,
		"IBM866":     0,
		"ISO-8859-5": 0,
		"MAC":        0,
	}

	if len(text) == 0 {
		return charsets
	}

	utflower := 7
	utfupper := 5
	lowercase := 3
	uppercase := 1
	lastSimb := 0

	for a := 0; a < len(text); a++ {
		char := int(text[a])

		// non-russian characters
		if char < 128 || char > 256 {
			continue
		}

		// UTF-8
		if (lastSimb == 208) && ((char > 143 && char < 176) || char == 129) {
			charsets["UTF-8"] += (utfupper * 2)
		}
		if ((lastSimb == 208) && ((char > 175 && char < 192) || char == 145)) || (lastSimb == 209 && char > 127 && char < 144) {
			charsets["UTF-8"] += (utflower * 2)
		}

		// CP1251
		if (char > 223 && char < 256) || char == 184 {
			charsets["CP1251"] += lowercase
		}
		if (char > 191 && char < 224) || char == 168 {
			charsets["CP1251"] += uppercase
		}

		// KOI8-R
		if (char > 191 && char < 224) || char == 163 {
			charsets["KOI8-R"] += lowercase
		}
		if (char > 222 && char < 256) || char == 179 {
			charsets["KOI8-R"] += uppercase
		}

		// IBM866
		if (char > 159 && char < 176) || (char > 223 && char < 241) {
			charsets["IBM866"] += lowercase
		}
		if (char > 127 && char < 160) || char == 241 {
			charsets["IBM866"] += uppercase
		}

		// ISO-8859-5
		if (char > 207 && char < 240) || char == 161 {
			charsets["ISO-8859-5"] += lowercase
		}
		if (char > 175 && char < 208) || char == 241 {
			charsets["ISO-8859-5"] += uppercase
		}

		// MAC
		if char > 221 && char < 255 {
			charsets["MAC"] += lowercase
		}
		if char > 127 && char < 160 {
			charsets["MAC"] += uppercase
		}

		lastSimb = char
	}

	return charsets
}