"""
WFIS Platform - Application Factory
Quantitative Liquidity Intelligence Platform
"""

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_login import LoginManager
from flask_cors import CORS
from flask_limiter import Limiter
from flask_limiter.util import get_remote_address
from dotenv import load_dotenv
import os

load_dotenv()

# Extensions
db = SQLAlchemy()
login_manager = LoginManager()
limiter = Limiter(key_func=get_remote_address)


def create_app(config=None):
    app = Flask(
        __name__,
        template_folder='templates',
        static_folder='static'
    )

    # =====================
    # Configuration
    # =====================
    app.config['SECRET_KEY'] = os.environ.get('APP_SECRET_KEY', 'dev-secret')
    app.config['SQLALCHEMY_DATABASE_URI'] = os.environ.get(
        'DATABASE_URL',
        'sqlite:///../database/wfis.db'
    )
    app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

    app.config['SESSION_COOKIE_SECURE'] = os.environ.get('APP_ENV') == 'production'
    app.config['SESSION_COOKIE_HTTPONLY'] = True
    app.config['SESSION_COOKIE_SAMESITE'] = 'Lax'

    # Rate limiting
    app.config['RATELIMIT_DEFAULT'] = os.environ.get('RATELIMIT_DEFAULT', '100/hour')
    app.config['RATELIMIT_ENABLED'] = os.environ.get('APP_ENV') == 'production'

    # =====================
    # Initialize Extensions
    # =====================
    db.init_app(app)
    login_manager.init_app(app)
    login_manager.login_view = 'web.login'
    login_manager.login_message = 'Please log in to access research data'

    CORS(app, resources={r"/api/*": {"origins": "*"}})
    limiter.init_app(app)

    # =====================
    # Register Blueprints
    # =====================
    from app.routes.web import web_routes

    from app.routes.api import (
        market_api,
        auth_api,
        reports_api,
        crypto_api,
        ai_api,
        subscription_api
    )

    app.register_blueprint(web_routes, url_prefix='/')

    app.register_blueprint(market_api, url_prefix='/api/market')
    app.register_blueprint(auth_api, url_prefix='/api/auth')
    app.register_blueprint(reports_api, url_prefix='/api/reports')
    app.register_blueprint(crypto_api, url_prefix='/api/crypto')
    app.register_blueprint(ai_api, url_prefix='/api/ai')
    app.register_blueprint(subscription_api, url_prefix='/api/subscription')

    # =====================
    # Create DB tables
    # =====================
    with app.app_context():
        db.create_all()

    return app


# =====================
# User Loader
# =====================
@login_manager.user_loader
def load_user(user_id):
    from app.models.user import User
    return User.query.get(int(user_id))