from app import app
from extensions import db
from models import User, Role, Permission
from sqlalchemy import text
import sys

def force_migrate():
    with app.app_context():
        print("🛠️ 开始强制迁移...")
        
        try:
            # 1. 尝试清除该表的其他活动连接 (仅限 PostgreSQL)
            print("🧹 正在清理数据库死锁...")
            db.session.execute(text("""
                SELECT pg_terminate_backend(pid) 
                FROM pg_stat_activity 
                WHERE datname = current_database() 
                AND pid <> pg_backend_pid();
            """))
            db.session.commit()
        except Exception as e:
            print(f"⚠️ 清理连接跳过 (可能是权限问题): {e}")

        try:
            # 2. 创建所有新表
            print("📦 正在同步表结构...")
            db.create_all()
            
            # 3. 增加字段
            print("📝 正在调整 users 表结构...")
            db.session.execute(text('ALTER TABLE users ADD COLUMN IF NOT EXISTS role_id INTEGER REFERENCES roles(id)'))
            db.session.commit()

            # 4. 初始化角色和权限
            print("🚀 正在初始化 RBAC 权限数据...")
            perms = {
                'view_logs': '查看系统日志',
                'manage_rbac': '管理角色与权限',
                'manage_users': '管理用户信息',
                'manage_system': '系统最高权限'
            }
            perm_objs = {}
            for code, desc in perms.items():
                p = Permission.query.filter_by(name=code).first()
                if not p:
                    p = Permission(name=code, description=desc)
                    db.session.add(p)
                    db.session.flush()
                perm_objs[code] = p
            
            # 创建管理员角色
            admin_role = Role.query.filter_by(name='超级管理员').first()
            if not admin_role:
                admin_role = Role(name='超级管理员', description='系统最高权限持有者')
                admin_role.permissions = list(perm_objs.values())
                db.session.add(admin_role)
            
            # 创建用户角色
            user_role = Role.query.filter_by(name='普通用户').first()
            if not user_role:
                user_role = Role(name='普通用户', description='常规功能使用者')
                db.session.add(user_role)
            
            db.session.flush()

            # 5. 修复旧数据：把所有现有用户设为超级管理员（方便你第一时间进入后台）
            print("👤 正在升级现有用户为管理员...")
            all_users = User.query.all()
            for u in all_users:
                u.role = admin_role
            
            db.session.commit()
            print("✨ 迁移与初始化全部完成！")

        except Exception as e:
            print(f"❌ 运行出错: {e}")
            db.session.rollback()
            raise e

if __name__ == '__main__':
    force_migrate()