"""
BookBeach Application
Refactored Flask application using Blueprint architecture
"""

from flask import Flask
from flask_cors import CORS
from flask_login import LoginManager, UserMixin
from sqlalchemy import create_engine, text
from sqlalchemy.orm import sessionmaker
import os
import sys

# Import configuration
from config import ADMIN_CONFIG

# Import all blueprint modules
from app.routes import main_bp, api_bp, auth_bp, admin_bp, business_bp, static_bp

def create_app():
    """Application factory pattern"""
    app = Flask(__name__, 
               template_folder='templates',
               static_folder='static')
    
    # Basic app configuration
    app.config['SECRET_KEY'] = ADMIN_CONFIG['SECRET_KEY']
    app.config['MAX_CONTENT_LENGTH'] = 10 * 1024 * 1024  # 10MB max file size
    app.config['UPLOAD_FOLDER'] = 'static/uploads'
    
    # CORS configuration
    CORS(app, origins=[
        "http://localhost:8001", 
        "http://127.0.0.1:8001", 
        "http://localhost:8080", 
        "http://127.0.0.1:8080"
    ])
    
    # Flask-Login setup
    login_manager = LoginManager()
    login_manager.init_app(app)
    login_manager.login_view = 'auth.login'
    
    class AdminUser(UserMixin):
        def __init__(self, username):
            self.id = username
            self.username = username
    
    @login_manager.user_loader
    def load_user(user_id):
        # Check if it's the hardcoded admin
        if user_id == ADMIN_CONFIG['ADMIN_USERNAME']:
            return AdminUser(user_id)
        
        # Check if it's a database user
        try:
            DATABASE_URL = ADMIN_CONFIG['DATABASE_URL']
            engine = create_engine(DATABASE_URL)
            SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
            
            db = SessionLocal()
            
            # Look for user by first_name or email
            user_result = db.execute(text("""
                SELECT u.user_id, u.email, u.first_name, ur.role_name
                FROM users u
                JOIN user_roles ur ON u.role_id = ur.role_id
                WHERE (u.first_name = :user_id OR u.email = :user_id)
                AND u.is_active = true
                AND ur.role_name = 'admin'
            """), {"user_id": user_id}).fetchone()
            
            db.close()
            
            if user_result:
                return AdminUser(user_id)
        except:
            pass
        
        return None
    
    # Register all blueprints
    app.register_blueprint(main_bp)
    app.register_blueprint(api_bp)
    app.register_blueprint(auth_bp)
    app.register_blueprint(admin_bp)
    app.register_blueprint(business_bp)
    app.register_blueprint(static_bp)
    
    return app

# Create the application instance
app = create_app()

if __name__ == '__main__':
    app.run(debug=True, host='0.0.0.0', port=8080)