from stdint import *
import t, c
from t import CInt, CExport
from stdio import printf
import memhub
import stdlib
import sys
import string
import ast
import w32.win32console


# MBuddy arena 大小：1MB
ARENA_SIZE: t.CDefine = 1048576
# mpool 内存大小：512KB
POOL_SIZE: t.CDefine = 524288
# dump 缓冲区大小：256KB
DUMP_SIZE: t.CDefine = 262144


def main() -> CInt | CExport:
    w32.win32console.SetConsoleCP(65001)
    w32.win32console.SetConsoleOutputCP(65001)

    printf("AST Comprehensive Test Start\n")

    # 初始化全局 MBuddy 内存分配器
    arena: bytes = stdlib.malloc(ARENA_SIZE)
    if arena == None:
        printf("FAIL: arena alloc failed\n")
        return 1
    mbuddy_obj: memhub.MemBuddy | t.CPtr = memhub.MemBuddy(arena, ARENA_SIZE)
    if mbuddy_obj == None:
        printf("FAIL: mbuddy init failed\n")
        return 1

    sys._mbuddy = mbuddy_obj
    ast._mbuddy = mbuddy_obj

    # 为 ast 解析器创建 mpool
    pool_mem: bytes = stdlib.malloc(POOL_SIZE)
    if pool_mem == None:
        printf("FAIL: malloc for pool failed\n")
        return 1
    pool: memhub.MemPool | t.CPtr = memhub.MemPool(pool_mem, POOL_SIZE)
    if pool == None:
        printf("FAIL: memhub.MemPool init failed\n")
        return 1

    # dump 缓冲区（独立分配）
    dump_mem: bytes = stdlib.malloc(DUMP_SIZE)
    if dump_mem == None:
        printf("FAIL: malloc for dump failed\n")
        return 1
    dump_buf: t.CChar | t.CPtr = t.CChar(dump_mem, t.CPtr)

    # 综合测试源码：覆盖 CPython 主要语法
    src: str = """x = 1
y = 2
z = x + y
a = x - y
b = x * y
c = x / y
d = x == y
e = x < y
f = x > y
g = x and y
h = x or y
i = not x
def foo(a, b):
    return a + b
result = foo(x, y)
if x > 0:
    print(x)
else:
    print(y)
for i in range(10):
    print(i)
while x > 0:
    x = x - 1
class Point:
    pass
"""

    printf("Parsing comprehensive source...\n")

    # 解析
    tree: ast.AST | t.CPtr = ast.parse(src, pool)
    if tree == None:
        printf("FAIL: parse returned None\n")
        stdlib.free(pool_mem)
        stdlib.free(dump_mem)
        return 1

    printf("PASS: parse succeeded\n")

    # dump AST
    printf("Calling ast.dump...\n")
    ast.dump(tree, dump_buf, DUMP_SIZE)
    printf("ast.dump returned, now printing buffer...\n")
    printf("=== AST DUMP ===\n%s\n=== END ===\n", dump_buf)

    stdlib.free(pool_mem)
    stdlib.free(dump_mem)
    return 0
