# -*- coding: utf-8 -*-
"""
NUD 自定义语法库：cast 类型转换库
=================================
放 lib/ 目录，NUD 里：
    /being/
    import cast
    a = input("请输入数字: ")
    /cast/int/a         ← 把 a 转成整数，结果存回 a
    /cast/float/a       ← 把 a 转成小数，结果存回 a
    /cast/str/a         ← 把 a 转成字符串，结果存回 a

说明：
  - /cast/int/变量名     把变量转成整数（原地替换）
  - /cast/float/变量名   把变量转成小数（原地替换）
  - /cast/str/变量名     把变量转成字符串（原地替换）
  - 转换失败报错（比如把 "abc" 转 int）
  - 配合 input 使用：input 拿到的是字符串，转成数字才能做运算

用法示例：
    /being/
    import cast
    a = input("请输入年龄: ")
    /cast/int/a
    next = a + 1
    print(str next)
"""

import re

LIB_NAME = "cast"
LIB_VERSION = "1.0.0"
LIB_DESCRIPTION = "类型转换库：/cast/int/变量 /cast/float/变量 /cast/str/变量"

_NAME = r"[一-龥A-Za-z_][一-龥A-Za-z0-9_]*"

_CAST_RE = re.compile(r"^/cast/(int|float|str)/(" + _NAME + r")$")


def parse_line(content, line_num, sm_imported):
    content = content.strip()
    if not content:
        return None, None

    m = _CAST_RE.match(content)
    if not m:
        return None, None

    return {
        "type": "CAST",
        "line": line_num,
        "cast_to": m.group(1),
        "var": m.group(2),
    }, None


def execute(node, env, registry, moves, output=None):
    cast_to = getattr(node, "cast_to", "")
    if not cast_to and isinstance(node, dict):
        cast_to = node.get("cast_to", "")
    var = getattr(node, "var", "")
    if not var and isinstance(node, dict):
        var = node.get("var", "")

    if var not in env:
        return f"变量 '{var}' 未定义"

    val = env[var]

    try:
        if cast_to == "int":
            result = int(float(val)) if isinstance(val, str) else int(val)
        elif cast_to == "float":
            result = float(val)
        elif cast_to == "str":
            result = str(val)
        else:
            return f"不支持的类型: {cast_to}"
    except (TypeError, ValueError):
        return f"变量 '{var}' 的值 '{val}' 无法转成 {cast_to}"

    # 原地替换
    env[var] = result
    return None
