import base64
import json
import os
from subprocess import call
from tarfile import ENCODING
from typing import Dict, Any
import requests
from bbcli.services.courses_service import list_courses
from bbcli.utils.URL_builder import URLBuilder

from bbcli.utils.utils import check_response

url_builder = URLBuilder()

# User gets a tree structure view of the courses content
# where each content is listed something like this: _030303_1 Lectures Folder
def list_contents(session: requests.Session, course_id, folder_id):
    if folder_id is not None:
        url = url_builder.base_v1().add_courses().add_id(course_id).add_contents().add_id(folder_id).create()
    else:
        url = url_builder.base_v1().add_courses().add_id(course_id).add_contents().create()
    response = session.get(url)
    if check_response(response) is False:
        return
    else:
        return response

# get the children of a specific folder
def get_children(session: requests.Session, course_id: str, node_id: str):
    url = url_builder.base_v1().add_courses().add_id(course_id).add_contents().add_id(node_id).add_children().create()
    return session.get(url)

# If it is a folder, list it like a tree structure view like mentioned above.
# If it is a document, download and open the document maybe?
# Find all types of content and have an appropriate response for them. This
# should maybe be handled in the view...
def get_content(session: requests.Session, course_id: str, node_id: str):
    url = url_builder.base_v1().add_courses().add_id(course_id).add_contents().add_id(node_id).create()
    print(url)
    return session.get(url)

def get_file(session: requests.Session, course_id: str, node_id: str):
    # https://ntnu.blackboard.com/learn/api/public/v1/courses/_27251_1/contents/_1685326_1
    url = url_builder.base_v1().add_courses().add_id(course_id).add_contents().add_id(node_id).add_attachments()
    current = url.create()
    response = session.get(current)
    data = response.json()
    if check_response(response) == False:
        return
    else:
        print("kommer her")
        id = data['results'][0]['id']
        # url = url.add_id(id).add_download().create()
        url = url_builder.base_v1().add_courses().add_id(course_id).add_contents().add_id(node_id).add_attachments().add_id(id).add_download().create()
        print(url)
        response = session.get(url)
        print(response.headers)

        import urllib.request
        with urllib.request.urlopen(url) as f:
            html = f.read().decode('utf-8')
            print(html)

    return response




# List all contents of type assignment, should be executed if a flag for example like --content-type assignment or smth is used
def list_assignments(cookies: Dict, course_id: str):
    print('Getting all assignments')

# TODO: add methods for all content types like the one above


# Create content. This should have a flag which says what kind of content type it is


# Create assignment. Creates an assignment

# Delete spesific content

# Update spesific content


def test_create_assignment(session: requests.Session, course_id: str, content_id: str):
    
    with open('/home/magnus/Downloads/3_meeting_notes.pdf', 'rb') as f:
        byte_content = f.read()

    base64_bytes = base64.b64encode(byte_content)
    base64_string = base64_bytes.decode(ENCODING)

    data = {
        "parentId": content_id,
        "title": "Test file",
        'body': 'jaja',
        "description": "string",
        "position": 0,
        "launchInNewWindow": True,
        "availability": {
            "available": "Yes",
            "allowGuests": True,
            "allowObservers": True,
            "adaptiveRelease": {
            "start": "2022-03-29T09:32:35.571Z",
            }
        },
        "contentHandler": {
            'id':'resource/x-bb-file',
            'file': base64_string
        },
    }
    data = json.dumps(data)
    session.headers.update({'Content-Type': 'application/json'})
    # files = {
    #     'pdf_document': open('/home/magnus/Downloads/3_meeting_notes.pdf', 'rb')
    # }

    

    # Returns the string: domain +  /learn/api/public/v1/courses/{courseId}/contents/{contentId}/children
    url = url_builder.base_v1().add_courses().add_id(course_id).add_contents().add_id(content_id).add_children().create()

    response = session.post(url, data=data)
    print(response.text)