import binascii

# Chemins des fichiers
input_file_golf = "/var/www/html/modification_carto/golf pcr fls full read boot foxfls.unknown"
input_file_immo_off = "/var/www/html/modification_carto/IMM OFF.bin"
mcuid_hex = "4104058606609011820600102403ED00"

# Lire les fichiers en mode binaire
with open(input_file_golf, 'rb') as file:
    file_content_golf = file.read()

with open(input_file_immo_off, 'rb') as file:
    file_content_immo_off = file.read()

# Vérifier que les deux fichiers ont la même longueur
if len(file_content_golf) != len(file_content_immo_off):
    raise ValueError("Les fichiers d'entrée n'ont pas la même longueur.")

# Définir le MCUID en octets
mcuid_bytes = bytes.fromhex(mcuid_hex)

# Fonction pour calculer les positions spécifiques par rapport au MCUID
def calculate_positions_from_mcuid(mcuid_bytes, data_length, step=100000):
    positions = []
    mcuid_length = len(mcuid_bytes)
    base_position = sum(mcuid_bytes)
    for i in range(mcuid_length):
        position = (base_position + i * step + mcuid_bytes[i % mcuid_length]) % data_length
        positions.append(position)
    return positions

data_length = len(file_content_golf)

# Calculer toutes les positions spécifiques par rapport au MCUID
positions_from_mcuid = calculate_positions_from_mcuid(mcuid_bytes, data_length)

# Comparer les fichiers et identifier les différences
differences = []
for pos in positions_from_mcuid:
    if file_content_golf[pos] != file_content_immo_off[pos]:
        differences.append((pos, file_content_golf[pos], file_content_immo_off[pos]))

# Afficher les différences
print(f"Differences found: {differences}")
print(f"Total differences: {len(differences)}")

# Dictionnaire des transformations spécifiques à appliquer manuellement
transformations_specific = {
    1386045: 0x00,
    1395070: 0x6D,
    1395071: 0x05,
    1395072: 0xE1,
    1395073: 0x2C,
    1395074: 0x00,
    1395075: 0x90,
    1399726: 0x00,
    1399727: 0x90,
    2073408: 0x85,
    2073409: 0xD2,
    2073410: 0x04,
    2073412: 0x7B,
    2073413: 0x40,
    2073414: 0xE8,
    2073415: 0xFF,
    2073416: 0x1B,
    2073417: 0x6F,
    2073418: 0x63,
    2073419: 0xF3,
    2073420: 0xC6,
    2073421: 0xF2,
    2073422: 0x7B,
    2073423: 0x70,
    2073425: 0xF6,
    2073426: 0x1B,
    2073427: 0x5F,
    2073428: 0x60,
    2073429: 0xF8,
    2073430: 0xC6,
    2073431: 0xF2,
    2073432: 0x7B,
    2073433: 0x30,
    2073434: 0xF1,
    2073435: 0xF8,
    2073436: 0x1B,
    2073437: 0x3F,
    2073438: 0x0E,
    2073439: 0xFD,
    2073440: 0xC6,
    2073441: 0xF2,
    2073443: 0x90,
    2073444: 0x23
}

# Convertir le contenu binaire en liste d'octets pour modification
byte_array = bytearray(file_content_golf)

# Appliquer les transformations spécifiques
for pos, ref_value in transformations_specific.items():
    byte_array[pos] = ref_value

# Écrire le fichier de sortie
output_file_final = "/var/www/html/modification_carto/golf_modified.bin"
with open(output_file_final, "wb") as file:
    file.write(byte_array)

print("Transformations spécifiques appliquées avec succès.")
