# ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========

from mirage.core.notion.render import (_block_to_md, _rich_text_to_md,
                                       blocks_to_markdown)


class TestRichTextToMd:

    def test_plain(self):
        rt = [{"plain_text": "hello", "annotations": {}}]
        assert _rich_text_to_md(rt) == "hello"

    def test_bold(self):
        rt = [{"plain_text": "bold", "annotations": {"bold": True}}]
        assert _rich_text_to_md(rt) == "**bold**"

    def test_italic(self):
        rt = [{"plain_text": "em", "annotations": {"italic": True}}]
        assert _rich_text_to_md(rt) == "*em*"

    def test_code(self):
        rt = [{"plain_text": "x", "annotations": {"code": True}}]
        assert _rich_text_to_md(rt) == "`x`"

    def test_link(self):
        rt = [{
            "plain_text": "click",
            "annotations": {},
            "href": "https://example.com"
        }]
        assert _rich_text_to_md(rt) == "[click](https://example.com)"

    def test_multiple(self):
        rt = [
            {
                "plain_text": "a ",
                "annotations": {}
            },
            {
                "plain_text": "b",
                "annotations": {
                    "bold": True
                }
            },
        ]
        assert _rich_text_to_md(rt) == "a **b**"


class TestBlockToMd:

    def test_paragraph(self):
        block = {
            "type": "paragraph",
            "paragraph": {
                "rich_text": [{
                    "plain_text": "hi",
                    "annotations": {}
                }]
            }
        }
        assert _block_to_md(block) == "hi"

    def test_heading_1(self):
        block = {
            "type": "heading_1",
            "heading_1": {
                "rich_text": [{
                    "plain_text": "Title",
                    "annotations": {}
                }]
            }
        }
        assert _block_to_md(block) == "# Title"

    def test_heading_2(self):
        block = {
            "type": "heading_2",
            "heading_2": {
                "rich_text": [{
                    "plain_text": "Sub",
                    "annotations": {}
                }]
            }
        }
        assert _block_to_md(block) == "## Sub"

    def test_bulleted_list_item(self):
        block = {
            "type": "bulleted_list_item",
            "bulleted_list_item": {
                "rich_text": [{
                    "plain_text": "item",
                    "annotations": {}
                }]
            }
        }
        assert _block_to_md(block) == "- item"

    def test_to_do_checked(self):
        block = {
            "type": "to_do",
            "to_do": {
                "rich_text": [{
                    "plain_text": "done",
                    "annotations": {}
                }],
                "checked": True
            }
        }
        assert _block_to_md(block) == "- [x] done"

    def test_code_block(self):
        block = {
            "type": "code",
            "code": {
                "rich_text": [{
                    "plain_text": "print(1)",
                    "annotations": {}
                }],
                "language": "python"
            }
        }
        assert _block_to_md(block) == "```python\nprint(1)\n```"

    def test_divider(self):
        block = {"type": "divider", "divider": {}}
        assert _block_to_md(block) == "---"

    def test_child_page_empty(self):
        block = {"type": "child_page", "child_page": {"title": "Sub"}}
        assert _block_to_md(block) == ""


class TestBlocksToMarkdown:

    def test_multiple_blocks(self):
        blocks = [
            {
                "type": "heading_1",
                "heading_1": {
                    "rich_text": [{
                        "plain_text": "Title",
                        "annotations": {}
                    }]
                }
            },
            {
                "type": "paragraph",
                "paragraph": {
                    "rich_text": [{
                        "plain_text": "body",
                        "annotations": {}
                    }]
                }
            },
        ]
        result = blocks_to_markdown(blocks)
        assert result == "# Title\n\nbody\n"

    def test_empty(self):
        assert blocks_to_markdown([]) == ""

    def test_nested_children_indent(self):
        blocks = [
            {
                "type":
                "bulleted_list_item",
                "bulleted_list_item": {
                    "rich_text": [{
                        "plain_text": "parent",
                        "annotations": {}
                    }]
                },
                "children": [
                    {
                        "type": "bulleted_list_item",
                        "bulleted_list_item": {
                            "rich_text": [{
                                "plain_text": "child",
                                "annotations": {}
                            }]
                        },
                    },
                ],
            },
        ]
        result = blocks_to_markdown(blocks)
        assert result == "- parent\n\n  - child\n"
