from flask import Flask, Blueprint, render_template, request, redirect, url_for

from datetime import date, timedelta

from padel.basededatos import get_db
from flask_login import login_required, current_user
from flask_mail import Mail, Message


bp = Blueprint("reservas", __name__)

# Parámetros para el envío de correos

app = Flask(__name__)
app.config['MAIL_SERVER']= 'smtp.mail.yahoo.com'
app.config['MAIL_PORT'] = 465
app.config['MAIL_USERNAME'] = 'celestino_rey@ymail.com'
app.config['MAIL_PASSWORD'] = 'kbryvwxkockqckss'
app.config['MAIL_USE_TLS'] = False
app.config['MAIL_USE_SSL'] = True
mail = Mail(app)

# Ruta para mostrar las reservas del usuario.

@bp.route("/misreservas")
@login_required
def misreservas():
    db = get_db()

    reservas = db.execute(
         "SELECT id, nombre, fecha, hora FROM reservas WHERE nombre=? ORDER BY fecha DESC", (current_user.name,)
    ).fetchall()

    return render_template("reservas/misreservas.html", reservas=reservas, name=current_user.name)

# ruta para mostrar la tabla del día en concreto con todas las horas
# las horas no usadas aparecen con el botón "Reservar" y las horas reservadas por el usuario
# aparecen con el botón "Eliminar"

@bp.route("/reservar/<diaelegido>")
@login_required
def reservar(diaelegido):

    db = get_db()

    reservas = db.execute(
        "SELECT id, nombre, fecha, hora FROM reservas WHERE fecha=? ORDER BY fecha DESC", (diaelegido,)
    ).fetchall()
    
    return render_template("reservas/reservar.html", diaelegido=diaelegido, name=current_user.name, reservas=reservas)

# Ruta para eliminar una reserva
#
@bp.route('/eliminar_reserva/<int:id>', methods=['POST'])
@login_required
def eliminar_reserva(id):

    db = get_db()
    db.execute(
        "DELETE FROM reservas WHERE id=?", (id,)
    )
    db.commit()
    
    return redirect(url_for('reservas.misreservas'))

# ruta para actualizar la reserva. Actualiza porque en la bd están todas las horas de un día
# y lo que se hace es simplemente colocar el nombre del usuario en la hora elegida

@bp.route('/actualizar_reserva/<int:id>', methods=['POST'])
@login_required
def actualizar_reserva(id):

    db = get_db()
    db.execute(
        "UPDATE reservas SET nombre=? WHERE id=?", (current_user.name,  id,)
    )
    db.commit()

    msg = Message('Reserva de pista de padel confirmada', sender='celestino_rey@ymail.com', recipients=[current_user.email])
    msg.body = "Hola, " + current_user.name + " te confirmo que has reservado la pista de Devesa Park"

    print("el mensaje será: ", msg.body, " y se enviará a ",current_user.email)

    mail.send(msg)

    
    return redirect(url_for('reservas.misreservas'))

# Ruta para elegir el día en el que se va a efectuar la reserva
# Se ofrece el día actual y los dos siguientes.
# si el día que se elige no está en la base de datos, se crean los registros de todas las horas para ese día.

@bp.route("/eligedia", methods=['GET', 'POST'])
@login_required
def eligedia():
    hoy = date.today()
    manana = hoy + timedelta(days=1)
    pasado = hoy + timedelta(days=2)
    ayer = hoy - timedelta(days=1)
    
    print("Ayer fue: ", ayer)
    print("Hoy es: ", hoy)
    print("Mañana será: ", manana)
    print("Pasado será: ", pasado)

    # borra los registros del día anterior al de hoy

    db = get_db()
    db.execute(
        "DELETE FROM reservas WHERE fecha=?", (ayer,)
    )
    db.commit()

    if request.method == "POST":
        diaelegido = request.form['dias']

        print("Día elegido:", diaelegido)

        db = get_db()

        horashoy = db.execute(
            "SELECT * FROM reservas WHERE fecha=?", (diaelegido,)
        ).fetchall()

        db.commit()

        if not horashoy:
            print("No hay horas para hoy")
            db = get_db()

            for hora in range(8,18):
                print("hora: %2d", hora)
                db.execute(
                    "INSERT INTO reservas (nombre, fecha, hora) VALUES (?, ?, ?)", ("-", diaelegido, "%02d:00" % hora,),
                )

            db.commit()

            horashoy = db.execute(
                "SELECT * FROM horas WHERE fecha=?", (diaelegido,)
            ).fetchall()

            db.commit()

        return redirect(url_for("reservas.reservar",diaelegido=diaelegido))
    
    return render_template("reservas/eligedia.html",hoy=hoy,manana=manana,pasado=pasado)
