import re
import sys

errors_encounter = 0
pattern = re.compile(r"_\(([\"']{,3})(?P<message>((?!\1).)*)\1(\s*,\s*context\s*=\s*([\"'])(?P<py_context>((?!\5).)*)\5)*(\s*,(\s*?.*?\n*?)*(,\s*([\"'])(?P<js_context>((?!\11).)*)\11)*)*\)")
words_pattern = re.compile(r"_{1,2}\([\"'`]{1,3}.*?[a-zA-Z]")
start_pattern = re.compile(r"_{1,2}\([f\"'`]{1,3}")
f_string_pattern = re.compile(r"_\(f[\"']")
starts_with_f_pattern = re.compile(r"_\(f")

# skip first argument
files = sys.argv[1:]
files_to_scan = [_file for _file in files if _file.endswith(('.py', '.js'))]

for _file in files_to_scan:
	with open(_file, 'r') as f:
		print(f'Checking: {_file}')
		file_lines = f.readlines()
		for line_number, line in enumerate(file_lines, 1):
			if 'xhiveframework-lint: disable-translate' in line:
				continue

			if start_matches := start_pattern.search(line):
				if starts_with_f := starts_with_f_pattern.search(line):
					if has_f_string := f_string_pattern.search(line):
						errors_encounter += 1
						print(f'\nF-strings are not supported for translations at line number {line_number}\n{line.strip()[:100]}')
					continue
				match = pattern.search(line)
				error_found = False

				if not match and line.endswith((',\n', '[\n')):
					# concat remaining text to validate multiline pattern
					line = "".join(file_lines[line_number - 1:])
					line = line[start_matches.start() + 1:]
					match = pattern.match(line)

				if not match:
					error_found = True
					print(f'\nTranslation syntax error at line number {line_number}\n{line.strip()[:100]}')

				if not error_found and not words_pattern.search(line):
					error_found = True
					print(f'\nTranslation is useless because it has no words at line number {line_number}\n{line.strip()[:100]}')

				if error_found:
					errors_encounter += 1

if errors_encounter > 0:
	print('\nVisit "https://xhiveframework.co/docs/user/en/translations" to learn about valid translation strings.')
	sys.exit(1)
else:
	print('\nGood To Go!')
