#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
患者画像回访话术系统
基于Flask的Web应用，提供患者信息管理和AI回访话术功能
"""

import os
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate

# 导入配置
from config import config

# 导入数据库模型
from database.models import db

def create_app(config_name=None):
    """应用工厂函数"""
    if config_name is None:
        config_name = os.environ.get('FLASK_ENV', 'default')
    
    app = Flask(__name__)
    
    # 加载配置
    app.config.from_object(config[config_name])
    
    # 初始化扩展
    db.init_app(app)
    migrate = Migrate(app, db, directory='database/migrations')
    
    # 注册蓝图
    from routes import register_blueprints
    register_blueprints(app)
    
    # 创建数据库表（只在主进程中执行）
    with app.app_context():
        try:
            # 检查是否是 reloader 进程
            if not os.environ.get('WERKZEUG_RUN_MAIN'):
                print("🔄 主进程启动中...")
            else:
                print("🔥 Reloader 进程启动中...")

            # 创建所有表
            db.create_all()

            # 插入默认数据（避免重复插入）
            insert_default_data()

            print("✅ 数据库初始化完成")
        except Exception as e:
            print(f"⚠️  数据库初始化失败: {e}")
    
    return app

def insert_default_data():
    """插入默认数据"""
    try:
        from database.models import Clinic
        from config import CLINIC_CONFIG

        # 检查是否已有数据，避免重复插入
        existing_count = Clinic.query.count()
        if existing_count > 0:
            print(f"📊 数据库已有 {existing_count} 个门诊，跳过默认数据插入")
            return

        # 插入默认门诊数据
        for clinic_id, clinic_data in CLINIC_CONFIG.items():
            clinic = Clinic(
                clinic_name=clinic_data['clinic_name'],
                clinic_code=clinic_id,
                is_active=True
            )
            db.session.add(clinic)

        db.session.commit()
        print("✅ 默认数据插入完成")

    except Exception as e:
        db.session.rollback()
        print(f"⚠️  默认数据插入失败: {e}")

# 创建应用实例
app = create_app()

if __name__ == '__main__':
    app.run(
        host='0.0.0.0',
        port=5001,
        debug=True,
        use_reloader=True,
        threaded=True
    )
