import re
from collections import defaultdict, Counter

# Chemin du fichier de log
log_file_path = '/var/www/html/modification_carto/matching_segments.log'

# Lire le contenu du fichier de log
with open(log_file_path, 'r') as file:
    log_content = file.readlines()

# Fonction pour extraire les segments du fichier de log
def extract_segments(log_content):
    segments = []
    segment = []
    for line in log_content:
        if line.startswith("Index:"):
            if segment:
                segments.append(segment)
            segment = [line]
        else:
            segment.append(line)
    if segment:
        segments.append(segment)
    return segments

# Fonction pour extraire les octets inversés de chaque segment
def extract_inverted_bytes(segment):
    inverted_bytes = []
    for line in segment:
        match = re.search(r'Inverted Byte: (\d+)', line)
        if match:
            inverted_byte = int(match.group(1))
            inverted_bytes.append(inverted_byte)
    return inverted_bytes

# Fonction pour combiner les octets inversés en tenant compte de l'ordre des segments
def combine_inverted_bytes(segments):
    combined_bytes = defaultdict(list)
    for segment in segments:
        index = int(re.search(r'Index: (\d+)', segment[0]).group(1))
        inverted_bytes = extract_inverted_bytes(segment)
        for i, byte in enumerate(inverted_bytes):
            position = index * len(inverted_bytes) + i
            combined_bytes[position].append(byte)
    
    # Trie les octets combinés par position et sélectionne les octets les plus fréquents
    sorted_indices = sorted(combined_bytes.keys())
    sorted_bytes = [Counter(combined_bytes[i]).most_common(1)[0][0] for i in sorted_indices]
    
    return sorted_bytes

# Analyser les segments pour reconstituer le MCUID
segments = extract_segments(log_content)
combined_inverted_bytes = combine_inverted_bytes(segments)

# Supposons que le MCUID soit de 16 octets (32 caractères hexadécimaux)
mcuid_length = 16  

# Extraire les MCUIDs possibles et vérifier celui qui est correct
possible_mcuid = None
for i in range(len(combined_inverted_bytes) - mcuid_length + 1):
    possible_mcuid = combined_inverted_bytes[i:i + mcuid_length]
    possible_mcuid_hex = ''.join(f'{byte:02X}' for byte in possible_mcuid)
    if len(possible_mcuid_hex) == 32:  # Vérifiez la longueur du MCUID
        if possible_mcuid_hex.startswith("410482850C80A82F") and possible_mcuid_hex.endswith("102417E000"):
            break

# Afficher le MCUID trouvé
print(f"Extracted MCUID: {possible_mcuid_hex}")
