import psycopg2
import os

DATABASE_URL = "PATH" 

def leer_resistencias_db():
    matriz = []

    try:
        conexion_bd = psycopg2.connect(DATABASE_URL)
        bd = conexion_bd.cursor()

        bd.execute("SELECT id, resistencia FROM DATOS")
        filas = bd.fetchall()

        for fila in filas:
            matriz.append([int(fila[0]), float(fila[1])])

        bd.close()
        conexion_bd.close()

    except Exception as e:
        print("Error al leer desde la base de datos:", e)

    return matriz

def crear_tabla_resultados():
    try:
        conexion_bd = psycopg2.connect(DATABASE_URL)
        bd = conexion_bd.cursor()

        sql = """
        CREATE TABLE IF NOT EXISTS RESULTADO_ESTADISTICA (
            id_resultado SERIAL PRIMARY KEY,
            media NUMERIC(15,4),
            moda NUMERIC(15,4),
            rango NUMERIC(15,4)
        );
        """

        bd.execute(sql)
        conexion_bd.commit()

        bd.close()
        conexion_bd.close()

    except Exception as e:
        print("Error al crear la tabla:", e)

def guardar_resultados(vmedia, vmoda, vrango):
    try:
        conexion_bd = psycopg2.connect(DATABASE_URL)
        bd = conexion_bd.cursor()

        sql = """
        INSERT INTO RESULTADO_ESTADISTICA
        (media, moda, rango)
        VALUES (%s, %s, %s);
        """

        bd.execute(sql, (vmedia, vmoda, vrango))
        conexion_bd.commit()

        bd.close()
        conexion_bd.close()

        print("Resultados guardados.")

    except Exception as e:
        print("Error al guardar resultados:", e)

def media(matriz):
    suma = 0
    cant = 0
    for i in range(len(matriz)):
        suma += matriz[i][1]
        cant += 1
    vmedia = suma / cant
    return vmedia

def moda(matriz):
    max_frecuencia = 0
    valor_moda = 0

    for i in range(len(matriz)):
        contador = 0

        for j in range(len(matriz)):
            if matriz[i][1] == matriz[j][1]:
                contador += 1

        if contador > max_frecuencia:
            max_frecuencia = contador
            vmoda = matriz[i][1]

    return vmoda

def rango(matriz):
    max = 0
    min = 0
    for i in range(len(matriz)):
        if matriz[i][1] > max:
            max = matriz[i][1]
        if matriz[i][1] < min:
            min = matriz[i][1]
    vrango = max - min
    return vrango
   
def imprimir_resultados(vmedia, vmoda, vrango):
    print("Media:", vmedia)
    print("Moda:", vmoda)
    print("Rango:", vrango)

matriz = leer_resistencias_db()

print(matriz)

vmedia = media(matriz)
vmoda = moda(matriz)
vrango = rango(matriz)

imprimir_resultados(vmedia, vmoda, vrango)

crear_tabla_resultados()
guardar_resultados(vmedia, vmoda, vrango)