"""シーン YAML に書くメッシュパスの組み立て．

シーン YAML の `geometry.meshes[].path` は，相対パスなら **YAML 自身のディレクトリ基準**で
解決される（sm-render / sm-visualize / 検証スクリプトはいずれも YAML の親を基点に渡す）．
スイープスクリプトが configs/_tmp_*/ に書き出す YAML は，以前は絶対パスを書いていたため
Windows で生成した YAML（C:\\Users\\...）を研究室サーバへ送ると読めなかった
（2026-09-13 Newton で確認）．YAML からの相対パスを POSIX 区切りで書けば，
リポジトリごとどこへ移しても（Windows でも Linux でも）そのまま解決できる．
"""

from __future__ import annotations

import logging
import os
from pathlib import Path

_logger = logging.getLogger(__name__)


def relative_mesh_path(target: Path, yaml_dir: Path) -> str:
    """メッシュファイルを，YAML の置き場所からの相対パス（POSIX 区切り）で返す．

    Windows で別ドライブにあるなど相対パスで表せない場合だけ，警告ログを出して
    絶対パスを返す（従来の挙動．サーバへは持ち出せない）．

    Args:
        target: メッシュファイルのパス（相対なら CWD 基準）．
        yaml_dir: そのパスを書き込むシーン YAML のディレクトリ．

    Returns:
        YAML に書き込むパス文字列（例: `meshes/筐体_L120.stl`，`../meshes/前側.stl`）．
    """
    target_abs = target.resolve()
    try:
        rel = os.path.relpath(target_abs, yaml_dir.resolve())
    except ValueError:
        _logger.warning(
            "メッシュ %s は YAML ディレクトリ %s からの相対パスで表せないため"
            "絶対パスを書き込みます（他のマシンでは読めません）．",
            target_abs,
            yaml_dir,
        )
        return str(target_abs)
    return Path(rel).as_posix()
