import pytest
from books.factories import (
    ChapterFactory,
    ContentBlockFactory,
    InstrumentFactory,
    ModuleFactory,
)
from books.models.contentblock import ContentBlock
from graphql_relay import to_global_id

from core.logger import get_logger

pytestmark = pytest.mark.django_db

logger = get_logger(__name__)

highlight_fragment = """
  fragment HighlightParts on HighlightNode {
    id
    contentIndex
    paragraphIndex
    selectionLength
    contentUuid
    startPosition
    color
    note {
      text
    }
    text
    page {
      ... on Node {
        id
      }
      ... on ModuleNode {
          slug
          id
      }
    }
  }

"""

add_highlight_mutation = (
    highlight_fragment
    + """
  mutation AddHighlight($input: AddHighlightInput!) {
    addHighlight(input: $input) {
      __typename
      highlight {
        ...HighlightParts
      }
    }
  }
"""
)
add_content_highlight_mutation = (
    highlight_fragment
    + """
  mutation AddContentHighlight($input: AddContentHighlightInput!) {
    addContentHighlight(input: $input) {
      __typename
      highlight {
        ...HighlightParts
      }
    }
  }
"""
)

fragment = """
fragment HighlightLegacyParts on HighlightNode {
  id
  contentIndex
  paragraphIndex
  selectionLength
  contentUuid
  startPosition
  color
  note {
    text
  }
  text
  page {
    ... on Node {
      id
    }
    ... on ModuleNode {
        slug
        id
    }
  }
}
"""

content_block_query = (
    fragment
    + """
    query ContentBlockQuery($id: ID!) {
        contentBlock(id: $id) {
            id
            highlights {
                ...HighlightLegacyParts
            }
        }
    }
"""
)

module_query = (
    fragment
    + """
    query ModuleQuery($id: ID!) {
        module(id: $id) {
            id
            highlights {
                ...HighlightLegacyParts
            }
            chapters {
                id 
                highlights {
                    ...HighlightLegacyParts
                }
            }
        }
    }
"""
)

instrument_query = (
    fragment
    + """
        query InstrumentQuery($id: ID!) {
            instrument(id:$id) {
                id
                highlights {
                    ...HighlightLegacyParts
                }
            }
        }
        """
)


@pytest.mark.usefixtures("create_users")
class TestAddHighlight:
    def test_add_highlight_in_content_block(self, teacher, get_client):
        module = ModuleFactory()
        content_block = ContentBlockFactory(module=module)
        client = get_client(teacher)
        # content_block = ContentBlock.objects.create(slug="slug", title="title")
        cid = to_global_id("ContentBlockNode", content_block.id)
        result = client.execute(
            add_content_highlight_mutation,
            variables={
                "input": {
                    "highlight": {
                        "page": cid,
                        "contentIndex": 0,
                        "contentUuid": "427ee0b7-aee0-424e-8cb6-35ac12a8fb66",
                        "paragraphIndex": 0,
                        "text": "Hallo",
                        "startPosition": 0,
                        "selectionLength": 10,
                        "color": "alpha",
                    }
                }
            },
        )
        assert result.errors is None

        highlight = result.data.get("addContentHighlight").get("highlight")
        assert highlight.get("text") == "Hallo"
        assert highlight.get("page").get("id") == cid

        client = get_client(teacher)
        result = client.execute(content_block_query, variables={"id": cid})
        assert result.errors is None
        content_block = result.data.get("contentBlock")
        assert content_block.get("id") == cid
        assert content_block.get("highlights")[0].get("color") == "alpha"
        assert content_block.get("highlights")[0].get("page").get("id") == cid

    def test_add_highlight_in_content_block_without_uuid(self, teacher, get_client):
        module = ModuleFactory()
        content_block = ContentBlockFactory(module=module)
        client = get_client(teacher)
        # content_block = ContentBlock.objects.create(slug="slug", title="title")
        cid = to_global_id("ContentBlockNode", content_block.id)
        result = client.execute(
            add_content_highlight_mutation,
            variables={
                "input": {
                    "highlight": {
                        "page": cid,
                        "contentIndex": 0,
                        "paragraphIndex": 0,
                        "text": "Hallo",
                        "startPosition": 0,
                        "selectionLength": 10,
                        "color": "alpha",
                    }
                }
            },
        )
        assert result.errors is not None

    def test_add_highlight_in_instrument(self, teacher, get_client):
        instrument = InstrumentFactory()
        client = get_client(teacher)
        iid = to_global_id("InstrumentNode", instrument.id)
        result = client.execute(
            add_highlight_mutation,
            variables={
                "input": {
                    "highlight": {
                        "page": iid,
                        "paragraphIndex": 0,
                        "text": "Hallo",
                        "startPosition": 0,
                        "selectionLength": 10,
                        "color": "alpha",
                    }
                }
            },
        )
        assert result.errors is None

        highlight = result.data.get("addHighlight").get("highlight")
        logger.debug(highlight)
        logger.debug(iid)
        assert highlight.get("text") == "Hallo"
        assert highlight.get("page").get("id") == iid

        client = get_client(teacher)
        result = client.execute(instrument_query, variables={"id": iid})
        assert result.errors is None
        instrument = result.data.get("instrument")
        logger.debug(instrument)
        assert instrument.get("id") == iid
        assert instrument.get("highlights")[0].get("color") == "alpha"
        assert instrument.get("highlights")[0].get("page").get("id") == iid

    def test_add_highlight_in_module(self, teacher, get_client):
        module = ModuleFactory()
        client = get_client(teacher)
        mid = to_global_id("ModuleNode", module.id)
        result = client.execute(
            add_highlight_mutation,
            variables={
                "input": {
                    "highlight": {
                        "page": mid,
                        "paragraphIndex": 0,
                        "text": "Hallo",
                        "startPosition": 0,
                        "selectionLength": 10,
                        "color": "alpha",
                    }
                }
            },
        )
        assert result.errors is None

        highlight = result.data.get("addHighlight").get("highlight")
        logger.debug(highlight)
        logger.debug(mid)
        assert highlight.get("text") == "Hallo"
        assert highlight.get("page").get("id") == mid

        client = get_client(teacher)
        result = client.execute(module_query, variables={"id": mid})
        assert result.errors is None
        module = result.data.get("module")
        logger.debug(module)
        assert module.get("id") == mid
        assert module.get("highlights")[0].get("color") == "alpha"
        assert module.get("highlights")[0].get("page").get("id") == mid

    def test_add_highlight_in_chapter(self, teacher, get_client):
        module = ModuleFactory()
        chapter = ChapterFactory(parent=module)
        client = get_client(teacher)
        mid = to_global_id("ModuleNode", module.id)
        cid = to_global_id("ChapterNode", chapter.id)
        result = client.execute(
            add_highlight_mutation,
            variables={
                "input": {
                    "highlight": {
                        "page": cid,
                        "paragraphIndex": 0,
                        "text": "Hallo",
                        "startPosition": 0,
                        "selectionLength": 10,
                        "color": "alpha",
                    }
                }
            },
        )
        assert result.errors is None

        highlight = result.data.get("addHighlight").get("highlight")
        assert highlight.get("text") == "Hallo"
        assert highlight.get("page").get("id") == cid

        client = get_client(teacher)
        result = client.execute(module_query, variables={"id": mid})
        assert result.errors is None
        module = result.data.get("module")
        logger.debug(module)
        chapter = module.get("chapters")[0]
        assert chapter.get("id") == cid
        assert chapter.get("highlights")[0].get("color") == "alpha"
        assert chapter.get("highlights")[0].get("page").get("id") == cid
