# -*- coding: utf-8 -*-
"""
Linguotree Application Entry Point
"""

import os
import logging
import time
from flask import Flask, render_template, request, session
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate
from flask_login import LoginManager
from flask_wtf.csrf import CSRFProtect
# 从 extensions 导入 db
from extensions import db
# ==================== 初始化应用 ====================
app = Flask(__name__)

# 配置日志
logging.basicConfig(level=logging.INFO)
logger = app.logger

# 加载配置：支持开发/生产环境切换
env = os.environ.get('FLASK_ENV') or 'default'
config_module = os.environ.get('CONFIG_MODULE') or 'config'

try:
    if config_module.endswith('.py'):
        app.config.from_pyfile(config_module)
    else:
        # 推荐方式：使用类配置
        from config import config
        app.config.from_object(config[env])
except Exception as e:
    logger.error(f"❌ 配置加载失败，请检查配置文件: {e}")
    raise

# ==================== 关键修复：正确初始化数据库 ====================
# 1. 先创建db实例（不绑定app）
#db = SQLAlchemy()

# 2. 初始化数据库（绑定app）
db.init_app(app)
migrate = Migrate(app, db)

# CSRF 保护
csrf = CSRFProtect(app)

# 登录管理
login_manager = LoginManager()
login_manager.init_app(app)
login_manager.login_view = 'auth.login'
login_manager.login_message = '请先登录以访问此页面。'
login_manager.login_message_category = 'info'

# ==================== 关键修复：添加用户加载器 ====================
@login_manager.user_loader
def load_user(user_id):
    """从数据库加载用户"""
    from models.user import User  # 延迟导入避免循环
    return User.query.get(int(user_id))

# ==================== 注册蓝图（延迟导入，避免循环依赖） ====================
def register_blueprints():
    try:
        # 重要：延迟导入模型，避免循环导入
        from models import User, Teacher, Student, Payment
        
        # 导入蓝图
        from routes.auth import auth_bp as auth_blueprint
        from routes.main import main_bp as main_blueprint
        from routes.student import student_bp as student_blueprint
        from routes.teacher import teacher_bp as teacher_blueprint
        from routes.course import course_bp as course_blueprint
        from routes.booking import booking_bp as booking_blueprint
        from routes.admin import admin_bp as admin_blueprint

        # 注册蓝图
        app.register_blueprint(auth_blueprint, url_prefix='/auth')
        app.register_blueprint(main_blueprint)
        app.register_blueprint(student_blueprint, url_prefix='/student')
        app.register_blueprint(teacher_blueprint, url_prefix='/teacher')
        app.register_blueprint(course_blueprint, url_prefix='/course')
        app.register_blueprint(booking_blueprint, url_prefix='/booking')
        app.register_blueprint(admin_blueprint, url_prefix='/admin')

        logger.info("✅ 蓝图注册成功")
    except Exception as e:
        logger.error(f"❌ 蓝图注册失败: {e}")
        raise

register_blueprints()

# ==================== 上下文处理器：注入全局统计数据 ====================
@app.context_processor
def inject_stats():
    """
    向所有模板注入系统统计数据。
    使用分层异常处理，确保即使部分模型缺失也不会导致页面崩溃。
    """
    try:
        # 延迟导入模型，避免启动时循环引用
        from models import User, Teacher, Student

        total_users = User.query.count()
        total_teachers = Teacher.query.count()
        total_students = Student.query.count()

        # ⚠️ 当前 Teacher 模型中无 status 字段，暂设为 0
        pending_teachers = 0

        # 💰 总收入统计（可选模块）
        total_revenue = 0.0
        try:
            from models import Payment
            revenue_result = db.session.query(db.func.sum(Payment.amount)).scalar()
            total_revenue = float(revenue_result) if revenue_result is not None else 0.0
        except (ImportError, AttributeError, Exception) as e:
            logger.warning(f"⚠️ 支付模型未就绪或查询失败，跳过收入统计: {e}")

        return {
            'stats': {
                'total_users': total_users,
                'total_teachers': total_teachers,
                'total_students': total_students,
                'pending_teachers': pending_teachers,
                'total_revenue': round(total_revenue, 2),
            }
        }

    except Exception as e:
        logger.warning(f"⚠️ 统计数据加载失败，返回默认值: {e}")
        return {
            'stats': {
                'total_users': 0,
                'total_teachers': 0,
                'total_students': 0,
                'pending_teachers': 0,
                'total_revenue': 0.0,
            }
        }

# ==================== 路由定义 ====================

@app.route('/')
def index():
    """首页路由"""
    return render_template('index.html')

# ------------------- 错误处理 -------------------
@app.errorhandler(404)
def page_not_found(e):
    """404 页面未找到"""
    return render_template('404.html'), 404

@app.errorhandler(500)
def internal_server_error(e):
    """500 服务器内部错误"""
    return render_template('500.html'), 500

@app.errorhandler(Exception)
def handle_exception(e):
    """捕获未预期的异常（调试时可关闭）"""
    logger.error(f"💥 未处理异常: {e}", exc_info=True)
    return render_template('500.html'), 500

# ==================== 健康检查接口（用于部署探针）====================
@app.route('/healthz')
def health_check():
    """健康检查接口，Kubernetes 或负载均衡器可用"""
    try:
        db.session.execute('SELECT 1')  # 简单数据库连通性测试
        return {'status': 'ok', 'timestamp': int(time.time())}, 200
    except Exception as e:
        logger.error(f"Health check failed: {e}")
        return {'status': 'error'}, 500

# ==================== 主程序入口（仅用于开发）====================
if __name__ == '__main__':
    # 开发环境运行参数
    debug_mode = app.config.get('DEBUG', False)
    host = app.config.get('HOST', '127.0.0.1')
    port = app.config.get('PORT', 5000)

    logger.info(f"🚀 启动 Linguotree 应用...")
    logger.info(f"🔧 调试模式: {debug_mode}")
    logger.info(f"🌐 访问地址: http://{host}:{port}")

    app.run(
        debug=debug_mode,
        host=host,
        port=port
    )