from datetime import datetime
from app import db
from app.models import *
from app.schema import *
from marshmallow import ValidationError


def insert_data(schema, data):
    instance = validate_data(schema=schema, data=data)
    db.session.add(instance)
    db.session.commit()


def delete_data(data):
    db.session.delete(data)
    db.session.commit()


def save_otp(mobile, otp):
    db.session.query(table="Users").filter_by(mobile=mobile).update(dict(otp=otp))
    db.session.commit()


def validate_data(schema, data):
    validation_schema = schema + "Schema()"
    instance = validation_schema
    try:
        output = instance.load(data).data
        return output
    except ValidationError as err:
        print(err.messages)


def fetch_stored_otp(mobile):
    user = db.session.query(table="Users").filter_by(mobile=mobile)
    otp = user.otp
    return otp


def validate_otp(mobile):
    timestamp = datetime.now()
    db.session.query(table="Users").filter_by(mobile=mobile).update(
        dict(otp_valid_time=timestamp)
    )


def verify_otp(mobile, otp):
    stored_otp = fetch_stored_otp(mobile=mobile)
    if stored_otp == otp:
        validate_otp(mobile=mobile)
        return True
    return False