"""
Necesito código Python para una clase que
contenga el nombre, apellidos. email y fecha de nacimiento
de una persona. Toda esta información será accesible
a través de propiedades de solo lectura.
Un método str convertirá la información
en cadena de caracteres.
Además, la clase Empleado derivada de persona
contiene la información de la empresa
para la que trabaja,
lo publica como propiedad de solo lectura,
y también provee de un método str que convierte
toda la información a cadena de caracteres.
La clase estudiante derivada de persona contiene
la institución, el nombre del grado y
el número de curso (1 a 4).
Toda esta información también se publica
como propiedades de solo lectura y también ofrece
un método str que convierte toda la información
a cadena de caracteres.
Finalmente, la clase PersonaRepo contiene
una lista de personas, un método str
que devuelve toda la información de
todas las personas (una por línea),
y una propiedad de solo lectura personas
que devuelve una lista de personas.
Además, el método busca admite una lambda
que permite ejecutar un filtrado
de las personas almacenadas.
"""
 
# Copilot
 
 
class Persona:
    def __init__(self, nombre, apellidos, email, fecha_nacimiento):
        self.__nombre = nombre
        self.__apellidos = apellidos
        self.__email = email
        self.__fecha_nacimiento = fecha_nacimiento
 
    @property
    def nombre(self):
        return self.__nombre
 
    @property
    def apellidos(self):
        return self.__apellidos
 
    @property
    def email(self):
        return self.__email
 
    @property
    def fecha_nacimiento(self):
        return self.__fecha_nacimiento
 
    def __str__(self):
        return f'{self.nombre} {self.apellidos}, {self.email}, {self.fecha_nacimiento}'
 
 
class Empleado(Persona):
    def __init__(self, nombre, apellidos, email, fecha_nacimiento, empresa):
        super().__init__(nombre, apellidos, email, fecha_nacimiento)
        self.__empresa = empresa
 
    @property
    def empresa(self):
        return self.__empresa
 
    def __str__(self):
        return super().__str__() + f', {self.empresa}'
 
 
class Estudiante(Persona):
    def __init__(self, nombre, apellidos, email, fecha_nacimiento, institucion, grado, curso):
        super().__init__(nombre, apellidos, email, fecha_nacimiento)
        self.__institucion = institucion
        self.__grado = grado
        self.__curso = curso
 
    @property
    def institucion(self):
        return self.__institucion
 
    @property
    def grado(self):
        return self.__grado
 
    @property
    def curso(self):
        return self.__curso
 
    def __str__(self):
        return super().__str__() + f', {self.institucion}, {self.grado}, {self.curso}'
 
 
class PersonaRepo:
    def __init__(self):
        self.__personas = []
 
    @property
    def personas(self):
        return self.__personas
 
    def agregar_persona(self, persona):
        self.__personas.append(persona)
 
    def buscar(self, funcion):
        return list(filter(funcion, self.__personas))
 
    def __str__(self):
        return '\n'.join(str(persona) for persona in self.__personas)
 
 
### Ejemplo de uso (tomado de Gemini)
 
# Crear un repositorio de personas
repositorio_personas = PersonaRepo()
 
# Crear personas
persona1 = Persona("Juan", "Pérez", "juan.perez@email.com", "01/01/1980")
persona2 = Empleado("María", "Gómez", "maria.gomez@email.com", "02/02/1990", "Google")
persona3 = Estudiante("Ana", "López", "ana.lopez@email.com", "03/03/2000", "Universidad de Ourense", "Ingeniería Informática", 2)
 
# Agregar personas al repositorio
repositorio_personas.agregar_persona(persona1)
repositorio_personas.agregar_persona(persona2)
repositorio_personas.agregar_persona(persona3)
 
# Mostrar la información de todas las personas
print(repositorio_personas)
 
# Buscar personas mayores de 30 años
personas_mayores_30 = repositorio_personas.buscar(lambda persona: persona.fecha_nacimiento < "01/01/1994")
 
# Mostrar la información de las personas mayores de 30 años
print("\nPersonas mayores de 30 años:")
for persona in personas_mayores_30:
  print(persona)