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

""" Ejemplo de Clase de Altas, Bajas y Cambios
	:author: ACL
	:version: 0.1
"""


import shelve


class Producto:
    """Definicion de la clase producto"""

    def __init__(self):
        """Constructor de la clase producto"""
        self.__id = None
        self.__nomb = None
        self.__precio = None
        self.__cant = None

    def inicializa(self, id, nomb, precio, cant):
        """Inicializa la clase producto"""
        self.__id = id
        self.__nomb = nomb
        self.__precio = precio
        self.__cant = cant

    def captura(self):
        """Captura la clase producto"""
        self.__id = input("Identificador: ")
        self.__nomb = input("Nombre: ")
        self.__precio = float(input("Precio: "))
        self.__cant = int(input("Cantidad: "))

    def identificador(self):
        """Retorna el identificador producto"""
        return self.__id

    # Acceso al valor self.__id mediante la variable id
    id = property(identificador)

    def visualizar(self):
        """Visualiza la clase producto"""
        print(self)

    def __repr__(self):
        """Visualiza la clase producto"""
        a = "\nIdentificador: {0}\n".format(self.__id)
        a += "Nombre: {0}\n".format(self.__nomb)
        a += "Precio: {:,.2f}\n".format(self.__precio)
        a += "Cantidad: {0}\n".format(self.__cant)
        return a


class Televisor(Producto):
    """Definicion de la clase Televisor"""

    def __init__(self):
        """Constructor de la clase Televisor"""
        Producto.__init__(self)
        self.__pulg = None
        self.__resol = None

    def inicializa(self, id, nomb, precio, cant, pulg, resol):
        """Inicializa la clase Televisor"""
        Producto.inicializa(self, id, nomb, precio, cant)
        self.__pulg = pulg
        self.__resol = resol

    def captura(self):
        """Captura la clase Televisor"""
        Producto.captura(self)
        self.__pulg = int(input("Pulgadas: "))
        self.__resol = input("Resolucion: ")

    def __repr__(self):
        """Visualiza la clase Televisor"""
        a = Producto.__repr__(self)
        a += "Pulgadas: {0}\n".format(self.__pulg)
        a += "Resolucion: {0}\n".format(self.__resol)
        return a


class Reproductor(Producto):
    """Definicion de la clase Reproductor"""

    def __init__(self):
        """Constructor de la clase Reproductor"""
        Producto.__init__(self)
        self.__bocinas = None

    def inicializa(self, id, nomb, precio, cant, bocinas):
        """Inicializa la clase Reproductor"""
        Producto.inicializa(self, id, nomb, precio, cant)
        self.__bocinas = bocinas

    def captura(self):
        """Captura la clase Reproductor"""
        Producto.captura(self)
        self.__bocinas = int(input("Bocinas: "))

    def __repr__(self):
        """Visualiza la clase Reproductor"""
        a = Producto.__repr__(self)
        a += "Bocinas: {0}\n".format(self.__bocinas)
        return a


class Prueba:
    """Clase de prueba"""

    def __init__(self):
        """Constructor de la clase"""
        self.__lista = []  # Lista para los objetos creados
        self.__archivo = "ArchivoBD"
        self.__msw = 1
        self.__db = shelve.open(self.__archivo)
        for k in self.__db:
            self.__lista.append(self.__db[k])
        # print("constructor")

    def __del__(self):
        """Destructor"""
        # print("Destructor")

    def menu(self):
        """menu"""
        sw = {
            "1": self.altas,
            "2": self.bajas,
            "3": self.cambios,
            "4": self.visualiza,
            "9": self.salir,
        }
        while self.__msw:
            # os.system('clear') # NOTA para windows tienes que cambiar clear por cls
            print("Selecciona una opcion")
            print("\t1 - Altas")
            print("\t2 - Bajas")
            print("\t3 - Cambios")
            print("\t4 - Visualizar")
            print("\t9 - salir")
            # solicituamos una opcion al usuario
            opcionMenu = input("inserta un numero >> ")
            sw.get(opcionMenu, self.otro)()

    def altas(self):
        """Altas"""
        print("")
        opcion = input("Deseas dar de alta un Televisor (1) o un reproductor(2)? ")
        if opcion == "1":
            a = Televisor()
            a.captura()
            for i in self.__lista:
                if a.id == i.id:
                    print("Error identificador existe")
                    break
            else:
                self.__lista.append(a)
        elif opcion == "2":
            b = Reproductor()
            b.captura()
            for i in self.__lista:
                if b.id == i.id:
                    print("Error identificador existe")
                    break
            else:
                self.__lista.append(b)

    def bajas(self):
        """Bajas"""
        print("")
        id = input("Identificador a borrar?")
        for i in self.__lista:
            if id == i.id:
                print("identificador borrado")
                print(i.identificador())
                self.__lista.remove(i)

    def cambios(self):
        """Cambios"""
        print("")
        id = input("Identificador a cambiar?")
        for i in self.__lista:
            if id == i.id:
                i.captura()
        else:
            print("identificador no encontrado")

    def visualiza(self):
        """Visualizar"""
        # print("Visualiza la lista de articulos desde la lista")
        # print(self.__lista) # Visualiza el objeto lista
        print("Visualiza la lista de articulos")
        for i in self.__lista:
            # i.visualizar()
            # i.visualizaAtributosJeraquia()
            print(i)

    def salir(self):
        """Salir"""
        self.__msw = 0
        for reg in self.__lista:
            self.__db[reg.id] = reg
        self.__db.close()

    def otro(self):
        """En caso de no ser alguna de las opciones definidas"""
        print("")
        input(
            "No has pulsado ninguna opcion correcta...\npulsa una tecla para continuar"
        )


"""
Prueba de las clases
"""
if __name__ == "__main__":
    a = Prueba()
    a.menu()
