import psycopg2
import pandas as pd
import numpy as np
import traceback
from datetime import datetime, timedelta
import plotly.express as px
import os
import ftplib
import smtplib
import ssl
import random, string
import plotly.graph_objects as go
import pymysql 
import pymysql.cursors
import time
import psycopg2
#insertar datos a la base de datos local
def loadtosql(table, data):
    start_time2 = time.time()
    connection = pymysql.connect(host='82.163.176.111',
                                    user='mgmrenso_voldemort',
                                    password='RHd1&n%=@V2@',
                                    db='mgmrenso_alsec')
    cursor = connection.cursor()

    # Eliminar todos los registros existentes en la tabla
    delete_sql = "DELETE FROM " + table
    try:
        cursor.execute(delete_sql)
        connection.commit()
        print("Datos existentes eliminados correctamente.")
    except Exception as delete_error:
        connection.rollback()
        print("Error al eliminar datos existentes:", delete_error)
        connection.close()
        return

    # Insertar nuevos datos en la tabla
    cols = ",".join([str(i) for i in data.columns.tolist()])
    insert_sql = "INSERT INTO " + table + \
                 "(" + cols + ") VALUES (" + "%s," * (len(data.values[0]) - 1) + "%s)"
    lista = list(data.itertuples(index=False, name=None))

    try:
        cursor.executemany(insert_sql, lista)
        connection.commit()
        print("Nuevos datos insertados correctamente: ", data.shape[0])
        print("-En- %s seconds ---" % (time.time() - start_time2))
    except Exception as insert_error:
        connection.rollback()
        print("Error al insertar nuevos datos:", insert_error)
    finally:
        connection.close()

#Conexion a la base de Datos local
def data_local(sql,columnas):
    db = pymysql.connect(host='82.163.176.111',
                                    user='mgmrenso_voldemort',
                                    password='RHd1&n%=@V2@',
                                    db='mgmrenso_alsec')
    
    cursor = db.cursor()
    # Insertar info en DB
    try:
        cursor.execute(sql)
        db.commit()
        result = cursor.fetchall()
        column_names = columnas
        df = pd.DataFrame(result, columns=column_names)
        del df['id']
        df.reset_index()
    
        return df
    except Exception as e:
        db.rollback()
        print("Exception Ocurred: ", e)
        traceback.print_exc()
    finally:
        db.close()


#Conexion a la base de Datos
def data(sql,columnas):
    db = psycopg2.connect(user="mgmlegola",
    password="2s6kWSH5CYFG%5KT",
    host="198.27.67.220",
    database="mgmrenso_aragorn")
    cursor = db.cursor()
    # Insertar info en DB
    try:
        cursor.execute(sql)
        db.commit()
        result = cursor.fetchall()
        column_names = columnas
        df = pd.DataFrame(result, columns=column_names)
        df['fechafull']=df['fechadia']+df['fechahora']
        df['fechafull']=pd.to_datetime(df['fechafull'], format='%Y-%m-%d%H:%M:%S')
        del df['id']
        df.reset_index()
    
        return df
    except Exception as e:
        db.rollback()
        print("Exception Ocurred: ", e)
        traceback.print_exc()
    finally:
        print("algo fallo")





#------------------
columnas_fechas=["id","inicio","fin"]#definimos columnas
sql_fechas = 'SELECT * FROM `fechas` WHERE 1 '#sql de los datos
df_fechas=data_local(sql_fechas,columnas_fechas)#llamamos la funcion y le mandamos los pàrametros 
inicio=str(df_fechas["inicio"][0])
fin=str(df_fechas["fin"][0])
print(fin)
#------------------------
# SQL Y DATAFRAME DE LOS DATOS
columnas=["id","circuito","fechadia","fechahora","energia"]#definimos columnas
#sql = 'SELECT * FROM `mqtt_vitro` WHERE `fechadia` BETWEEN "2024-01-01" AND "2024-01-10" '#sql de los datos
sql = "SELECT id, circuito, fechadia, fechahora, energia FROM public.alsec_compresor WHERE fechadia BETWEEN '"+inicio+"' and '"+fin+"';"#sql de los datos
df=data(sql,columnas)#llamamos la funcion y le mandamos los pàrametros     


df['fechadia'] = pd.to_datetime(df['fechadia'])

# Filtrar solo los circuitos 1, 2 y 3
df_filtered = df[df['circuito'].isin(['Circuit_1', 'Circuit_2', 'Circuit_3'])]

# Agrupar por fecha y sumar la energía de los circuitos 1, 2 y 3
df_diario_compresor = df_filtered.groupby('fechadia')['energia'].sum().reset_index()

# Renombrar la columna 'energia' a 'diario_compresor'
df_diario_compresor.rename(columns={'energia': 'diario_compresor'}, inplace=True)


# Redondea el valor a tres decimales y conviértelo a cadena
df_diario_compresor['diario_compresor'] = df_diario_compresor['diario_compresor'].round(3).astype(str)


#----------
df_suma_hora= df_filtered.groupby(["fechadia",'fechahora'])['energia'].apply(sum).reset_index()
df_suma_hora["fechadia"]=pd.to_datetime(df_suma_hora["fechadia"])
# Crea una nueva columna 'mes' para almacenar solo el mes
df_suma_hora['mes'] = df_suma_hora['fechadia'].dt.month


# Agrupa por las columnas 'mes' y 'fechahora' y suma la energía para cada hora del mes
df_suma_mes = df_suma_hora.groupby(['mes', 'fechahora'])['energia'].sum().reset_index()

# Suma la energía por mes
df_suma_mes = df_suma_mes.groupby('mes')['energia'].sum().reset_index()




# Renombrar columnas
df_suma_mes.columns = ['mes', 'Total_Mensual']

#valor en pesos
valorVatiosPesos= float(636.13)
valor=df_suma_mes["Total_Mensual"]*valorVatiosPesos
valor= valor.round(2).map('{:,.3f}'.format)
df_pesos= pd.DataFrame({"total_pesos":valor})


print(df_pesos)


if len(df_diario_compresor) > 0:
    df = pd.DataFrame(df_diario_compresor, columns=[
                            "fechadia", "diario_compresor"])
    if df.size > 0:
        loadtosql('detalle_diario', df)
else:
    print("Nada que guardar")


#mensual
if len(df_suma_mes) > 0:
    df = pd.DataFrame(df_suma_mes, columns=[
                            "mes", "Total_Mensual"])
    df['Total_Mensual'] = df['Total_Mensual'].round(3).astype(str)
    if df.size > 0:
        loadtosql('detalle_mensual', df)
else:
    print("Nada que guardar")
#pesos
if len(df_pesos) > 0:
    df_pesos = df_pesos.replace({',': '.'}, regex=True)
    df = pd.DataFrame(df_pesos, columns=[
                            "total_pesos"])
    if df.size > 0:
        loadtosql('detalle_en_pesos', df)
else:
    print("Nada que guardar")
