#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import argparse
import re
import time
from pathlib import Path
import requests
from rate_limiter import RateLimiter


def parse_php(path):
    content = Path(path).read_text(encoding="utf-8")
    keys = {}
    pattern = r"'\s*([a-zA-Z0-9_]+)\s*'\s*=>\s*'((?:[^'\\]|\\.)*)'"
    for m in re.finditer(pattern, content):
        keys[m.group(1)] = m.group(2).replace("\\'", "'")
    return keys


def write_php(path, translations):
    lines = ["<?php return ["]
    for key in sorted(translations.keys()):
        val = translations[key].replace("\\", "\\\\").replace("'", "\\'")
        lines.append(f"  '{key}'=>'{val}',")
    lines.append("];")
    Path(path).write_text("\n".join(lines), encoding="utf-8")


def translate_deepl(text, target_lang, source_lang, api_key, limiter):
    if not text.strip():
        return text

    # Platzhalter schützen
    placeholders = {}
    protected = text
    for idx, m in enumerate(re.finditer(r"\{[a-zA-Z0-9_]+\}", text)):
        token = f"XXPH{idx}XX"
        placeholders[token] = m.group(0)
        protected = protected.replace(m.group(0), token)

    limiter.wait()

    try:
        resp = requests.post(
            "https://api-free.deepl.com/v2/translate",
            data={
                "auth_key": api_key,
                "text": protected,
                "source_lang": source_lang.upper(),
                "target_lang": target_lang.upper(),
            },
            timeout=20
        )
        resp.raise_for_status()
        translated = resp.json()["translations"][0]["text"]

        for token, original in placeholders.items():
            translated = translated.replace(token, original)

        return translated

    except Exception:
        return text


def main():
    parser = argparse.ArgumentParser()
    parser.add_argument("--LangDir", default="./app/includes/lang")
    parser.add_argument("--BaseFile", default="./app/includes/lang/de.php")
    parser.add_argument("--SourceLang", default="DE")
    parser.add_argument("--OnlyLangs", nargs="*", default=[])
    parser.add_argument("--DryRun", action="store_true")
    parser.add_argument("--SkipExisting", action="store_true")
    parser.add_argument("--DeepLKey", required=True)
    parser.add_argument("--MaxRPS", type=int, default=2)  # realistisch für DeepL Free
    args = parser.parse_args()

    limiter = RateLimiter(max_calls=args.MaxRPS, per_seconds=1.0)

    lang_dir = Path(args.LangDir)
    base_file = Path(args.BaseFile)

    keys = parse_php(base_file)

    all_langs = [
        f.stem for f in lang_dir.glob("*.php")
        if f.stem not in ("de", args.SourceLang.lower())
    ]
    if args.OnlyLangs:
        all_langs = [l for l in all_langs if l in args.OnlyLangs]

    for lang in all_langs:
        out_file = lang_dir / f"{lang}.php"
        if args.SkipExisting and out_file.exists():
            print(f"⚠ {lang} existiert — übersprungen")
            continue

        print(f"→ {lang}")

        translated = {}
        for k, v in keys.items():
            translated[k] = translate_deepl(
                v, lang, args.SourceLang, args.DeepLKey, limiter
            )

        if not args.DryRun:
            write_php(out_file, translated)

    print("Fertig.")


if __name__ == "__main__":
    main()
