
"""
checkbox:
```chatmark type=form
Which files would you like to commit? I've suggested a few.
> [x](file1) devchat/engine/prompter.py
> [x](file2) devchat/prompt.py
> [](file3) tests/test_cli_prompt.py
```

radio:
```chatmark type=form
How would you like to make the change?
> - (insert) Insert the new code.
> - (new) Put the code in a new file.
> - (replace) Replace the current code.
```

editor:
```chatmark type=form
I've drafted a commit message for you as below. Feel free to modify it.

> | (ID)
> fix: prevent racing of requests
>
> Introduce a request id and a reference to latest request. Dismiss
> incoming responses other than from latest request.
>
> Reviewed-by: Z
> Refs: #123
```
"""


import re

def extract_ui_blocks(text):
    # 定义用于提取各种UI块的正则表达式
    ui_block_pattern = re.compile(r'```chatmark.*?\n(.*?)\n```', re.DOTALL)
    return ui_block_pattern.findall(text)

def parse_ui_block(block):
    # 解析checkbox
    result = []
    checkbox_pattern = re.compile(r'> \[(x|)\]\((.*?)\)')
    checkboxes = checkbox_pattern.findall(block)
    if checkboxes:
        result.append({
            'type': 'checkbox',
            'items': [{'checked': bool(x.strip()), 'id': file_id} for x, file_id in checkboxes]
        })

    # 解析radio
    radio_pattern = re.compile(r'> - \((.*?)\)')
    radios = radio_pattern.findall(block)
    if radios:
        result.append({
            'type': 'radio',
            'items': [{'id': radio_id} for radio_id in radios]
        })

    # 解析editor
    editor_pattern = re.compile(r'> \| \((.*?)\)\n((?:> .*\n?)*)', re.DOTALL)
    editor_match = editor_pattern.search(block)
    if editor_match:
        editor_id = editor_match.group(1)
        editor_text = editor_match.group(2).strip().replace('> ', '')
        result.append({
            'type': 'editor',
            'id': editor_id,
            'text': editor_text
        })

    return result

def parse_ui_description(text):
    # 提取所有UI块
    blocks = extract_ui_blocks(text)
    # 解析每个UI块并返回结果
    return [parse_ui_block(block) for block in blocks if parse_ui_block(block)]


def test_ui():
    description = """
checkbox:
```chatmark type=form
Which files would you like to commit? I've suggested a few.
> [x](file1) devchat/engine/prompter.py
> [x](file2) devchat/prompt.py
> [](file3) tests/test_cli_prompt.py
```

radio:
```chatmark type=form
How would you like to make the change?
> - (insert) Insert the new code.
> - (new) Put the code in a new file.
> - (replace) Replace the current code.
```

editor:
```chatmark type=form
I've drafted a commit message for you as below. Feel free to modify it.

> | (ID)
> fix: prevent racing of requests
>
> Introduce a request id and a reference to latest request. Dismiss
> incoming responses other than from latest request.
>
> Reviewed-by: Z
> Refs: #123
```

checkbox and radio:
```chatmark type=form
Which files would you like to commit? I've suggested a few.
> [x](file1) devchat/engine/prompter.py
> [x](file2) devchat/prompt.py
> [](file3) tests/test_cli_prompt.py

How would you like to make the change?
> - (insert) Insert the new code.
> - (new) Put the code in a new file.
> - (replace) Replace the current code.
```
    """

    parsed_data = parse_ui_description(description)
    for ui_element in parsed_data:
        print(ui_element)

