from flask import Flask, session, request
from flask_mail import Mail
from config import Config
import os
from controllers.auth_controller import auth_bp
from controllers.dashboard_controller import dashboard_bp
from controllers.user_controller import user_bp
from controllers.survey_controller import survey_bp
from controllers.feature_controller import feature_bp
from controllers.project_controller import project_bp
from controllers.question_controller import question_bp
from controllers.people_controller import people_bp
from controllers.option_controller import option_bp
from controllers.temperament_controller import temperament_bp
from controllers.recommendation_controller import recommendation_bp
from controllers.settings_controller import settings_bp
from controllers.public_controller import public_bp
import os
import json

BASE_DIR = os.path.dirname(os.path.abspath(__file__))

# Simple i18n loader
def load_translations():
    translations = {}
    for lang in ['es', 'en']:
        path = os.path.join(BASE_DIR, 'i18n', f'{lang}.json')
        try:
            with open(path, 'r', encoding='utf-8') as f:
                translations[lang] = json.load(f)
        except Exception:
            translations[lang] = {}
    return translations

app = Flask(__name__, template_folder='views/templates', static_folder='static')
app.config.from_object(Config)

# Initialize Flask-Mail
mail = Mail(app)

# Load translations in memory
TRANSLATIONS = load_translations()

app.register_blueprint(auth_bp)
app.register_blueprint(dashboard_bp)
app.register_blueprint(user_bp, url_prefix='/users')
app.register_blueprint(survey_bp, url_prefix='/surveys')
app.register_blueprint(feature_bp, url_prefix='/features')
app.register_blueprint(project_bp, url_prefix='/projects')
app.register_blueprint(question_bp, url_prefix='/questions')
app.register_blueprint(people_bp, url_prefix='/peoples')
app.register_blueprint(option_bp, url_prefix='/options')
app.register_blueprint(temperament_bp, url_prefix='/temperaments')
app.register_blueprint(recommendation_bp, url_prefix='/recommendations')
app.register_blueprint(settings_bp)
app.register_blueprint(public_bp)

@app.before_request
def ensure_lang_in_session():
    # Default language is Spanish
    if 'lang' not in session:
        session['lang'] = 'es'

def _get_nested(d, path):
    cur = d
    for part in path.split('.'):
        if isinstance(cur, dict) and part in cur:
            cur = cur[part]
        else:
            return None
    return cur

def t(key, default=None):
    lang = session.get('lang', 'es')
    # try current lang
    val = _get_nested(TRANSLATIONS.get(lang, {}), key)
    if val is not None:
        return val
    # fallback to es
    val = _get_nested(TRANSLATIONS.get('es', {}), key)
    if val is not None:
        return val
    # fallback to en
    val = _get_nested(TRANSLATIONS.get('en', {}), key)
    if val is not None:
        return val
    return default or key

@app.context_processor
def utility_processor():
    from models.settings_model import SettingsModel
    settings = SettingsModel.get_settings()
    env_name = (os.environ.get('FLASK_ENV') or '').lower()
    return dict(
        session=session,
        request=request,
        t=t,
        app_settings=settings,
        env_name=env_name,
        env_is_production=env_name == 'production'
    )

if __name__ == '__main__':
    # Read port from environment, default to 5000
    port = int(os.environ.get('PORT', 5000))
    app.run(debug=True, host='0.0.0.0', port=port)
