from pathlib import Path

import httpx

from .config import CATEGORY_NAMES, KB_CODE, KB_DESCRIPTION, KB_NAME
from .state import ImportState
from common_logging import get_logger
logger = get_logger(__name__)

_BP_ROOT = Path(__file__).resolve().parents[5] / 'base_platform'

def login(base_url: str, email: str, password: str) -> str:
    resp = httpx.post(f'{base_url}/api/v1/auth/login', json={'email': email, 'password': password}, timeout=30)
    resp.raise_for_status()
    token = resp.json().get('access_token')
    if not token:
        raise RuntimeError(f'登录失败，响应：{resp.text}')
    logger.info(f'登录成功: {email}')
    return token

def run_phase1(state: ImportState, base_url: str, token: str, tenant_id: int) -> None:
    if state.is_phase_done('1'):
        logger.info('Phase 1 已完成，跳过')
        return
    headers = {'Authorization': f'Bearer {token}', 'Content-Type': 'application/json'}
    with httpx.Client(base_url=base_url, headers=headers, timeout=30, follow_redirects=True) as client:
        kb_id = _get_or_create_kb(client)
        state.set_kb_id(kb_id)
        logger.info(f'知识库 ID: {kb_id}')
        category_map = _get_or_create_categories(client, kb_id, state)
        state.set_category_map(category_map)
        logger.info(f'分类映射: {category_map}')
    _seed_taxonomy(tenant_id)
    state.mark_phase_done('1')
    logger.info('✓ Phase 1 完成')

def _get_or_create_kb(client: httpx.Client) -> int:
    resp = client.get('/api/v1/knowledge/bases', params={'search': KB_NAME, 'page_size': 10})
    resp.raise_for_status()
    data = resp.json()
    if isinstance(data, list):
        items = data
    else:
        items = data.get('items') or data.get('data') or []
    for kb in items:
        if kb.get('name') == KB_NAME:
            logger.info(f"知识库已存在: {KB_NAME} (id={kb['id']})")
            return kb['id']
    resp = client.post('/api/v1/knowledge/bases', json={'name': KB_NAME, 'code': KB_CODE, 'description': KB_DESCRIPTION, 'type': 'tax_regulations', 'status': 'active', 'is_public': True})
    resp.raise_for_status()
    kb_id = resp.json()['id']
    logger.info(f'知识库已创建: {KB_NAME} (id={kb_id})')
    return kb_id

def ensure_kb_category(client: httpx.Client, kb_id: int, name: str, sort_order: int=0, parent_id: int | None=None) -> int:
    resp = client.get(f'/api/v1/knowledge/bases/{kb_id}/categories')
    resp.raise_for_status()
    for c in resp.json() or []:
        if c['name'] == name:
            logger.info(f"分类已存在: {name} (id={c['id']})")
            return c['id']
    payload: dict = {'knowledge_base_id': kb_id, 'name': name, 'sort_order': sort_order}
    if parent_id is not None:
        payload['parent_id'] = parent_id
    resp = client.post('/api/v1/knowledge/categories', json=payload)
    resp.raise_for_status()
    cat_id = resp.json()['id']
    logger.info(f'分类已创建: {name} (id={cat_id})')
    return cat_id

def _get_or_create_categories(client: httpx.Client, kb_id: int, state: 'ImportState') -> dict[int, int]:
    category_map: dict[int, int] = {}
    for dc_cat_id, name in CATEGORY_NAMES.items():
        cat_id = ensure_kb_category(client, kb_id, name, sort_order=dc_cat_id)
        category_map[dc_cat_id] = cat_id
    from app.database import SessionLocal
    from app.models.tax_data import DataSource
    TYPE_TO_PARENT_NAME = {'regulation': '税务部门规章', 'qa': '其他文件', 'announcement': '税务规范性文件'}
    parent_name_to_id = {name: cid for cid, name in CATEGORY_NAMES.items()}
    with SessionLocal() as db:
        new_sources = db.query(DataSource).filter(DataSource.code != 'chinatax', DataSource.is_active).all()
        for source in new_sources:
            parent_name = TYPE_TO_PARENT_NAME.get(source.source_type)
            parent_kb_id = None
            if parent_name and parent_name in parent_name_to_id:
                parent_kb_id = category_map.get(parent_name_to_id[parent_name])
            kb_cat_id = ensure_kb_category(client, kb_id, source.name, parent_id=parent_kb_id)
            state.set_source_category(source.id, kb_cat_id)
    return category_map

def _seed_taxonomy(tenant_id: int) -> None:
    import subprocess


    bp_python = _BP_ROOT / 'venv' / 'bin' / 'python3'
    script = f"\nimport sys\nsys.path.insert(0, '{_BP_ROOT}')\nsys.path.insert(0, '{_BP_ROOT.parent}')\nfrom industry_accelerator.tax.scripts.seed.taxonomy.seed_taxonomy import seed_taxonomy\nseed_taxonomy({tenant_id})\n"
    result = subprocess.run([str(bp_python), '-c', script], capture_output=True, text=True, timeout=120)
    if result.returncode == 0:
        logger.info(f'✓ 标签体系种子数据已写入 (tenant_id={tenant_id})')
        if result.stdout:
            logger.info(result.stdout.strip())
    else:
        logger.warning(f'标签体系种子数据写入失败: {result.stderr.strip()}')
