"""
Tools for creating edxnotes content fixture data.
"""


import json

import factory
import requests

from common.test.acceptance.fixtures import EDXNOTES_STUB_URL


class Range(factory.Factory):
    class Meta(object):
        model = dict

    start = "/div[1]/p[1]"
    end = "/div[1]/p[1]"
    startOffset = 0
    endOffset = 8


class Note(factory.Factory):
    class Meta(object):
        model = dict

    user = "dummy-user"
    usage_id = "dummy-usage-id"
    course_id = "dummy-course-id"
    text = "dummy note text"
    quote = "dummy note quote"
    ranges = [Range()]


class EdxNotesFixtureError(Exception):
    """
    Error occurred while installing a edxnote fixture.
    """
    pass


class EdxNotesFixture(object):
    notes = []

    def create_notes(self, notes_list):
        self.notes = notes_list
        return self

    def install(self):
        """
        Push the data to the stub EdxNotes service.
        """
        response = requests.post(
            '{}/create_notes'.format(EDXNOTES_STUB_URL),
            data=json.dumps(self.notes)
        )

        if not response.ok:
            raise EdxNotesFixtureError(
                u"Could not create notes {0}.  Status was {1}".format(
                    json.dumps(self.notes), response.status_code
                )
            )

        return self

    def cleanup(self):
        """
        Cleanup the stub EdxNotes service.
        """
        self.notes = []
        response = requests.put('{}/cleanup'.format(EDXNOTES_STUB_URL))

        if not response.ok:
            raise EdxNotesFixtureError(
                u"Could not cleanup EdxNotes service {0}.  Status was {1}".format(
                    json.dumps(self.notes), response.status_code
                )
            )

        return self
