from flask import Flask, session, redirect, url_for, g
import os
from config import Config
from app.models import db, User

def create_app(config_class=Config):
    app = Flask(__name__)
    app.config.from_object(config_class)
    
    # Initialize Database
    db.init_app(app)
    
    # Register Session Context Processor
    @app.before_request
    def load_logged_in_user():
        user_id = session.get('user_id')
        if user_id is None:
            g.user = None
        else:
            g.user = db.session.get(User, user_id)
            
    # Template Filter for formatting date/times
    @app.template_filter('datetimeformat')
    def datetimeformat(value, format='%b %d, %Y - %I:%M %p'):
        if not value:
            return ""
        return value.strftime(format)
        
    @app.template_filter('dateformat')
    def dateformat(value, format='%b %d, %Y'):
        if not value:
            return ""
        return value.strftime(format)

    # Register Blueprints
    from app.auth import auth_bp
    from app.admin import admin_bp
    from app.emc import emc_bp
    from app.caller import caller_bp
    
    app.register_blueprint(auth_bp)
    app.register_blueprint(admin_bp)
    app.register_blueprint(emc_bp)
    app.register_blueprint(caller_bp)
    
    # Root Route redirection based on role
    @app.route('/')
    def index():
        if not g.user:
            return redirect(url_for('auth.login'))
        if g.user.role == 'admin':
            return redirect(url_for('admin.dashboard'))
        elif g.user.role == 'emc':
            return redirect(url_for('emc.dashboard'))
        elif g.user.role == 'caller':
            return redirect(url_for('caller.dashboard'))
        return redirect(url_for('auth.login'))
        
    # Auto-seed admin user
    with app.app_context():
        try:
            db.create_all()
            # Seed master admin if not exists
            admin = User.query.filter_by(role='admin').first()
            if not admin:
                master_admin = User(
                    username='admin',
                    role='admin',
                    status='approved'
                )
                master_admin.set_password('adminpassword')
                db.session.add(master_admin)
                db.session.commit()
                print("Default admin created: admin / adminpassword")
        except Exception as e:
            print(f"Error seeding database: {e}")
            
    return app
