#!/usr/bin/env python
"""
Script de compilation des traductions sans gettext
Alternative pour Windows si gettext n'est pas installé

Usage: python compile_translations_fallback.py
"""

import os
import struct
import array

def generate_mo_file(po_file_path, mo_file_path):
    """
    Génère un fichier .mo à partir d'un fichier .po
    Implémentation basique sans dépendance à gettext
    """
    print(f"Lecture de {po_file_path}...")
    
    # Lire le fichier .po
    with open(po_file_path, 'r', encoding='utf-8') as f:
        lines = f.readlines()
    
    # Parser le fichier .po
    translations = {}
    msgid = None
    msgstr = None
    in_msgid = False
    in_msgstr = False
    
    for line in lines:
        line = line.strip()
        
        if line.startswith('msgid '):
            msgid = line[7:-1]  # Enlever msgid " et "
            in_msgid = True
            in_msgstr = False
        elif line.startswith('msgstr '):
            msgstr = line[8:-1]  # Enlever msgstr " et "
            in_msgstr = True
            in_msgid = False
        elif line.startswith('"') and in_msgid:
            msgid += line[1:-1]
        elif line.startswith('"') and in_msgstr:
            msgstr += line[1:-1]
        elif line == '':
            if msgid and msgstr and msgid != '':
                # Décoder les échappements
                msgid = msgid.encode().decode('unicode_escape')
                msgstr = msgstr.encode().decode('unicode_escape')
                translations[msgid] = msgstr
            msgid = None
            msgstr = None
            in_msgid = False
            in_msgstr = False
    
    # Ajouter la dernière entrée si nécessaire
    if msgid and msgstr and msgid != '':
        msgid = msgid.encode().decode('unicode_escape')
        msgstr = msgstr.encode().decode('unicode_escape')
        translations[msgid] = msgstr
    
    print(f"Trouvé {len(translations)} traductions")
    
    # Générer le fichier .mo (format gettext)
    print(f"Génération de {mo_file_path}...")
    
    # Format du fichier .mo (simplifié)
    # Header magic number
    MAGIC = 0x950412de
    VERSION = 0
    
    keys = sorted(translations.keys())
    offsets = []
    
    # Calculer les offsets
    ids = b''.join([(key + '\x00').encode('utf-8') for key in keys])
    strs = b''.join([(translations[key] + '\x00').encode('utf-8') for key in keys])
    
    # Créer l'en-tête
    keystart = 7 * 4 + 16 * len(keys)
    valuestart = keystart + len(ids)
    
    # Écrire le fichier
    with open(mo_file_path, 'wb') as f:
        # Magic number
        f.write(struct.pack('I', MAGIC))
        # Version
        f.write(struct.pack('I', VERSION))
        # Nombre de messages
        f.write(struct.pack('I', len(keys)))
        # Offset pour les clés
        f.write(struct.pack('I', 7 * 4))
        # Offset pour les valeurs
        f.write(struct.pack('I', 7 * 4 + 8 * len(keys)))
        # Taille de la table de hash (0 = pas de hash)
        f.write(struct.pack('I', 0))
        # Offset de la table de hash
        f.write(struct.pack('I', 0))
        
        # Table des clés
        offset = 0
        for key in keys:
            keydata = (key + '\x00').encode('utf-8')
            f.write(struct.pack('I', len(keydata) - 1))
            f.write(struct.pack('I', keystart + offset))
            offset += len(keydata)
        
        # Table des valeurs
        offset = 0
        for key in keys:
            valdata = (translations[key] + '\x00').encode('utf-8')
            f.write(struct.pack('I', len(valdata) - 1))
            f.write(struct.pack('I', valuestart + offset))
            offset += len(valdata)
        
        # Données des clés
        f.write(ids)
        # Données des valeurs
        f.write(strs)
    
    print(f"✓ Fichier .mo créé avec succès!")
    print(f"  Taille: {os.path.getsize(mo_file_path)} octets")

if __name__ == '__main__':
    # Chemins
    base_dir = os.path.dirname(os.path.abspath(__file__))
    po_file = os.path.join(base_dir, 'locale', 'en', 'LC_MESSAGES', 'django.po')
    mo_file = os.path.join(base_dir, 'locale', 'en', 'LC_MESSAGES', 'django.mo')
    
    print("="*60)
    print("  COMPILATION DES TRADUCTIONS")
    print("  (Sans gettext - Fallback Python)")
    print("="*60)
    print()
    
    # Vérifier que le fichier .po existe
    if not os.path.exists(po_file):
        print(f"❌ ERREUR: Fichier .po non trouvé:")
        print(f"   {po_file}")
        print()
        print("Assurez-vous d'exécuter ce script depuis le dossier du projet.")
        exit(1)
    
    try:
        # Générer le fichier .mo
        generate_mo_file(po_file, mo_file)
        
        print()
        print("="*60)
        print("  ✓ SUCCÈS !")
        print("="*60)
        print()
        print("Les traductions ont été compilées.")
        print()
        print("Prochaines étapes:")
        print("1. Lancez: python manage.py runserver")
        print("2. Visitez: http://localhost:8000/")
        print("3. Testez le changement de langue (globe 🌐 dans le menu)")
        print()
        print("Le site est maintenant bilingue FR/EN ! 🌍")
        print()
        
    except Exception as e:
        print()
        print(f"❌ ERREUR: {e}")
        print()
        print("Si cette méthode ne fonctionne pas, installez gettext:")
        print("https://mlocati.github.io/articles/gettext-iconv-windows.html")
        print()
        exit(1)
