import allure
import pytest
from file_helper import generate_file
from s3_helper import object_key_from_file_path

from steps import s3_gate_bucket, s3_gate_object
from steps.s3_gate_base import TestS3GateBase


def pytest_generate_tests(metafunc):
    if "s3_client" in metafunc.fixturenames:
        metafunc.parametrize("s3_client", ["aws cli", "boto3"], indirect=True)


@pytest.mark.sanity
@pytest.mark.acl
@pytest.mark.s3_gate
class TestS3GateACL(TestS3GateBase):
    @allure.title("Test S3: Object ACL")
    def test_s3_object_ACL(self, bucket, simple_object_size):
        file_path = generate_file(simple_object_size)
        file_name = object_key_from_file_path(file_path)

        with allure.step("Put object into bucket, Check ACL is empty"):
            s3_gate_object.put_object_s3(self.s3_client, bucket, file_path)
            obj_acl = s3_gate_object.get_object_acl_s3(self.s3_client, bucket, file_name)
            assert obj_acl == [], f"Expected ACL is empty, got {obj_acl}"

        with allure.step("Put object ACL = public-read"):
            s3_gate_object.put_object_acl_s3(self.s3_client, bucket, file_name, "public-read")
            obj_acl = s3_gate_object.get_object_acl_s3(self.s3_client, bucket, file_name)
            obj_permission = [permission.get("Permission") for permission in obj_acl]
            assert obj_permission == [
                "FULL_CONTROL",
                "FULL_CONTROL",
            ], "Permission for all groups is FULL_CONTROL"

        with allure.step("Put object ACL = private"):
            s3_gate_object.put_object_acl_s3(self.s3_client, bucket, file_name, "private")
            obj_acl = s3_gate_object.get_object_acl_s3(self.s3_client, bucket, file_name)
            obj_permission = [permission.get("Permission") for permission in obj_acl]
            assert obj_permission == [
                "FULL_CONTROL",
            ], "Permission for Canonical User is FULL_CONTROL"

        with allure.step(
            "Put object with grant-read uri=http://acs.amazonaws.com/groups/global/AllUsers"
        ):
            s3_gate_object.put_object_acl_s3(
                self.s3_client,
                bucket,
                file_name,
                grant_read="uri=http://acs.amazonaws.com/groups/global/AllUsers",
            )
            obj_acl = s3_gate_object.get_object_acl_s3(self.s3_client, bucket, file_name)
            obj_permission = [permission.get("Permission") for permission in obj_acl]
            assert obj_permission == [
                "FULL_CONTROL",
                "FULL_CONTROL",
            ], "Permission for all groups is FULL_CONTROL"

    @allure.title("Test S3: Bucket ACL")
    def test_s3_bucket_ACL(self):
        with allure.step("Create bucket with ACL = public-read-write"):
            bucket = s3_gate_bucket.create_bucket_s3(self.s3_client, True, acl="public-read-write")
            bucket_acl = s3_gate_bucket.get_bucket_acl(self.s3_client, bucket)
            bucket_permission = [permission.get("Permission") for permission in bucket_acl]
            assert bucket_permission == [
                "FULL_CONTROL",
                "FULL_CONTROL",
            ], "Permission for all groups is FULL_CONTROL"

        with allure.step("Change bucket ACL to private"):
            s3_gate_bucket.put_bucket_acl_s3(self.s3_client, bucket, acl="private")
            bucket_acl = s3_gate_bucket.get_bucket_acl(self.s3_client, bucket)
            bucket_permission = [permission.get("Permission") for permission in bucket_acl]
            assert bucket_permission == [
                "FULL_CONTROL"
            ], "Permission for CanonicalUser is FULL_CONTROL"

        with allure.step(
            "Change bucket acl to --grant-write uri=http://acs.amazonaws.com/groups/global/AllUsers"
        ):
            s3_gate_bucket.put_bucket_acl_s3(
                self.s3_client,
                bucket,
                grant_write="uri=http://acs.amazonaws.com/groups/global/AllUsers",
            )
            bucket_acl = s3_gate_bucket.get_bucket_acl(self.s3_client, bucket)
            bucket_permission = [permission.get("Permission") for permission in bucket_acl]
            assert bucket_permission == [
                "FULL_CONTROL",
                "FULL_CONTROL",
            ], "Permission for all groups is FULL_CONTROL"