''' Programa que reporta totales de ventas de un día en un negocio (unidades vendidas y total vendido por artículo, y total vendido general)

En un archivo de texto precios.txt se dispone de los precios de cada artículo, y en otro las cantidades de artículos de cada venta de un día.

El programa carga en un diccionario los precios de los artículos, totaliza en otro diccionario las unidades vendidas de cada artículo a partir
del archivo de texto cuyo nombre indica el usuario y que representa el detalle de ventas de un día, y finalmente reporta las totalizaciones en pantalla.

Para el reporte de totalizaciones se pregunta al usuario si lo prefiere ordenado por codigo de artículo, por cantidades de unidades descendentes o por
totales descendentes.

Por ejemplo:

precios.txt
-----------
15  23700
23 219990
32  47600
44 129900

20240521.txt
------------
23 1
15 2
44 1
32 2
15 3
44 1

Los resultados deberán ser, por ejemplo ordenados por codigo de artículo:
15 5  118500.00
23 1  219990.00
32 2   95200.00
44 2  259800.00

Total 693490.00 '''

def precios():
    ''' Devuelve un diccionario con los precios de cada artículo, que obtiene de precios.txt '''
    # Prólogo
    p = {} # diccionario vacío de precios (estado inicial)
    arch = open ('precios.txt', 'r') # apertura de archivo precios.txt para leer en variable arch

    # Desarrollo
    for línea in arch: # para cada linea del archivo, por ejemplo, la primera '15 23700'
        línea = línea.split() # se descompone la línea en un lista de subcadenas separadas por espacios, p.e. ['15', '23700']
        p[línea[0]] = float(línea[1]) # se crea un ítem del diccionario p con clave línea[0] y valor línea[1], p.e. {'15': 23700.0}

    # Epílogo
    arch.close() # cierre del archivo
    return p # devolución de diccionario de precios

def ventas(nomArch):
    ''' Devuelve un diccionario con el total de unidades vendidas por artículo, que calcula a partir del contenido del archivo con nombre representado
    por la variable nomAch '''
    # Prólogo
    v = {} # diccionario vacio de ventas (estado inicial)
    arch = open(nomArch, 'r') # apertura de archivo nomArch para totalizar unidades vendidas de cada producto

    # Desarrollo
    for línea in arch:
        línea = línea.split()
        if línea[0] in v: v[línea[0]] += int(línea[1]) # si el ítem con clave línea[0] existe en v, se suma a su valor la cantidad de unidades que figura
        else: v[línea[0]] = int(línea[1]) # si no, se crea un ítem con clave línea[0] y valor inicial la cantidad de unidades vendidas que figura en la línea

    # Epílogo
    arch.close() # cierre del archivo
    return v # devolución de diccionario de precios

def totalizar(ventas, precios):
    ''' Reporta en pantalla la cantidad de unidades y el total vendido de cada artículo, y el total de ventas general '''
    # Prólogo
    total = 0.0 # estado inicial del totalizador de ventas
    totalización = [] # lista inicial de totalización por artículo vacia

    # Desarrollo (totalización de unidades y montos vendidos por artículo)
    for artículo, cantidad in ventas.items():
        total_art = cantidad*precios[artículo] # monto total vendido de un artículo
        totalización.append((artículo, cantidad, total_art)) # se agrega a la lista una tupla con totales por artículo
        total += total_art # se acumula el total por artículo al total general

    # Epílogo (muestra de resultados)
    orden = input('\n¿Orden del reporte por artículo (1), o por totales descendentes de unidades (2) o montos totales (3)? ')
    if orden == '1': totalización.sort() # ordena las tuplas por el primer componente
    elif orden == '2': totalización.sort(key=lambda x:x[1], reverse=True) # ordena por cantidad vendida por artículo en orden descendente
    elif orden == '3': totalización.sort(key=lambda x:x[2], reverse=True) # ordena por monto toal vendido por artículo en orden descendente
    else: print('\nNo se ordenan las totalizaciones porque no se ingresó una opción válida (1, 2 o 3)')

    print('\nCantidad de unidades y monto total de ventas por artículo:')
    for totArt in totalización: print(f'{totArt[0]:4s}{totArt[1]:4d}{totArt[2]:12.2f}') # s indica formato string (cadena), d decimal entero y f punto flotante
    print(f'\nEl total de ventas es de ${total:0.2f}')

# PROGRAMA
#Prólogo
print('Totalizaciones por artículo y general de ventas registradas en un archivo de texto\n')
p = precios() # carga de precios en diccionario p
archVentas = input('Ingrese el nombre del archivo de ventas, incluyendo la extensión .txt: ')
v = ventas(archVentas) # totalización de unidades vendidas de cada artículo en diccionario v

# Desarrollo
totalizar(v, p)

# Epílogo
input('\nPulse Intro/Enter para terminar')
