# app.py

from flask import Flask,g,request
import psutil
import time
import os
from flask_cors import CORS
from config import Config
from extensions import db, migrate
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from utils.Fpost import Fpost;
app = Flask(__name__)
app.config.from_object(Config)
def create_app():
    

    # 启用 CORS：允许前端 http://localhost:5173 发起跨域请求
    # 生产环境请根据实际域名调整 origins
    CORS(app, resources={r"/*": {"origins": "*"}})
    db.init_app(app)
    migrate.init_app(app, db)

    # 在工厂函数里再导入并注册蓝图
    from routes.posts    import posts_bp
    from routes.comments import comments_bp

    app.register_blueprint(posts_bp,    url_prefix='/posts')
    app.register_blueprint(comments_bp, url_prefix='/posts/<int:post_id>/comments')

    return app

proc=psutil.Process(os.getpid())
@app.before_request
def before_request():
    g.start_time=time.time()
    g.start_cpu=proc.cpu_times()
    g.start_mem=proc.memory_info()

@app.after_request
def after_request(response):
    end_time = time.time()
    end_cpu = proc.cpu_times()
    end_mem = proc.memory_info()

    elapsed = end_time - g.start_time
    cpu_user = end_cpu.user - g.start_cpu.user
    cpu_sys  = end_cpu.system - g.start_cpu.system
    mem_rss  = end_mem.rss - g.start_mem.rss

    #写入性能消耗
    engine=create_engine(Config.SQLURL)
    SessionLocal = sessionmaker(bind=engine)
    session = SessionLocal()
    f=Fpost(session)
    f.recordsyscost(
        request.path,
        elapsed,
        cpu_user,
        cpu_sys,
        mem_rss
    )
    return response

# 只有直接用 python app.py 时，这段才会执行
if __name__ == '__main__':
    app = create_app()
    app.run(host='0.0.0.0', port=5714, debug=True)
