import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parents[2] / 'base_platform'))
from sqlalchemy import text
from app.db.session import SessionLocal
from app.services.knowledge.file_parser import get_file_parser_service
from hellotax_logging import get_logger

logger = get_logger(__name__)

def reimport_failed_documents(tenant_id: int, dry_run: bool=False):
    db = SessionLocal()
    parser = get_file_parser_service()
    try:
        db.execute(text(f'SET search_path TO tenant_{tenant_id}, public'))
        print(f"\n{'=' * 60}")
        print(f'重新导入失败文档 - Tenant {tenant_id}')
        print(f"模式: {('预览模式' if dry_run else '执行模式')}")
        print(f"{'=' * 60}\n")
        docs = db.execute(text("\n            SELECT id, title, file_type, content\n            FROM knowledge_documents\n            WHERE content LIKE 'ÐÏà¡±á%'\n               OR (LENGTH(content) < 100 AND file_type IN ('doc', 'docx'))\n            ORDER BY id\n        ")).fetchall()
        if not docs:
            print('✓ 没有发现需要重新解析的文档')
            return
        print(f'发现 {len(docs)} 个需要重新解析的文档\n')
        success_count = 0
        error_count = 0
        skipped_count = 0
        for i, (doc_id, title, file_type, content) in enumerate(docs, 1):
            print(f'[{i}/{len(docs)}] 文档 ID {doc_id}: {title[:50]}...')
            if dry_run:
                print(f'  - 文件类型: {file_type}')
                print(f'  - 内容长度: {len(content)} 字符')
                print(f'  - 内容预览: {content[:50]}...')
                skipped_count += 1
                continue
            try:
                if content.startswith('ÐÏà¡±á'):
                    print(f'  ⚠ 文档包含二进制内容，需要从原始ZIP文件重新导入')
                    error_count += 1
                else:
                    print(f'  ⚠ 文档内容过短 ({len(content)} 字符)')
                    error_count += 1
            except Exception as e:
                error_count += 1
                print(f'  ✗ 处理失败: {e}')
        print(f"\n{'=' * 60}")
        print(f'处理完成:')
        print(f'  • 成功: {success_count}')
        print(f'  • 失败: {error_count}')
        print(f'  • 跳过: {skipped_count}')
        print(f"{'=' * 60}\n")
        if not dry_run and success_count > 0:
            db.commit()
            print('✓ 更改已提交到数据库')
        else:
            print('ℹ 未进行任何修改')
    except Exception as e:
        db.rollback()
        print(f'✗ 错误: {e}')
        raise
    finally:
        db.close()

def list_failed_documents(tenant_id: int):
    db = SessionLocal()
    try:
        db.execute(text(f'SET search_path TO tenant_{tenant_id}, public'))
        binary_docs = db.execute(text("\n            SELECT COUNT(*) FROM knowledge_documents\n            WHERE content LIKE 'ÐÏà¡±á%'\n        ")).scalar()
        short_docs = db.execute(text("\n            SELECT COUNT(*) FROM knowledge_documents\n            WHERE LENGTH(content) < 100 AND file_type IN ('doc', 'docx')\n        ")).scalar()
        untagged_docs = db.execute(text('\n            SELECT COUNT(*) FROM knowledge_documents kd\n            LEFT JOIN document_tags dt ON kd.id = dt.document_id\n            WHERE dt.document_id IS NULL\n        ')).scalar()
        total_docs = db.execute(text('\n            SELECT COUNT(*) FROM knowledge_documents\n        ')).scalar()
        print(f"\n{'=' * 60}")
        print(f'文档问题统计 - Tenant {tenant_id}')
        print(f"{'=' * 60}\n")
        print(f'总文档数: {total_docs}')
        print(f'包含二进制内容: {binary_docs} ({(binary_docs * 100 // total_docs if total_docs > 0 else 0)}%)')
        print(f'内容过短 (<100字符): {short_docs} ({(short_docs * 100 // total_docs if total_docs > 0 else 0)}%)')
        print(f'未打标签: {untagged_docs} ({(untagged_docs * 100 // total_docs if total_docs > 0 else 0)}%)')
        print(f"{'=' * 60}\n")
    finally:
        db.close()
if __name__ == '__main__':
    import argparse
    parser = argparse.ArgumentParser(description='重新导入解析失败的文档')
    parser.add_argument('--tenant-id', type=int, required=True, help='租户ID')
    parser.add_argument('--dry-run', action='store_true', help='预览模式，不实际修改')
    parser.add_argument('--list', action='store_true', help='只列出问题文档统计')
    args = parser.parse_args()
    if args.list:
        list_failed_documents(args.tenant_id)
    else:
        reimport_failed_documents(args.tenant_id, args.dry_run)