import pytest

from conftest import assert_data
from program.tests.factories import ImageFactory

pytestmark = pytest.mark.django_db


def url(image=None) -> str:
    return f"/api/v1/images/{image.id}/" if image else "/api/v1/images/"


def image_data() -> dict[str, str]:
    return {
        "alt_text": "ALT TEXT",
        "credits": "CREDITS",
        "ppoi": "0.5x0.5",
    }


def test_create_image(image_file, common_api_client1):
    data = {"image": image_file}

    response = common_api_client1.post(url(), data=data)

    assert response.status_code == 201


def test_delete_image(owned_image, common_api_client1):
    response = common_api_client1.delete(url(owned_image))

    assert response.status_code == 204


def test_delete_image_not_found_for_different_user(owned_image, common_api_client2):
    response = common_api_client2.delete(url(owned_image))

    assert response.status_code == 404


def test_list_images(image_file, common_user1, common_api_client1):
    IMAGES = 3
    ImageFactory.create_batch(size=IMAGES, image=image_file, owner=common_user1)

    response = common_api_client1.get(url())

    assert response.status_code == 200
    assert len(response.data) == IMAGES


def test_list_images_for_different_user(image_file, common_user1, common_api_client2):
    IMAGES = 3
    ImageFactory.create_batch(size=IMAGES, image=image_file, owner=common_user1)

    response = common_api_client2.get(url())

    assert response.status_code == 200
    assert len(response.data) == 0


def test_retrieve_image(owned_image, common_api_client1):
    response = common_api_client1.get(url(owned_image))

    assert response.status_code == 200


def test_retrieve_image_not_found_for_different_user(owned_image, common_api_client2):
    response = common_api_client2.get(url(owned_image))

    assert response.status_code == 404


def test_update_alt_text(owned_image, common_api_client1):
    update = {"alt_text": "ALT_TEXT"}

    response = common_api_client1.patch(url(owned_image), data=update)

    assert response.status_code == 200

    assert_data(response, update)


def test_update_alt_text_not_found_for_different_user(owned_image, common_api_client2):
    update = {"alt_text": "ALT_TEXT", "credits": "CREDITS"}

    response = common_api_client2.patch(url(owned_image), data=update)

    assert response.status_code == 404


def test_update_credits(owned_image, common_api_client1):
    update = {"credits": "CREDITS"}

    response = common_api_client1.patch(url(owned_image), data=update)

    assert response.status_code == 200

    assert_data(response, update)


def test_update_credits_not_found_for_different_user(owned_image, common_api_client2):
    update = {"credits": "CREDITS"}

    response = common_api_client2.patch(url(owned_image), data=update)

    assert response.status_code == 404


def test_update_ppoi(owned_image, common_api_client1):
    update = {"ppoi": "0.7x0.3"}

    response = common_api_client1.patch(url(owned_image), data=update)

    assert response.status_code == 200

    assert_data(response, update)


def test_update_ppoi_not_found_for_different_user(owned_image, common_api_client2):
    update = {"ppoi": "0.7x0.3"}

    response = common_api_client2.patch(url(owned_image), data=update)

    assert response.status_code == 404


def test_set_image_license(owned_image, common_api_client1, public_domain_license):
    update = {"license_id": public_domain_license.id}

    response = common_api_client1.patch(url(owned_image), data=update)

    assert response.status_code == 200

    assert_data(response, update)


def test_unset_image_license(owned_licensed_image, common_api_client1):
    update = {"license_id": None}

    response = common_api_client1.patch(url(owned_licensed_image), data=update, format="json")

    assert response.status_code == 200

    assert_data(response, update)