from __future__ import absolute_import
from __future__ import print_function
import pytest
import re
import os
import urllib
from jss.jamf_software_server import JSS
import jss
from jss.distribution_point import JCDS

try:
    # Python 2.6-2.7
    from HTMLParser import HTMLParser
except ImportError:
    # Python 3
    from html.parser import HTMLParser


@pytest.mark.jamfcloud
class TestJCDS(object):

    def test_jcds_scrape_baseurl(self, cloud_j):  # type: (JSS) -> None
        """Assert that we can scrape the jcds upload base url from the ``legacy/packages.html`` page,
        from <div class='chunked-uploader' data-base-url>"""
        response = cloud_j.scrape('legacy/packages.html?id=-1&o=c')
        re_data_base_url = re.compile('data-base-url="([^"]*)"')
        # print(response.content)
        matches = re_data_base_url.search(response.content)
        print(matches.group(1))
        h = HTMLParser()

        print(h.unescape(matches.group(1)))

    def test_jcds_scrape_token(self, cloud_j):  # type: (JSS) -> None
        """Assert that we can scrape the jcds upload token from the ``legacy/packages.html`` page,
        from <div class='chunked-uploader' data-upload-token>"""
        response = cloud_j.scrape('legacy/packages.html?id=-1&o=c')
        re_data_base_url = re.compile('data-upload-token="([^"]*)"')
        # print(response.content)
        matches = re_data_base_url.search(response.content)
        print(matches.group(1))
        h = HTMLParser()

        print(h.unescape(matches.group(1)))

    def test_jcds_scrape_info(self, cloud_j):   # type: (JSS) -> None
        """Test that the JCDS distribution server object can scrape all needed information from the jamfcloud packages
        page."""
        jcds = JCDS(jss=cloud_j)
        jcds._scrape_tokens()
        assert 'jcds_base_url' in jcds.connection
        print(jcds.connection['jcds_base_url'])
        assert 'jcds_upload_token' in jcds.connection
        print(jcds.connection['jcds_upload_token'])

    def test_jcds_upload_chunks(self, cloud_j, pkg_path):  # type: (JSS) -> None
        """Assert that we can POST a chunked file as multipart form data, with form field name = ``file`` and filename
        = ``blob`. eg.

        POST https://regioncode-jcds.jamfcloud.com//api/file/v1/<tenant code>/package.pkg/part?chunk=0&chunks=12
        """
        jcds = JCDS(jss=cloud_j)
        jcds._scrape_tokens()
        assert 'jcds_base_url' in jcds.connection
        print(jcds.connection['jcds_base_url'])
        assert 'jcds_upload_token' in jcds.connection
        print(jcds.connection['jcds_upload_token'])
        jcds.copy_pkg(pkg_path)

    def test_jcds_create_and_upload(self, cloud_j, pkg_path):  # type: (JSS) -> None
        """Assert that we can create a package object, then upload an associated package via JCDS."""
        jcds = JCDS(jss=cloud_j)
        jcds._scrape_tokens()
        assert 'jcds_base_url' in jcds.connection
        print(jcds.connection['jcds_base_url'])
        assert 'jcds_upload_token' in jcds.connection
        print(jcds.connection['jcds_upload_token'])
        jcds.copy_pkg(pkg_path)

        pkg = jss.Package(cloud_j, os.path.basename(pkg_path))
        pkg.save()

    def test_jcds_fixup(self, cloud_j, pkg_path):  # type: (JSS) -> None
        pkg = cloud_j.Package(os.path.basename(pkg_path))
        print(pkg)
        pkg.save()