from datetime import datetime

from flask import Blueprint, flash, redirect, render_template, url_for
from flask_bcrypt import generate_password_hash
from flask_login import login_user
from sqlalchemy.exc import (
    DatabaseError,
    DataError,
    IntegrityError,
    InterfaceError,
    InvalidRequestError,
)
from werkzeug.routing import BuildError

from app import db
from statuspengguna.forms.resetpasswordform import ResetPasswordForm
from models.user_model import User

reset_password = Blueprint(
    "reset_password",
    __name__,
    template_folder="templates/statuspengguna",
    static_folder="static",
)


@reset_password.route("/resetpassword/<path>", methods=["GET", "POST"])
def resetpassword(path):
    return ResetPassword(path)


def ResetPassword(path):
    linkvalid = False
    user = User.query.filter_by(resethash=path).first()
    if user is None:
        return redirect(url_for("index"))
    timepassed = datetime.now() - user.resettime
    if timepassed.days < 1:
        linkvalid = True

    resetpasswordform = ResetPasswordForm()
    if resetpasswordform.validate_on_submit():
        return ResetUserPasswordInDB(user, resetpasswordform)
    return render_template(
        "resetpassword.html",
        resetpasswordform=resetpasswordform,
        path=path,
        linkvalid=linkvalid,
    )


def ResetUserPasswordInDB(user, resetpasswordform):
    try:
        newpassword = resetpasswordform.confirmpassword.data
        user.password = generate_password_hash(newpassword)
        user.resethash = None
        user.resettime = None
        db.session.commit()
        flash("Password Succesfully updated", "success")
        login_user(user)
        return redirect(url_for("index"))

    except InvalidRequestError:
        db.session.rollback()
        resetpasswordform.email.errors.append("Something went wrong!")
        flash("Something went wrong!", "danger")
    except IntegrityError:
        db.session.rollback()
        resetpasswordform.email.errors.append("User already exists!")
        flash("User already exists!", "warning")
    except DataError:
        db.session.rollback()
        resetpasswordform.email.errors.append("Invalid Entry")
        flash("Invalid Entry", "warning")
    except InterfaceError:
        db.session.rollback()
        resetpasswordform.email.errors.append(
            "Error connecting to the database"
        )
        flash("Error connecting to the database", "danger")
    except DatabaseError:
        db.session.rollback()
        resetpasswordform.email.errors.append(
            "Error connecting to the database"
        )
        flash("Error connecting to the database", "danger")
    except BuildError:
        db.session.rollback()
        resetpasswordform.email.errors.append("Unknown error occured!")
        flash("An error occured !", "danger")