<?php

require_once 'ABaseTest.php';

class RoleTest extends BaseTest
{
    const ADMIN_ROLE_ID = 3;
    const BASE_URL = "role";
    protected $token;
    protected $userId;

    public function setUp()
    {
        parent::setUp();
        $loginInfo = $this->doLogin();
        $this->token = $loginInfo['token'];
        $this->userId = $loginInfo['user_id'];
    }

    public function doLogin()
    {
        $login = $this->login(getenv("TEST_ADMIN_USERNAME"), getenv("TEST_ADMIN_PASSWORD"));
        $this->assertContains(
            [
                'success' => true
            ],
            $login,
            "login Failed"
        );
        return $login['data'];
    }

    public function testCreateSuccess()
    {
        $res = $this->doAPIShouldGiveSuccessResponse(
            'POST',
            self::BASE_URL . '/create',
            [
                'json' => [
                    'name' => 'role_phpunit',
                    'label' => 'Role PHPUnit Test',
                    'description' => 'Role PHPUnit Test Description'
                ],
                'headers' => [
                    'Authorization' => 'Bearer ' . $this->token
                ]
            ],
            200,
            "\ntestCreateSuccess Passed"
        );

        return $res['data']['result'][0];
    }

    /**
     * @depends testCreateSuccess
     * @param $role
     */
    public function testDetailSuccess($role)
    {
        try {
            $this->doAPIShouldGiveSuccessResponse(
                'GET',
                self::BASE_URL . '/detail/' . $role['id'],
                [
                    'headers' => [
                        'Authorization' => 'Bearer ' . $this->token
                    ]
                ],
                200,
                "testDetailSuccess Passed"
            );

            return $role;
        } catch (Exception $e) {
            self::$messages = array_merge(self::$messages, ["testDetailSuccess Failed", $e->getMessage()]);
        }
    }

    /**
     * @depends testDetailSuccess
     * @param $role
     */
    public function testUpdateSuccess($role)
    {
        try {
            $this->doAPIShouldGiveSuccessResponse(
                'POST',
                self::BASE_URL . '/update/' . $role['id'],
                [
                    'json' => [
                        'name' => $role['name'] . ' edited',
                        'label' => $role['label'] . ' edited',
                        'description' => $role['description'] . ' edited'
                    ],
                    'headers' => [
                        'Authorization' => 'Bearer ' . $this->token
                    ]
                ],
                200,
                "testUpdateSuccess Passed"
            );

            return $role;
        } catch (Exception $e) {
            self::$messages = array_merge(self::$messages, ["testUpdateSuccess Failed", $e->getMessage()]);
        }
    }

    /**
     * @depends testUpdateSuccess
     * @param $role
     * @return mixed
     */
    public function testListSuccess($role)
    {
        try {
            $this->doAPIShouldGiveSuccessResponse(
                'GET',
                self::BASE_URL . '/list',
                [
                    'headers' => [
                        'Authorization' => 'Bearer ' . $this->token
                    ]
                ],
                200,
                "testListSuccess Passed"
            );

            return $role;
        } catch (Exception $e) {
            self::$messages = array_merge(self::$messages, ["testListSuccess Failed", $e->getMessage()]);
        }
    }

    /**
     * @param $role
     * @return mixed
     * @throws \GuzzleHttp\Exception\GuzzleException
     * @depends testListSuccess
     */
    public function testAddScopesSuccess($role)
    {
        try {
            $scopesRequest = $this->client->request(
                'GET',
                'scopes/list',
                [
                    'headers' => [
                        'Authorization' => 'Bearer ' . $this->token
                    ]
                ]);
            $scope = \GuzzleHttp\json_decode($scopesRequest->getBody(), true)['data']['result'][0];

            $this->doAPIShouldGiveSubsetResponse(
                'POST',
                self::BASE_URL . '/add_scopes',
                200,
                [],
                "testAddScopesSuccess Passed",
                [
                    'json' => [
                        'id' => $role['id'],
                        'id_scopes' => [$scope['id']]
                    ],
                    'headers' => [
                        'Authorization' => 'Bearer ' . $this->token
                    ]
                ]
            );
            $role['id_scopes'] = $scope['id'];
            return $role;
        }
        catch (Exception $e) {
            self::$messages = array_merge(self::$messages, ["testAddScopesSuccess Failed", $e->getMessage()]);
        }
    }

    /**
     * @depends testAddScopesSuccess
     * @param $role
     */
    public function testSetRolesSuccess($role)
    {
        try {
            $this->doAPIShouldGiveSuccessResponse(
                'POST',
                self::BASE_URL . '/set_roles',
                [
                    'json' => [
                        'id' => $this->userId,
                        'id_roles' => [$role['id'], self::ADMIN_ROLE_ID],
                    ],
                    'headers' => [
                        'Authorization' => 'Bearer ' . $this->token
                    ]
                ],
                200,
                "testSetRolesSuccess Passed"
            );

            return $role;
        }
        catch (Exception $e) {
            self::$messages = array_merge(self::$messages, ["setRolesSuccess Failed", $e->getMessage()]);
        }
    }

    /**
     * @depends testSetRolesSuccess
     * @param $role
     * @return mixed
     */
    public function testScopesSuccess($role)
    {
        try {
            $this->doAPIShouldGiveSuccessResponse(
                'GET',
                self::BASE_URL . '/scopes/' . $role['id'],
                [
                    'headers' => [
                        'Authorization' => 'Bearer ' . $this->token
                    ]
                ],
                200,
                "testScopesSuccess Passed"
            );

            return $role;
        }
        catch (Exception $e) {
            self::$messages = array_merge(self::$messages, ["testScopesSuccess Failed", $e->getMessage()]);
        }
    }

    /**
     * @depends testScopesSuccess
     * @param $role
     * @return mixed
     */
    public function testUsersSuccess($role)
    {
        try {
            $this->doAPIShouldGiveSuccessResponse(
                'GET',
                self::BASE_URL . '/users/' . $role['id'],
                [
                    'headers' => [
                        'Authorization' => 'Bearer ' . $this->token
                    ]
                ],
                200,
                "testUsersSuccess Passed"
            );

            return $role;
        }
        catch (Exception $e) {
            self::$messages = array_merge(self::$messages, ["testUsersSuccess Failed", $e->getMessage()]);
        }
    }

    /**
     * @depends testUsersSuccess
     * @param $role
     * @return mixed
     */
    public function testRemoveScopesSuccess($role)
    {
        try {
            $this->doAPIShouldGiveSuccessResponse(
                'POST',
                self::BASE_URL . '/remove_scopes',
                [
                    'json' => [
                        'id' => $role['id'],
                        'id_scopes' => $role['id_scopes']
                    ],
                    'headers' => [
                        'Authorization' => 'Bearer ' . $this->token
                    ]
                ],
                200,
                "testRemoveScopesSuccess Passed"
            );

            return $role;
        }
        catch (Exception $e) {
            self::$messages = array_merge(self::$messages, ["testRemoveScopesSuccess Failed", $e->getMessage()]);
        }
    }
}
