package crc.Models;

import java.util.Scanner;

public class CrcCalcul {

    // Méthode pour effectuer une division binaire (XOR)
    public static String divisionBinaire(String dividende, String diviseur) {
        int longueurDiviseur = diviseur.length();
        StringBuilder temp = new StringBuilder(dividende.substring(0, longueurDiviseur));
        System.out.println("diviseur = " + diviseur);
        int longueur = dividende.length();
        int cmpt = 0;
        
        while (longueurDiviseur < longueur) { 
            if (temp.charAt(0) == '1') {
                temp = new StringBuilder(xor(temp.toString(), diviseur));
            } else {
                temp = new StringBuilder(xor(temp.toString(), "0".repeat(diviseur.length())));
            }
            temp.append(dividende.charAt(longueurDiviseur));
            temp.deleteCharAt(0); // Supprimer le bit de gauche après XOR
            longueurDiviseur += 1;
            System.out.println("Le reste de la division n°" + cmpt + " est : "+temp);
            cmpt++;
        }

        if (temp.charAt(0) == '1') {
            temp = new StringBuilder(xor(temp.toString(), diviseur));
        } else {
            temp = new StringBuilder(xor(temp.toString(), "0".repeat(diviseur.length())));
        }
        System.out.println("tmp = " + temp);
        return temp.substring(1); // Extraire le reste
    }

    // Fonction XOR
    public static String xor(String a, String b) {
        StringBuilder resultat = new StringBuilder();
        for (int i = 0; i < b.length(); i++) {
            resultat.append(a.charAt(i) == b.charAt(i) ? '0' : '1');
        }
        return resultat.toString();
    }

    // Générer le CRC (Emetteur)
    public static String genererCRC(String message, String diviseur) {
        int longueurDiviseur = diviseur.length() - 1;
        String messageAugmente = message + "0".repeat(longueurDiviseur);
        System.out.println("Message après ajout de " + longueurDiviseur + " zéros : " + messageAugmente);
        
        String reste = divisionBinaire(messageAugmente, diviseur);
        System.out.println("Reste après division binaire : " + reste);
        
        String messageFinal = message + reste;
        System.out.println("Message final avec CRC : " + messageFinal);
        
        return messageFinal;
    }

    // Vérifier le CRC (Récepteur)
    public static boolean verifierCRC(String message, String diviseur) {
        System.out.println("Vérification du message reçu : " + message);
        String reste = divisionBinaire(message, diviseur);
        System.out.println("Reste après division : " + reste);
        
        boolean estValide = reste.replace("0", "").isEmpty();
        if (estValide) {
            System.out.println("Le message est valide (pas d'erreurs détectées).");
        } else {
            System.out.println("Le message contient des erreurs !");
        }
        return estValide;
    }
}
