from flask import Flask
from flask_session import Session

from flask_sqlalchemy import SQLAlchemy
from flask_bcrypt import Bcrypt
from flask_login import LoginManager
from flask_mail import Mail
from minibase.config import Config

# (DATABASE) Definition
db = SQLAlchemy()
# (PASSWORD) Hashign Program to save paswords safely
bcrypt = Bcrypt()
# (LOGIN) Login manage plugin configuration
login_manager = LoginManager()
login_manager.login_view = 'users.login'
login_manager.login_message_category = 'info'  # Boostrap Info Message
# (EMAIL AGENT) Definition
mail = Mail()
session = Session()


def create_minibase(config_class=Config):
    # (FLASK) Main Flask Application
    app = Flask(__name__)
    app.config.from_object(Config)
    # (DATABASE) Initialisation
    #db.metadata.clear()
    db.init_app(app)
    # (PASSWORD) Initialisation
    bcrypt.init_app(app)
    # (LOGIN) Initialisation
    login_manager.init_app(app)
    # (EMAIL AGENT) Initialisation
    mail.init_app(app)
    # Session for variable manipulation on server side

    # (FLASK) Importing and then registering Blueprints (Wievs)
    from minibase.users.routes import users
    from minibase.posts.routes import posts
    from minibase.main.routes import main
    from minibase.company.routes import company
    from minibase.admin.routes import admin
    from minibase.person.routes import person
    from minibase.project.routes import project
    from minibase.errors.handlers import errors
    app.register_blueprint(users)
    app.register_blueprint(posts)
    app.register_blueprint(main)
    app.register_blueprint(company)
    app.register_blueprint(admin)
    app.register_blueprint(person)
    app.register_blueprint(project)
    app.register_blueprint(errors)
    # Return The created app
    return app