from fixtures import *


def test_web_release_create_accept(app_admin, api):

    eg = quick_eg(api)

    rv = app_admin.get("/editgroup/{}".format(eg.editgroup_id))
    assert rv.status_code == 200
    assert b"Release Edits (0)" in rv.data

    # bogus/bad submit
    rv = app_admin.post(
        "/release/create",
        data={
            "editgroup_id": eg.editgroup_id,
            "release_type": "badmojo",
            "release_stage": "published",
            "title": "something bogus",
        },
        follow_redirects=True,
    )
    assert rv.status_code == 400
    # Does not insert bad choices into drop-down
    # assert b'badmojo' in rv.data
    assert b"Not a valid choice" in rv.data

    # bad wikidata QID
    rv = app_admin.post(
        "/release/create",
        data={
            "editgroup_id": eg.editgroup_id,
            "release_type": "article-journal",
            "release_stage": "published",
            "title": "something bogus",
            "wikidata_qid": "884",
        },
        follow_redirects=True,
    )
    assert rv.status_code == 400

    # ok/valid submit
    rv = app_admin.post(
        "/release/create",
        data={
            "editgroup_id": eg.editgroup_id,
            "release_type": "article-journal",
            "release_stage": "published",
            "title": "something bogus",
            "doi": "10.1234/999999",
        },
        follow_redirects=True,
    )
    assert rv.status_code == 200
    assert b"10.1234/999999" in rv.data

    rv = app_admin.get("/editgroup/{}".format(eg.editgroup_id))
    assert rv.status_code == 200
    assert b"Release Edits (1)" in rv.data

    rv = app_admin.post(
        "/editgroup/{}/submit".format(eg.editgroup_id),
        follow_redirects=True,
    )
    assert rv.status_code == 200
    rv = app_admin.get("/editgroup/{}".format(eg.editgroup_id))
    assert rv.status_code == 200
    assert b"Submitted" in rv.data
    assert b"None!" in rv.data

    rv = app_admin.post(
        "/editgroup/{}/unsubmit".format(eg.editgroup_id),
        follow_redirects=True,
    )
    assert rv.status_code == 200
    rv = app_admin.get("/editgroup/{}".format(eg.editgroup_id))
    assert rv.status_code == 200

    rv = app_admin.post(
        "/editgroup/{}/annotation".format(eg.editgroup_id),
        data={
            "comment_markdown": "This is an **example** of markdown in a test annotation",
        },
        follow_redirects=True,
    )
    assert rv.status_code == 200
    rv = app_admin.get("/editgroup/{}".format(eg.editgroup_id))
    assert rv.status_code == 200
    assert b"<p>This is an <strong>example</strong> of markdown in a test annotation" in rv.data

    rv = app_admin.post(
        "/editgroup/{}/accept".format(eg.editgroup_id),
        follow_redirects=True,
    )
    assert rv.status_code == 200
    rv = app_admin.get("/editgroup/{}".format(eg.editgroup_id))
    assert rv.status_code == 200
    assert b"Merged" in rv.data


def test_web_container_create(app_admin, api):

    eg = quick_eg(api)

    # bogus/bad submit
    rv = app_admin.post(
        "/container/create",
        data={
            "editgroup_id": eg.editgroup_id,
        },
        follow_redirects=True,
    )
    assert rv.status_code == 400

    # ok/valid submit
    rv = app_admin.post(
        "/container/create",
        data={
            "editgroup_id": eg.editgroup_id,
            "name": "blah blah journal blah",
        },
        follow_redirects=True,
    )
    assert rv.status_code == 200


def test_web_file_create(app_admin, api):

    eg = quick_eg(api)

    # bogus/bad submit
    rv = app_admin.post(
        "/file/create",
        data={
            "editgroup_id": eg.editgroup_id,
        },
        follow_redirects=True,
    )
    assert rv.status_code == 400

    # ok/valid submit
    rv = app_admin.post(
        "/file/create",
        data={
            "editgroup_id": eg.editgroup_id,
            "size": "12345",
            "sha1": "45be56a396c4d03faaa41e055170c23534dec736",
        },
        follow_redirects=True,
    )
    assert rv.status_code == 200

    # upper-case SHA-1
    rv = app_admin.post(
        "/file/create",
        data={
            "editgroup_id": eg.editgroup_id,
            "size": "12345",
            "sha1": "45BE56A396C4D03FAAA41E055170C23534DEC736",
        },
        follow_redirects=True,
    )
    assert rv.status_code == 200


def test_web_file_toml_create(app_admin, api):

    eg = quick_eg(api)

    # bogus/bad submit
    rv = app_admin.post(
        "/file/create/toml",
        data={
            "editgroup_id": eg.editgroup_id,
        },
        follow_redirects=True,
    )
    assert rv.status_code == 400

    # ok/valid submit
    rv = app_admin.post(
        "/file/create/toml",
        data={
            "editgroup_id": eg.editgroup_id,
            "toml": """
size = 12345
sha1 = "45be56a396c4d03faaa41e055170c23534dec736"
            """,
        },
        follow_redirects=True,
    )
    assert rv.status_code == 200

    # upper-case SHA-1
    rv = app_admin.post(
        "/file/create/toml",
        data={
            "editgroup_id": eg.editgroup_id,
            "toml": """
size = 12345
sha1 = "45BE56A396C4D03FAAA41E055170C23534DEC736"
            """,
        },
        follow_redirects=True,
    )
    assert rv.status_code == 400


def test_web_file_delete(app_admin, api):

    eg = quick_eg(api)

    rv = app_admin.get("/file/aaaaaaaaaaaaamztaaaaaaaaam/delete")
    assert rv.status_code == 200

    rv = app_admin.post(
        "/file/aaaaaaaaaaaaamztaaaaaaaaam/delete",
        data={
            "editgroup_id": eg.editgroup_id,
        },
        follow_redirects=True,
    )
    assert rv.status_code == 200
    # NOTE: did not *accept* the deletion edit


DUMMY_DEMO_ENTITIES = {
    "container": "aaaaaaaaaaaaaeiraaaaaaaaam",
    "creator": "aaaaaaaaaaaaaircaaaaaaaaaq",
    "file": "aaaaaaaaaaaaamztaaaaaaaaam",
    "fileset": "aaaaaaaaaaaaaztgaaaaaaaaai",
    "webcapture": "aaaaaaaaaaaaa53xaaaaaaaaai",
    "release": "aaaaaaaaaaaaarceaaaaaaaaai",
    "work": "aaaaaaaaaaaaavkvaaaaaaaaai",
}


def test_web_edit_get(app_admin):

    # these are all existing entities
    for entity_type in ["release", "file", "container"]:
        rv = app_admin.get(f"/{entity_type}/{DUMMY_DEMO_ENTITIES[entity_type]}/edit")
        assert rv.status_code == 200
        if entity_type == "release":
            assert b"A bigger example" in rv.data
        elif entity_type == "file":
            assert (
                b"ffc1005680cb620eec4c913437dfabbf311b535cfe16cbaeb2faec1f92afc362" in rv.data
            )
        elif entity_type == "container":
            assert b"1549-1277" in rv.data

        rv = app_admin.get(f"/{entity_type}/{DUMMY_DEMO_ENTITIES[entity_type]}/edit/toml")
        assert rv.status_code == 200
        if entity_type == "release":
            assert b"A bigger example" in rv.data
        elif entity_type == "file":
            assert (
                b"ffc1005680cb620eec4c913437dfabbf311b535cfe16cbaeb2faec1f92afc362" in rv.data
            )
        elif entity_type == "container":
            assert b"1549-1277" in rv.data

    # TOML-only endpoints
    for entity_type in ["creator", "fileset", "webcapture", "work"]:
        rv = app_admin.get(f"/{entity_type}/{DUMMY_DEMO_ENTITIES[entity_type]}/edit")
        assert rv.status_code == 302

        rv = app_admin.get(f"/{entity_type}/{DUMMY_DEMO_ENTITIES[entity_type]}/edit/toml")
        assert rv.status_code == 200


def test_web_create_get(app_admin):

    for entity_type in ["release", "file", "container"]:
        rv = app_admin.get(f"/{entity_type}/create")
        assert rv.status_code == 200

        rv = app_admin.get(f"/{entity_type}/create/toml")
        assert rv.status_code == 200

    # these are TOML only
    for entity_type in ["creator", "fileset", "webcapture", "work"]:
        rv = app_admin.get(f"/{entity_type}/create")
        assert rv.status_code == 302

        rv = app_admin.get(f"/{entity_type}/create/toml")
        assert rv.status_code == 200


def test_web_edit_delete(app_admin):

    for entity_type in DUMMY_DEMO_ENTITIES.keys():
        rv = app_admin.get(f"/{entity_type}/{DUMMY_DEMO_ENTITIES[entity_type]}/delete")
        assert rv.status_code == 200