"""Script to check source strings for translations."""

import argparse
import os

import rapidfuzz

BACKEND_SOURCE_FILE = [
    '..',
    '..',
    'src',
    'backend',
    'InvenTree',
    'locale',
    'en',
    'LC_MESSAGES',
    'django.po',
]

FRONTEND_SOURCE_FILE = [
    '..',
    '..',
    'src',
    'frontend',
    'src',
    'locales',
    'en',
    'messages.po',
]


def extract_source_strings(file_path):
    """Extract source strings from the provided file."""
    here = os.path.abspath(os.path.dirname(__file__))
    abs_file_path = os.path.abspath(os.path.join(here, *file_path))

    sources = []

    with open(abs_file_path, encoding='utf-8') as f:
        for line in f:
            line = line.strip()
            if line.startswith('msgid '):
                msgid = line[6:].strip()

                if msgid in sources:
                    print(f'Duplicate source string: {msgid}')
                else:
                    sources.append(msgid)

    return sources


def compare_source_strings(sources, threshold):
    """Compare source strings to find duplicates (or close matches)."""
    issues = 0

    for i, source in enumerate(sources):
        for other in sources[i + 1 :]:
            if other.lower() == source.lower():
                print(f'- Duplicate: {source} ~ {other}')
                issues += 1
                continue

            ratio = rapidfuzz.fuzz.ratio(source, other)
            if ratio > threshold:
                print(f'- Close match: {source} ~ {other} ({ratio:.1f}%)')
                issues += 1

    if issues:
        print(f' - Found {issues} issues.')


if __name__ == '__main__':
    parser = argparse.ArgumentParser(
        description='Check source strings for translations.'
    )
    parser.add_argument(
        '--backend', action='store_true', help='Check backend source strings'
    )
    parser.add_argument(
        '--frontend', action='store_true', help='Check frontend source strings'
    )
    parser.add_argument(
        '--threshold',
        type=int,
        help='Set the threshold for string comparison',
        default=99,
    )

    args = parser.parse_args()

    if args.backend:
        backend_sources = extract_source_strings(BACKEND_SOURCE_FILE)
        print('Backend source strings:', len(backend_sources))
        compare_source_strings(backend_sources, args.threshold)

    if args.frontend:
        frontend_sources = extract_source_strings(FRONTEND_SOURCE_FILE)
        print('Frontend source strings:', len(frontend_sources))
        compare_source_strings(frontend_sources, args.threshold)