# crudApp/__init__.py

# third party imports
from flask import Flask, render_template
from flask_sqlalchemy import SQLAlchemy
from flask_login import LoginManager
from flask_migrate import Migrate
from flask_bootstrap import Bootstrap

# local import
from config import app_config

db = SQLAlchemy()
lm = LoginManager()

def create_app(config_name):
	app = Flask(__name__, instance_relative_config=True)
	app.config.from_object(app_config[config_name])
	# app.config.from_pyfile("config.py") --> requires instance/config.py 

	with app.app_context():
		# database and migration setup
		db.init_app(app)
		migrate = Migrate(app, db)

		# login setup
		lm.init_app(app)
		lm.login_message = "You must be logged in to access this page."
		lm.login_view = "auth.login"

		# bootstrap setup
		Bootstrap(app)

		from crudApp import models

		from .blueprints.admin import admin as admin_blueprint
		app.register_blueprint(admin_blueprint, url_prefix="/admin")

		from .blueprints.auth import auth as auth_blueprint
		app.register_blueprint(auth_blueprint)

		from .blueprints.home import home as home_blueprint	
		app.register_blueprint(home_blueprint)

		@app.errorhandler(403)
		def forbidden(error):
			return render_template("errors/403.html", title="Forbidden"), 403

		@app.errorhandler(404)
		def page_not_found(error):
			return render_template("errors/404.html", title="Page Not Found"), 404

		@app.errorhandler(500)
		def internal_server_error(error):
			return render_template("errors/500.html", title="Forbidden"), 500

	return app
