#!/usr/bin/env python
# -*- coding: utf-8 -*-

from AnyankaKeys import AnyankaKeys

class Tests:

    @staticmethod
    def change_base() -> None:

        for prueba in [
            [1, 2, 3],
            [2, 5, 5], 
            [3, 2], 
            [0]
        ]:
            
            ncripted:list[int] = []
            decripted:list[int] = []
            
            def ncript(value:int) -> None:
                ncripted.insert(0, value)
                # ncripted.append(value)

            def decript(value:int) -> None:
                decripted.insert(0, value)
                # decripted.append(value)

            AnyankaKeys.change_base(prueba, 2, 16, None, ncript)
            AnyankaKeys.change_base(ncripted, 16, 2, None, decript)

            print(["O", prueba])
            # print(["A", AnyankaKeys.to_base(prueba, 16, 10, lambda value:print(["C", value]))])
            # print(["B", list(AnyankaKeys.to_base_old(prueba, 16, 10))])
            print(["A", ncripted])
            print(["B", decripted])

    @staticmethod
    def basic_encript() -> None:
        
        anyanka:AnyankaKeys = AnyankaKeys({
            "password": "MiContraseñaSecreta123!@#",
        })

        for prueba in [
            "Hola Mundo",
            "Hola Mundo",
            "Iola Mundo",
            "Hola Mundo1",
            "AnyankaKeys",
            "1234567890",
            "!@#$%^&*()_+-=[]{}|;':\",./<>?"
        ]:
            encrypted:str = anyanka.encrypt(prueba)
            decrypted:str = anyanka.decrypt(encrypted)

            print(["O", prueba])
            print(["A", encrypted])
            print(["B", decrypted])

    @staticmethod
    def get_hexadecimal() -> None:
        print(["0x" + hex(value)[2:].upper() for value in (
            # -- Grupo 1: Constantes de Dispersión Máxima (Golden/Silver Ratios) --
            2654435761,  # 0x9E3779B1 (Knuth's Golden Ratio Prime)
            1865882353,  # Cerca de 2^32 / sqrt(5)
            3339476533,  # Alta entropía
            
            # -- Grupo 2: Primos "Sucios" (Mezcla perfecta de 0s y 1s) --
            # Estos números parecen ruido estático en binario.
            32416190071 & 0xFFFFFFFF, # (Nota: Ajustado a 32 bits si copias de 64) -> Usamos estos directos:
            2246822519, # Primo cercano a Murmur constant
            3266489917, 
            668265263, 
            374761393,
            
            # -- Grupo 3: Primos Grandes (Cercanos al límite de 32-bit signed) --
            2147483647, # 2^31 - 1 (Mersenne Prime - Clásico)
            2147483629, # Un poco menos que el máximo
            2147483587,
            
            # -- Grupo 4: Primos de "Grano Fino" (Para variedad en rangos medios) --
            160481183,
            486187739,
            999999937,  # El primo más grande menor de mil millones
            1000000007
        )])

    @staticmethod
    def test_cross_platforms() -> None:

        anyanka:AnyankaKeys = AnyankaKeys()
        encrypted:str

        for encrypted in (
            "Ddsz2vfFpj4eVh5DLFu", 
            "nsxC3wVPqG6gm49Vnws9hB", 
            "2V1HPCz7ufLEHDUib4uTbksdoZE3XxFv3", 
            "CU4jGC9QSJ5HfUdxEqed5VEQdkYPYF5gg"
        ):
            print([encrypted, anyanka.decrypt(encrypted).encode("Latin-1").decode("utf-8")])

# Tests.change_base()
# Tests.basic_encript()
# Tests.get_hexadecimal()
Tests.test_cross_platforms()