# -*- coding: utf-8 -*-
#
# Iterativ GmbH
# http://www.iterativ.ch/
#
# Copyright (c) 2018 Iterativ GmbH. All rights reserved.
#
# Created on 25.09.18
# @author: Ramon Wenger <ramon.wenger@iterativ.ch>

import bleach
import re

from api.utils import get_object
from assignments.models import Assignment
from books.models import ContentBlock


class AssignmentParameterException(Exception):
    pass


def newlines_to_paragraphs(text):
    parts = re.split(r'[\r\n]+', text)
    paragraphs = ['<p>{}</p>'.format(p.strip()) for p in parts]
    return '\n'.join(paragraphs)


ALLOWED_BLOCKS = (
    'text_block',
    'student_entry',
    'image_url_block',
    'link_block',
    'video_block',
    'assignment',
    'document_block',
)


def handle_content_block(content, context=None, module=None, allowed_blocks=ALLOWED_BLOCKS):
    # todo: add all the content blocks
    # todo: sanitize user inputs!
    if content['type'] not in allowed_blocks:
        return

    if content['type'] == 'text_block':
        return {
            'type': 'text_block',
            'value': {
                'text': newlines_to_paragraphs(bleach.clean(content['value']['text'], strip=True))
            }}
    elif content['type'] == 'assignment':
        if module is None:
            raise AssignmentParameterException('Module is missing for assignment')  # todo: define better exception
        if context is None:
            raise AssignmentParameterException('Context is missing for assignment')
        value = content['value']
        if value.get('id') is not None:
            assignment = get_object(Assignment, value.get('id'))
            assignment.title = value.get('title')
            assignment.assignment = value.get('assignment')
            assignment.save()
        else:
            assignment = Assignment.objects.create(
                title=value.get('title'),
                assignment=value.get('assignment'),
                owner=context.user,
                module=module,
                user_created=True
            )

        return {
            'type': 'assignment',
            'value': {
                'assignment_id': assignment.id
            }}
    elif content['type'] == 'image_url_block':
        return {
            'type': 'image_url_block',
            'value': {
                'url': bleach.clean(content['value']['url'])
            }}
    elif content['type'] == 'link_block':
        return {
            'type': 'link_block',
            'value': {
                'text': bleach.clean(content['value']['text']),
                'url': bleach.clean(content['value']['url'])
            }
        }
    elif content['type'] == 'video_block':
        return {
            'type': 'video_block',
            'value': {
                'url': bleach.clean(content['value']['url'])
            }}
    elif content['type'] == 'document_block':
        return {
            'type': 'document_block',
            'value': {
                'url': bleach.clean(content['value']['url'])
            }}

    return None


def set_user_defined_block_type(block_type):
    if block_type == ContentBlock.TASK.upper():
        return ContentBlock.TASK
    else:
        return ContentBlock.NORMAL
