from mimetypes import MimeTypes
from flask import Flask 
from flask import render_template,request,redirect,url_for,flash
from flaskext.mysql import MySQL
from datetime import datetime
import os
from flask import send_from_directory
from pymysql import OperationalError

app= Flask(__name__)
app.secret_key="Develoteca"

#Conexion con la base de datos
mysql = MySQL()
app.config['MYSQL_DATABASE_HOST']='localhost'
app.config['MYSQL_DATABASE_USER']='ahsoluci_invita'
app.config['MYSQL_DATABASE_PASSWORD']='Hacking12*'
app.config['MYSQL_DATABASE_DB']='ahsoluci_invitaciones'
mysql.init_app(app)

#conn= mysql.connect()
#cursor=conn.cursor()

def get_db():
    try:
        conn = mysql.connect()
        cursor = conn.cursor()
        return conn, cursor
    except OperationalError:
        mysql.connect()
        return mysql.connection, mysql.connection.cursor()

#-----------------------------------------------------------------------
#Permite leer archivos de la carpeta uploads
CARPETA= os.path.join('uploads')
app.config['CARPETA']=CARPETA
@app.route('/uploads/<nombreFoto>')
def uploads(nombreFoto):
    return send_from_directory(app.config['CARPETA'],nombreFoto)

#DEFINICION DE RUTAS

#Ruta principal
#-----------------------------------------------------------------------
#Ruta principal
@app.route('/<int:id>')
def invitacion(id):

    #cursor.execute("SELECT * FROM cabeza_familia WHERE id=%s", (id))
    conn, cursor = get_db()

    cursor.execute("SELECT miembro_familia.* FROM miembro_familia JOIN cabeza_familia ON miembro_familia.id_cabeza_familia = cabeza_familia.id WHERE cabeza_familia.id = %s", (id))
    empleados=cursor.fetchall()
    #print(empleados)
    #conn.commit()

    nombrefamilia="SELECT * FROM cabeza_familia WHERE id=%s" % (id)
    cursor.execute(nombrefamilia)
    empleados2=cursor.fetchall()
    #print(empleados2)
    #conn.commit()

    cursor.close()
    conn.close()

    #envio de informacion a la plantilla index
    return render_template('invitacion/index.html', empleados=empleados, empleados2=empleados2)

#-----------------------------------------------------------------------

@app.route('/confirmar_asistencia', methods=['POST'])
def confirmar_asistencia():
    miembros_id = request.form.getlist('miembros_id[]')
    for id in miembros_id:
        asistencia = request.form.get(f'asistencia_{id}')
        sql="UPDATE miembro_familia SET confirmacion=%s WHERE id=%s;"
        datos=(asistencia,id)
        conn= mysql.connect()
        cursor=conn.cursor()
        cursor.execute(sql,datos)
        conn.commit()
    
    miembro_buscar = miembros_id[0]
    sql="SELECT id_cabeza_familia FROM miembro_familia WHERE id=%s;"
    datos=(miembro_buscar)
    cursor.execute(sql,datos)
    miembro=cursor.fetchone()
    print(miembro)
    #conn.commit()
    cursor.close()
    conn.close()

    url_completa='gracias/'+ str(miembro[0])

    return redirect(url_completa)
    
  
#-----------------------------------------------------------------------




#Ruta Agradecimiento
@app.route('/gracias/<int:id>')
def gracias(id):
    conn, cursor = get_db()
    nombrefamilia="SELECT * FROM cabeza_familia WHERE id=%s" % (id)
    cursor.execute(nombrefamilia)
    nombre_familia=cursor.fetchall()
    print(nombre_familia)
    #conn.commit()
    cursor.close()
    conn.close()
    return render_template('invitacion/gracias.html', nombre_familia=nombre_familia)
#-----------------------------------------------------------------------

#Ruta Construccion
@app.route('/construccion')
def mostrar_tabla():
    conn, cursor = get_db()

    # Realiza la consulta a la base de datos
    cursor.execute("SELECT id, nombre_completo, confirmacion, id_cabeza_familia, telefono, wp_enviado FROM miembro_familia WHERE wp_enviado = 0 AND telefono IS NOT NULL")
    miembros = cursor.fetchall()


    # Realiza la consulta a la base de datos
    cursor.execute("SELECT id, nombre_completo, confirmacion, id_cabeza_familia, telefono, wp_enviado FROM miembro_familia WHERE wp_enviado = 0 AND telefono IS NULL")
    miembros2 = cursor.fetchall()

    cursor.execute("SELECT id, nombre_completo, confirmacion, id_cabeza_familia, telefono, wp_enviado FROM miembro_familia WHERE wp_enviado = 1")
    miembros3 = cursor.fetchall()
    
    cursor.close()
    conn.close()

    return render_template('invitacion/construccion.html', miembros=miembros, miembros2=miembros2, miembros3=miembros3)
#-----------------------------------------------------------------------

#Ruta Confirmaciones
@app.route('/confirmaciones')
def mostrar_confirmaciones():
    conn, cursor = get_db()

    # Realiza la consulta a la base de datos
    cursor.execute("SELECT id, nombre_completo, confirmacion, id_cabeza_familia, telefono, wp_enviado FROM miembro_familia WHERE confirmacion = 1")
    confirmados = cursor.fetchall() 

    # Realiza la consulta a la base de datos
    cursor.execute("SELECT id, nombre_completo, confirmacion, id_cabeza_familia, telefono, wp_enviado FROM miembro_familia WHERE confirmacion = 0")
    noconfirmados = cursor.fetchall() 

    # Realiza la consulta a la base de datos
    cursor.execute("SELECT id, nombre_completo, confirmacion, id_cabeza_familia, telefono, wp_enviado FROM miembro_familia WHERE confirmacion = 2")
    pendientes = cursor.fetchall() 

    # Realiza la consulta a la base de datos
    cursor.execute("SELECT COUNT(*) FROM miembro_familia WHERE confirmacion = 1")
    cuentaconfirmados = cursor.fetchall() 

    # Realiza la consulta a la base de datos
    cursor.execute("SELECT COUNT(*) FROM miembro_familia WHERE confirmacion = 0")
    cuentanoconfirmados = cursor.fetchall() 

    # Realiza la consulta a la base de datos
    cursor.execute("SELECT COUNT(*) FROM miembro_familia WHERE confirmacion = 2")
    cuentapendientes = cursor.fetchall() 


    cursor.close()
    conn.close()

    return render_template('invitacion/confirmaciones.html', confirmados=confirmados, noconfirmados=noconfirmados, pendientes=pendientes, cuentaconfirmados=cuentaconfirmados, cuentanoconfirmados=cuentanoconfirmados, cuentapendientes=cuentapendientes)




#-----------------------------------------------------------------------

# Ruta para actualizar el campo 'wp_enviado' a si al hacer clic en el botón
@app.route('/actualizar_wp_enviado/<int:id>')
def actualizar_wp_enviado(id):
    conn, cursor = get_db()

    # Actualiza el campo 'wp_enviado' a 'SI'
    cursor.execute("UPDATE miembro_familia SET wp_enviado='1' WHERE id=%s", (id,))
    conn.commit()
    cursor.close()
    conn.close()

    return redirect(url_for('mostrar_tabla'))

@app.route('/actualizar_wp_enviado_no/<int:id>')
def actualizar_wp_enviado_no(id):
    conn, cursor = get_db()

    # Actualiza el campo 'wp_enviado' a 'SI'
    cursor.execute("UPDATE miembro_familia SET wp_enviado='0' WHERE id=%s", (id,))
    conn.commit()
    cursor.close()
    conn.close()

    return redirect(url_for('mostrar_tabla'))
    
    
    
    
    
    
    
    





#-----------------------------------------------------------------------
#Ruta principal
@app.route('/admin')
def carga():

    consulta_sql = """
    SELECT cabeza_familia.nombre_completo AS cabeza_nombre, miembro_familia.nombre_completo AS miembro_nombre
    FROM cabeza_familia
    LEFT JOIN miembro_familia ON cabeza_familia.id = miembro_familia.id_cabeza_familia
    ORDER BY cabeza_familia.nombre_completo, miembro_familia.nombre_completo;
    """
    #conn= mysql.connect()
    #cursor=conn.cursor()
    cursor.execute(consulta_sql)
    resultados=cursor.fetchall()
    print(resultados)
    #conn.commit()
    cursor.close()
    conn.close()

    #envio de informacion a la plantilla index
    return render_template('admin/index.html', resultados=resultados)

#-----------------------------------------------------------------------
#Ruta para la pagina 'create'
@app.route('/create')
def create():
    return render_template('empleados/create.html')


#-----------------------------------------------------------------------
#Ruta para la pagina de edicion
#Se define en la ruta que se recibirá un entero llamado ID pues es el que viene del boton de editar
@app.route('/edit/<int:id>')
def edit(id):

    #conn= mysql.connect()
    #cursor=conn.cursor()
    cursor.execute("SELECT * FROM empleados WHERE id=%s", (id))
    empleados=cursor.fetchall()
    print(empleados)
    #conn.commit()
    cursor.close()
    conn.close()

    return render_template('empleados/edit.html', empleados=empleados)


#-----------------------------------------------------------------------
#Ruta para el store de los datos enviados por el formulario que esta en create
@app.route('/store', methods=['POST'])
def storage():
    _nombre=request.form['txtNombre']
    _correo=request.form['txtCorreo']
    _foto=request.files['txtFoto']
    
    #Validacion de campos llenos
    if _nombre=='' or _correo=='' or _foto=='':
        flash('Recuerda llenar todos los datos en los campos')
        return redirect(url_for('create'))

    #Variable para determinar el tiempo y agregarlo a las fotos para diferenciarlas entre ellas
    now=datetime.now()
    tiempo=now.strftime("%Y%m%d%H%M%S")
    
    #Si el nombre de la foto no es vacio, se hace la concatenacion
    if _foto.filename!='':
        nuevoNombreFoto=tiempo+'_'+_foto.filename
        _foto.save("uploads/"+nuevoNombreFoto)

    sql="INSERT INTO empleados (id, nombre, correo, foto) VALUES ('null',%s,%s,%s);"

    datos=(_nombre,_correo,nuevoNombreFoto)

    conn= mysql.connect()
    cursor=conn.cursor()
    cursor.execute(sql,datos)
    conn.commit()
    cursor.close()
    conn.close()
    return redirect('/')


#-----------------------------------------------------------------------
#Ruta para la eliminacion de registros
#Se define en la ruta que se recibirá un entero llamado ID pues es el que viene del boton de eliminar
@app.route('/destroy/<int:id>')
def destroy(id):
    conn= mysql.connect()
    cursor=conn.cursor()
    cursor.execute("SELECT foto FROM empleados WHERE id=%s", id)
    fila=cursor.fetchall()
    os.remove(os.path.join(app.config['CARPETA'],fila[0][0]))
    cursor.execute("DELETE FROM empleados WHERE id=%s", (id))
    conn.commit()
    cursor.close()
    conn.close()
    return redirect('/')

#-----------------------------------------------------------------------
#Ruta para la edicion de registros
@app.route('/update', methods=['POST'])
def update():
    _nombre=request.form['txtNombre']
    _correo=request.form['txtCorreo']
    _foto=request.files['txtFoto']
    id=request.form['txtID']

     #Validacion de campos llenos
    if _nombre=='' or _correo=='' or _foto=='':
        flash('Recuerda llenar todos los datos en los campos')
        return redirect(url_for('create'))

    sql="UPDATE empleados SET nombre=%s, correo=%s WHERE id=%s;"

    datos=(_nombre,_correo,id)

    conn= mysql.connect()
    cursor=conn.cursor()

    now=datetime.now()
    tiempo=now.strftime("%Y%m%d%H%M%S")

#Actualizacion de fotografia con cambio de nombre
    if _foto.filename!='':
        nuevoNombreFoto=tiempo+'_'+_foto.filename
        _foto.save("uploads/"+nuevoNombreFoto)
        cursor.execute("SELECT foto FROM empleados WHERE id=%s", id)
        fila=cursor.fetchall()
        os.remove(os.path.join(app.config['CARPETA'],fila[0][0]))
        cursor.execute("UPDATE empleados SET foto=%s WHERE id=%s", (nuevoNombreFoto,id))
        conn.commit


    cursor.execute(sql,datos)
    conn.commit()
    cursor.close()
    conn.close()

    return redirect('/')


if __name__== '__main__':
    app.run(debug=True)