import json
import pytest
from copy import copy

from fatcat_openapi_client import *
from fatcat_openapi_client.rest import ApiException
from fixtures import *


def test_fileset(api):

    eg = quick_eg(api)
    r1 = ReleaseEntity(title="test fileset release", ext_ids=ReleaseExtIds())
    r1edit = api.create_release(eg.editgroup_id, r1)

    fs1 = FilesetEntity(
        manifest = [
            FilesetFile(
                path="data/thing.tar.gz",
                size=54321,
                md5="540da3ea6e448d8dfb057c05225f853a",
                sha1="1dab6a0e110f9b5d70b18db0abf051f7f93faf06",
                sha256="c7b49f3e84cd1b7cb0b0e3e9f632b7be7e21b4dc229df23331f880a8a7dfa75a",
                extra={"a": 1, "b": 3},
            ),
            FilesetFile(
                path="README.md",
                size=54210,
                md5="5f83592b5249671719bbed6ce91ecfa8",
                sha1="455face3598611458efe1f072e58624790a67266",
                sha256="429bcafa4d3d0072d5b2511e12c85c1aac1d304011d1c406da14707f7b9cd905",
                extra={"x": 1, "y": "q"},
            ),
        ],
        urls = [
            FilesetUrl(url="https://archive.org/download/fileset-123/", rel="repository"),
            FilesetUrl(url="https://humble-host.com/~user123/dataset/", rel="web"),
        ],
        release_ids = [r1edit.ident],
        extra=dict(t=4, u=9),
        edit_extra=dict(test_key="filesets rule"),
    )

    fs1edit = api.create_fileset(eg.editgroup_id, fs1)
    assert fs1edit.extra == fs1.edit_extra
    api.accept_editgroup(eg.editgroup_id)
    fs2 = api.get_fileset(fs1edit.ident)

    # get revision
    fs2_rev = api.get_fileset_revision(fs1edit.revision)
    assert fs1edit.revision == fs2_rev.revision
    assert fs2.revision == fs2_rev.revision

    # check that fields match
    assert fs1.urls == fs2.urls
    assert fs1.manifest == fs2.manifest
    assert fs1.release_ids == fs2.release_ids
    assert fs1.extra == fs2.extra

    # expansion
    r1 = api.get_release(r1edit.ident, expand="filesets")
    assert r1.filesets[0].manifest == fs1.manifest

    # get redirects (none)
    assert api.get_fileset_redirects(fs2.ident) == []
    
    # delete
    eg = quick_eg(api)
    api.delete_fileset(eg.editgroup_id, fs2.ident)
    api.accept_editgroup(eg.editgroup_id)
    fs2 = api.get_fileset(fs2.ident)
    assert fs2.state == "deleted"

def test_fileset_examples(api):
    fs3 = api.get_fileset('aaaaaaaaaaaaaztgaaaaaaaaam')
    assert fs3.releases is None
    fs3 = api.get_fileset('aaaaaaaaaaaaaztgaaaaaaaaam', expand="releases")

    assert fs3.urls[0].url == 'http://other-personal-blog.name/dataset/'
    assert fs3.urls[1].rel == 'archive'
    assert fs3.manifest[1].md5 == 'f4de91152c7ab9fdc2a128f962faebff'
    assert fs3.manifest[1].extra['mimetype'] == 'application/gzip'
    assert fs3.releases[0].ident
    assert fs3.releases[0].abstracts is None
    assert fs3.releases[0].refs is None

def test_bad_fileset(api):

    eg = quick_eg(api)

    bad_list = [
        # good (for testing test itself)
        #FilesetEntity(manifest=[FilesetFile(path="123.jpg", size=1234)]),
        #FilesetEntity(urls=[FilesetUrl(url="thing", rel="blah")]),
        FilesetEntity(manifest=[FilesetFile(path="123.jpg", size="big")]),
        FilesetEntity(release_ids=["asdf"]),
    ]

    for b in bad_list:
        with pytest.raises(fatcat_openapi_client.rest.ApiException):
            api.create_fileset(eg.editgroup_id, b)