def entrada():
    c = 12345
    m = 32768
    a = 1103515245
    Error = 0
    Cantidad = 0
    sizeC = ''
    nameC = ''
    maxWeightC = ''
    nboxes = []
    boxtypes = []
    nombres = []
    #size=(200, 700, 300), name='Main Container', maxWeight=rand.randint(10, 20) * 100000000
    Entrada = int(
        input(
            "Ingrese el tipo de entrada que desea realizar:\n1.-Consola\n2.-Archivo CSV\n3.-Aleatorio\n"
        ))

    if Entrada == 1:
        #CONTENEDOR
        Cadena = ''
        while True:
            try:
                sizeC = input(
                    "Ingrese el tamaño del contenedor de la siguiente forma: X, Y, Z\n"
                )
                sizeC = sizeC.split(',')
                if len(sizeC) != 3: raise IOError
                for i in range(len(sizeC)):
                    if float(sizeC[i]) <= 0:
                        raise ValueError
                    else:
                        sizeC[i] = float(sizeC[i])
                break
            except:
                print('Ha ocurrido un problema, se va a reiniciar el proceso')

        while True:
            try:
                nameC = input("Ingrese el nombre del contenedor\n")
                if nameC == ('' or ' ') or len(nameC) == 0: raise ValueError
                if nameC not in nombres: nombres.append(nameC)
                elif nameC in nombres: raise ValueError
                break

            except:
                print('Ha ocurrido un problema, se va a reiniciar el proceso')

        while True:
            try:
                maxWeightC = float(
                    input("Ingrese el peso maximo del contenedor\n"))
                if maxWeightC < 1:
                    raise TypeError
                break
            except:
                print('Ha ocurrido un problema, se va a reiniciar el proceso')

        while True:
            try:
                Cantidad = int(input('Ingrese la cantidad de tipos de caja\n'))
                if Cantidad < 1:
                    raise ValueError
                break
            except:
                print('Ha ocurrido un problema, se va a reiniciar el proceso')

    #FIN CONTENEDOR
    # TIPO DE CAJA

        for i in range(Cantidad):
            while True:
                try:
                    nombre = input('Ingrese el nombre de la caja no.' +
                                   str(i + 1) + '\n')
                    if nombre == ('' or ' ') or nombre == None:
                        raise ValueError
                    if nombre not in nombres: nombres.append(nameC)
                    elif nombre in nombres: raise ValueError
                    break
                except:
                    print(
                        'Ha ocurrido un problema, se va a reiniciar el proceso'
                    )

            while True:
                try:
                    beneficio = float(
                        input('Ingrese el Beneficio de la caja no.' +
                              str(i + 1) + '\n'))
                    if beneficio <= 0: raise ValueError
                    break
                except:
                    print(
                        'Ha ocurrido un problema, se va a reiniciar el proceso'
                    )

            while True:
                try:
                    peso = float(
                        input('Ingrese el Peso de la caja no.' + str(i + 1) +
                              '\n'))
                    if peso <= 0: raise ValueError
                    break
                except:
                    print(
                        'Ha ocurrido un problema, se va a reiniciar el proceso'
                    )

            while True:
                try:
                    dimensiones = input(
                        'Ingrese las dimensiones de la caja no.' + str(i + 1) +
                        'con formato: X, Y, Z \n')
                    dimensiones = dimensiones.split(',')
                    dimensiones = [
                        float(dimensiones[0]),
                        float(dimensiones[1]),
                        float(dimensiones[2])
                    ]
                    for element in dimensiones:
                        if element <= 0: raise ValueError
                    break
                except:
                    print(
                        'Ha ocurrido un problema, se va a reiniciar el proceso'
                    )

            while True:
                try:
                    ncajas = int(
                        input(
                            'Ingrese la cantidad de cajas deltipo de caja no.'
                            + str(i + 1) + '\n'))
                    if ncajas <= 0: raise ValueError
                    break
                except:
                    print(
                        'Ha ocurrido un problema, se va a reiniciar el proceso'
                    )

            boxtypes.append(
                Classes.BoxType(type=nombre,
                                benefit=beneficio,
                                weight=peso,
                                size=dimensiones))
            nboxes.append(ncajas)

        bin = Classes.Bin(size=(float(sizeC[0]), float(sizeC[1]),
                                float(sizeC[2])),
                          name=nameC,
                          maxWeight=maxWeightC)
        return ([bin, boxtypes, nboxes])
    #FIN TIPO DE CAJA

    elif Entrada == 2:
        try:
            CSV = []
            #CONTENEDOR
            with open('3D Bin Packing.csv', 'r') as Archivo:
                Lineas = csv.reader(Archivo, delimiter=';')
                for row in Lineas:
                    CSV.append(row)

            sizeC = CSV[0][0]
            sizeC = sizeC.split(',')
            if len(sizeC) != 3: raise IOError
            for element in sizeC:
                if float(element) <= 0: raise ValueError
            nameC = CSV[0][1]
            if nameC == ('' or ' ') or len(nameC) == 0: raise IOError
            if nameC not in nombres: nombres.append(nameC)
            elif nameC in nombres: raise ValueError
            maxWeightC = float(CSV[0][2])
            if maxWeightC <= 0: raise ValueError
            #FIN CONTENEDOR
            CSV.pop(0)
            #TIPO DE CAJA
            for Tipo in CSV:
                if len(Tipo) < 5: raise ValueError
                if int(Tipo[4]) < 1: raise ValueError
                Tipo[3] = Tipo[3].split(',')
                if Tipo[0] == ('' or ' ') or len(Tipo[0]) == 0: raise IOError
                if Tipo[0] not in nombres: nombres.append(Tipo[0])
                elif Tipo[0] in nombres: raise ValueError
                if float(Tipo[1]) <= 0 or float(Tipo[2]) <= 0: raise ValueError
                if (float(Tipo[3][0]) or float(Tipo[3][1])
                        or float(Tipo[3][2])) <= 0:
                    raise ValueError
                boxtypes.append(
                    Classes.BoxType(type=Tipo[0],
                                    benefit=float(Tipo[1]),
                                    weight=float(Tipo[2]),
                                    size=(float(Tipo[3][0]), float(Tipo[3][1]),
                                          float(Tipo[3][2]))))
                nboxes.append(int(Tipo[4]))

            bin = Classes.Bin(size=(float(sizeC[0]), float(sizeC[1]),
                                    float(sizeC[2])),
                              name=nameC,
                              maxWeight=maxWeightC)
            return ([bin, boxtypes, nboxes])
            #FIN TIPO DE CAJA
        except:
            print(
                'Ocurrio un error durante la carga del archivo \'3D Bin Packing\'. \
                  \nRevise que la información sea correcta y cuente con el formato necesario.'
            )

    elif Entrada == 3:

        # bin = Classes.Bin(size=(rand.randint(100,300), rand.randint(100, 300), rand.randint(100, 300)))
        sizeC = [
            rand.randint(100, 300),
            rand.randint(100, 300),
            rand.randint(100, 300)
        ]
        nameC = 'Main Container'
        maxWeightC = rand.randint(1000, 10000)

        for i in range(rand.randint(1, 10)):
            depth = rand.randint(20, 100)
            width = rand.randint(20, 100)
            height = rand.randint(20, 100)
            boxtypes.append(
                Classes.BoxType(i + 1, rand.randint(20, 50),
                                rand.randint(20, 30), (width, depth, height)))
            nboxes.append(rand.randint(20, 50))
        # print(boxtypes[i])
        bin = Classes.Bin(size=(float(sizeC[0]), float(sizeC[1]),
                                float(sizeC[2])),
                          name=nameC,
                          maxWeight=maxWeightC)
        return ([bin, boxtypes, nboxes])