# app.py — Neutral Sigma 0DTE (Flask + Babel v4)
# -*- coding: utf-8 -*-

from flask import Flask, render_template, request, redirect, url_for, make_response, jsonify
from flask_babel import Babel, _
import os
import logging, sys

# Importa el blueprint de backtesting (asegúrate de que backtesting.py esté en el PYTHONPATH)
# Si lo tienes dentro de un paquete, por ej. blueprints/backtesting.py, usa:
# from blueprints.backtesting import backtesting_bp
from backtesting import backtesting_bp

from flask_wtf.csrf import CSRFProtect
csrf = CSRFProtect()

def create_app() -> Flask:
    app = Flask(__name__)
    app.config["SECRET_KEY"] = os.getenv("SECRET_KEY", "dev-secret")
    csrf.init_app(app)

    # =========================
    # Configuración de la app
    # =========================
    app.config["SECRET_KEY"] = os.getenv("SECRET_KEY", "dev-secret")

    # Babel (i18n)
    app.config["BABEL_DEFAULT_LOCALE"] = "en"
    app.config["BABEL_SUPPORTED_LOCALES"] = ["en", "es"]
    app.config["BABEL_TRANSLATION_DIRECTORIES"] = "translations"

    # -----------------------------------
    # Selector de idioma (orden prioridad)
    # -----------------------------------
    def get_locale() -> str:
        # 1) ?lang=xx  2) cookie "ns_lang"  3) Accept-Language  4) fallback "en"
        lang = request.args.get("lang")
        if lang and lang in app.config["BABEL_SUPPORTED_LOCALES"]:
            return lang
        cookie_lang = request.cookies.get("ns_lang")
        if cookie_lang and cookie_lang in app.config["BABEL_SUPPORTED_LOCALES"]:
            return cookie_lang
        best = request.accept_languages.best_match(app.config["BABEL_SUPPORTED_LOCALES"])
        return best or app.config["BABEL_DEFAULT_LOCALE"]

    # Inicializar Babel v4 (sin decoradores)
    babel = Babel(
        app,
        locale_selector=get_locale,
        default_locale=app.config["BABEL_DEFAULT_LOCALE"],
        # default_timezone="UTC",
    )

    # =====================================
    # Registro del Blueprint: /backtesting/*
    # =====================================
    app.register_blueprint(backtesting_bp)


    # ============================================
    # Variables globales para todas las plantillas
    # ============================================
    @app.context_processor
    def inject_globals():
        return {
            "supported_locales": app.config["BABEL_SUPPORTED_LOCALES"],
            "current_locale": get_locale(),
            "brand_name": "Neutral Sigma 0DTE",
        }

    # =========
    # Rutas web
    # =========
    @app.get("/set-lang/<lang_code>")
    def set_lang(lang_code: str):
        """Guardar preferencia de idioma en cookie y volver a la página previa."""
        if lang_code not in app.config["BABEL_SUPPORTED_LOCALES"]:
            lang_code = app.config["BABEL_DEFAULT_LOCALE"]
        resp = make_response(redirect(request.referrer or url_for("home")))
        # 1 año
        resp.set_cookie("ns_lang", lang_code, max_age=60 * 60 * 24 * 365, samesite="Lax")
        return resp

    @app.get("/health")
    def health():
        return jsonify({
            "ok": True,
            "service": "neutral-sigma",
            "version": "0.1.0",
            "locale": get_locale(),
        })

    @app.get("/")
    def home():
        # Datos mock (solo visual de dashboard)
        kpis = {"ev_trade": "+$42", "winrate": "63%", "max_dd": "-$340"}
        favoritos = [
            "SPX · IC · 09:30 · d15 w20",
            "RUT · IB · 10:00 · w40",
            "XSP · IC · 11:00 · d10 w15",
        ]
        return render_template("home.html", kpis=kpis, favoritos=favoritos)

    @app.get("/backtesting")
    def backtesting_page():
        # Página con tu maqueta (formulario + preview)
        return render_template("backtesting.html")

    # ============================
    # Logging visible en producción
    # ============================
    # Asegura que los logs/prints salgan a STDOUT (útil con Apache/mod_wsgi, Docker, etc.)
    app.logger.setLevel(logging.INFO)
    if not app.logger.handlers:
        handler = logging.StreamHandler(sys.stdout)
        handler.setLevel(logging.INFO)
        app.logger.addHandler(handler)

    return app


# WSGI / ejecución directa
app = create_app()

if __name__ == "__main__":
    # Escucha en todas las interfaces (útil detrás de Nginx/Apache o en un VPS)
    app.run(debug=True, host="0.0.0.0", port=int(os.getenv("PORT", "5000")))
