"""
agentpaas.engine.workspace_provision — 创建智能体实例时自动开辟工作目录。

布局参照 ``Research-Vault/Workspace/multi-reviewer67``（实际用出来的习惯）：

    <workspace_base>/<智能体名>/
    ├── data/                       ← source_dir: 用户投放输入材料（论文/讲义）
    ├── workspace/run_YYYYMMDD_*/   ← run_dir 指向 <根>/workspace，
    │                                  _execute_agent bare=True 直接在其下建 run_*
    └── (最终交付物直接落根目录)      ← work_dir: 报告/PDF 等，用户一眼可见；
                                       也是 Bash 工具的会话 CWD

好处：产物不再藏进安装包目录（agentpacks/<id>/<ver>/workspace/ 对
非技术用户不可见），每个智能体一个独立文件夹，在访达里直接浏览。

策略：仅当用户创建时**三个目录全部留空**才自动开辟；显式给了任何
一个就完全尊重用户输入。失败返回全空——目录开辟绝不拦住智能体创建。
"""
from __future__ import annotations

import logging
import os
import re
from typing import Dict

logger = logging.getLogger(__name__)


def _slugify(name: str) -> str:
    """目录名清洗：保留中英文/数字/._-，其余（含路径分隔符）替换为 -。"""
    s = re.sub(r"[^\w一-鿿.\-]+", "-", (name or "").strip())
    s = s.strip("-. ")
    return s or "agent"


def provision_agent_workspace(agent_name: str, base: str = "") -> Dict[str, str]:
    """为新智能体开辟标准工作目录，返回 {work_dir, source_dir, run_dir}。

    重名时追加 -2/-3… 后缀（每个实例独立文件夹，互不踩踏）。
    任何异常 → 返回三个空串并告警（不抛）。
    """
    try:
        if not base:
            from agentpaas.config import settings
            base = settings.workspace_base
        slug = _slugify(agent_name)
        root = os.path.join(base, slug)
        n = 1
        while os.path.exists(root):
            n += 1
            root = os.path.join(base, f"{slug}-{n}")
        os.makedirs(os.path.join(root, "data"), exist_ok=True)
        os.makedirs(os.path.join(root, "workspace"), exist_ok=True)
        root = os.path.abspath(root)
        return {
            "work_dir": root,
            "source_dir": os.path.join(root, "data"),
            # run_dir 在 _execute_agent 里走 bare=True 分支（run_* 直接
            # 建在该目录下、不再追加 workspace/），所以这里指到
            # <根>/workspace —— 与参照布局 <根>/workspace/run_* 一致。
            "run_dir": os.path.join(root, "workspace"),
        }
    except Exception as e:  # 开辟失败不拦创建
        logger.warning(f"agent workspace provision failed for {agent_name!r}: {e}")
        return {"work_dir": "", "source_dir": "", "run_dir": ""}
