import re

class MemoryRobotNLP:
    def __init__(self, max_size):
        self.max_size = max_size
        self.memory = {}

    def add_concept(self, concepto, string):
       
        if concepto not in self.memory:
            self.memory[concepto] = []
        #evaluate priority calculation
        priority = 1 - (1/len(concepto))
        self.memory[concepto].append({"Found_text":string, "Priority_Weight":priority})

    def delete_concept(self, concepto):
        if concepto in self.memory:
            del self.memory[concepto]

    def add_string(self, concepto, string, prioridad):
        if concepto not in self.memory:
            self.memory[concepto] = []

        self.memory[concepto].append((string, prioridad))

    def delete_string(self, concepto, string):
        if concepto in self.memory:
            self.memory[concepto] = [(s, p) for s, p in self.memory[concepto] if s != string]

    def search_concept_pattern(self, patron):
            resultados = {}

            for concepto, strings in self.memory.items():
                for string, _ in strings:
                    if re.search(patron, string,re.IGNORECASE):
                        if concepto not in resultados:
                            resultados[concepto] = []
                        resultados[concepto].append(string)

            return resultados
    def get_concepts_substrings(self, espacio_disponible):
        memoria_ordenada = sorted(self.memory.items(), key=lambda x: sum(prioridad for _, prioridad in x[1]), reverse=True)
        espacio_utilizado = 0
        conceptos_acotados = []

        for concepto, strings in memoria_ordenada:
            espacio_concepto = sum(prioridad for _, prioridad in strings)
            if espacio_utilizado + espacio_concepto <= espacio_disponible:
                conceptos_acotados.append((concepto, strings))
                espacio_utilizado += espacio_concepto
            else:
                break

        return conceptos_acotados


# Ejemplo de uso


if __name__ == "__main__":

    memoria_robot = MemoryRobotNLP(max_size=100)

    memoria_robot.add_concept("animales", [("perro", 0.8), ("gato", 0.7), ("pájaro", 0.5)])
    memoria_robot.add_concept("colores", [("rojo", 0.9), ("verde", 0.6), ("azul", 0.7)])

    print("Memoria completa:")
    print(memoria_robot.memory)

    memoria_robot.add_string("animales", "pez", 0.6)
    memoria_robot.delete_string("colores", "verde")
    memoria_robot.delete_concepto("colores")

    print("\nMemoria después de modificaciones:")
    print(memoria_robot.memory)

    conceptos_acotados = memoria_robot.get_concepts_substrings(50)
    print("\nConceptos acotados a un tamaño máximo de memoria:")
    print(conceptos_acotados)