from apps.web_browser.web_browser import web_browser_bp
from apps.dropzone.dropzone import dropzone_bp
from apps.file_browser.file_browser import file_browser_bp
from apps.accounts.login import login_bp
from apps.manager.manager import manager_bp
from apps.accounts.admin import admin_bp
from apps.models import User, db
from flask import Flask, render_template
from flask_login import login_required, LoginManager, current_user
from flask_migrate import Migrate
from datetime import timedelta

app = Flask(__name__, template_folder='templates', static_folder='static')
app.config['SECRET_KEY'] = 'your_secret_key'
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///../../CABNP Database/cabnp_browser.db'
app.config['PERMANENT_SESSION_LIFETIME'] = timedelta(hours=3)
app.config['URL_PREFIX'] = '/cabnp'

db.init_app(app)
migrate = Migrate(app, db)

# Register blueprints for each app
app.register_blueprint(file_browser_bp, url_prefix=f'/file-browser')
app.register_blueprint(web_browser_bp, url_prefix=f'/web-browser')
app.register_blueprint(dropzone_bp, url_prefix=f'/dropzone')
app.register_blueprint(login_bp, url_prefix=f'/login')
app.register_blueprint(manager_bp, url_prefix=f'/manager')
app.register_blueprint(admin_bp, url_prefix=f'/admin')

login_manager = LoginManager(app)
login_manager.login_view = 'login.login'


@login_manager.user_loader
def load_user(user_id):
    user_details = User.query.filter_by(id=user_id).first()  # Function to fetch user details from database

    if user_details:
        # Unpack user details
        username = user_details.username
        is_admin = user_details.is_admin
        password_changed = user_details.password_changed

        # Create User object with fetched details
        return User(username, is_admin, password_changed)
    else:
        return None


@app.route('/')
@login_required
def landing_page():
    return render_template('index.html', user=current_user.username, url_prefix=app.config["URL_PREFIX"])


if __name__ == '__main__':
    app.run(debug=False)
