"""修复空slug的迁移脚本"""
import sys
import os
import re

# 添加项目根目录到系统路径
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

from app import create_app
from models import db, Site
from datetime import datetime
from pypinyin import lazy_pinyin

# 创建应用上下文
app = create_app()

def generate_slug(name, site_id=None):
    """从名称生成slug"""
    # 将中文转换为拼音
    slug = ''.join(lazy_pinyin(name))
    # 转换为小写，移除特殊字符
    slug = slug.lower()
    slug = re.sub(r'[^\w\s-]', '', slug)
    slug = re.sub(r'[-\s]+', '-', slug).strip('-')

    # 如果转换后为空，使用ID或时间戳
    if not slug:
        if site_id:
            slug = f"site-{site_id}"
        else:
            slug = f"site-{datetime.now().strftime('%Y%m%d%H%M%S')}"

    # 确保slug唯一
    base_slug = slug
    counter = 1
    while Site.query.filter(Site.slug == slug, Site.id != site_id).first():
        slug = f"{base_slug}-{counter}"
        counter += 1

    return slug

with app.app_context():
    try:
        # 查找所有slug为空或包含乱码的网站
        all_sites = Site.query.all()
        sites_to_fix = []

        for site in all_sites:
            # 检查slug是否为空、None、或包含乱码
            if (not site.slug or
                site.slug == 'None' or
                site.slug.strip() == '' or
                any(ord(char) > 127 and not char.isalpha() for char in site.slug)):
                sites_to_fix.append(site)

        if not sites_to_fix:
            print("No sites to fix. All good!")
        else:
            print(f"Found {len(sites_to_fix)} sites to fix...")

            for site in sites_to_fix:
                old_slug = site.slug
                site.slug = generate_slug(site.name, site.id)
                print(f"  - Site #{site.id} '{site.name}': '{old_slug}' -> '{site.slug}'")

            db.session.commit()
            print(f"Successfully fixed {len(sites_to_fix)} sites!")

    except Exception as e:
        print(f"Migration failed: {str(e)}")
        import traceback
        traceback.print_exc()
        db.session.rollback()
