import time

import httpx
from sqlalchemy import text

from app.database import SessionLocal

from .config import REQUEST_DELAY, VECTORIZE_BATCH_SIZE
from .state import ImportState
from common_logging import get_logger
logger = get_logger(__name__)



SPLITTER_CONFIG = {'splitter_type': 'tax_adaptive', 'enable_parent_child': True, 'enable_reference_extraction': True}

def run_phase3(state: ImportState, base_url: str, token: str) -> None:
    if state.is_phase_done('3'):
        logger.info('Phase 3 已完成，跳过')
        return
    headers = {'Authorization': f'Bearer {token}', 'Content-Type': 'application/json'}
    cursor = state.get_phase3_cursor()
    triggered = 0
    logger.info(f'Phase 3 开始，cursor={cursor}')
    with httpx.Client(base_url=base_url, headers=headers, timeout=30, follow_redirects=True) as client:
        while True:
            with SessionLocal() as db:
                rows = db.execute(text('\n                    SELECT knowledge_doc_id FROM tax_documents\n                    WHERE is_imported = true AND knowledge_doc_id IS NOT NULL\n                      AND knowledge_doc_id > :cursor\n                    ORDER BY knowledge_doc_id ASC\n                    LIMIT :limit\n                '), {'cursor': cursor, 'limit': VECTORIZE_BATCH_SIZE}).fetchall()
            if not rows:
                break
            for knowledge_doc_id, in rows:
                try:
                    resp = client.put(f'/api/v1/knowledge/documents/{knowledge_doc_id}', json=SPLITTER_CONFIG)
                    resp.raise_for_status()
                except Exception as e:
                    logger.warning(f'更新分块配置失败: knowledge_doc_id={knowledge_doc_id} error={e}')
                try:
                    resp = client.post(f'/api/v1/knowledge/documents/{knowledge_doc_id}/vectorize')
                    resp.raise_for_status()
                    triggered += 1
                    logger.debug(f'向量化已触发: knowledge_doc_id={knowledge_doc_id}')
                except Exception as e:
                    logger.error(f'触发向量化失败: knowledge_doc_id={knowledge_doc_id} error={e}')
                cursor = knowledge_doc_id
                state.set_phase3_cursor(cursor)
                time.sleep(REQUEST_DELAY)
    logger.info(f'✓ Phase 3 完成：触发向量化 {triggered} 条（Celery 后台异步处理）')
    state.mark_phase_done('3')
