<?php
require_once 'ABaseTest.php';

class PAKUserTest extends BaseTest
{
    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
        );
        return $login['data'];
    }

    private function createRequestExpectPaginatedResponse($url)
    {
        $response = $this->client->request(
            'GET',
            $url,
            [
                'headers' => [
                    'Authorization' => 'Bearer ' . $this->token
                ]
            ]
        );

        $statusCode = $response->getStatusCode();
        $jsonResponse = json_decode($response->getBody(), TRUE);
        $this->assertEquals(200, $statusCode);
        $this->assertContains(
            [
                'success' => true
            ],
            $jsonResponse
        );
        $this->assertGreaterThan(0, $jsonResponse['data']['total_record']);

        self::$messages = array_merge(
            self::$messages,
            [$url . " ...passed"]
        );

        return $jsonResponse;
    }

    private function postRequestExpectPaginatedResponse($url, $postJson)
    {
        $response = $this->client->request(
            'POST',
            $url,
            [
                'json' => $postJson,
                'headers' => [
                    'Authorization' => 'Bearer ' . $this->token
                ]
            ]
        );

        $statusCode = $response->getStatusCode();
        $jsonResponse = json_decode($response->getBody(), TRUE);
        $this->assertEquals(200, $statusCode);
        $this->assertContains(
            [
                'success' => true
            ],
            $jsonResponse
        );

        self::$messages = array_merge(
            self::$messages,
            [$url . " ...passed"]
        );

        return $jsonResponse;
    }

    public function testRoles()
    {
        self::$messages = array_merge(
            self::$messages,
            ["\n--- Start Roles PAK User ---"]
        );

        $this->createRequestExpectPaginatedResponse('pak/user/roles');

        self::$messages = array_merge(
            self::$messages,
            ["--- End Roles PAK User ---"]
        );
    }

    public function testIndexUserSekolah()
    {
        self::$messages = array_merge(
            self::$messages,
            ["\n--- Start Index PAK User Sekolah ---"]
        );

        $this->createRequestExpectPaginatedResponse('pak/user/index?role=user_sekolah_pak');

        self::$messages = array_merge(
            self::$messages,
            ["--- End Index PAK User Sekolah ---"]
        );
    }

    public function testIndexAdmin()
    {
        self::$messages = array_merge(
            self::$messages,
            ["\n--- Start Index PAK User Admin ---"]
        );

        $this->createRequestExpectPaginatedResponse('pak/user/index?role=admin_pak,verifikator_pak,user_dinas_pak');

        self::$messages = array_merge(
            self::$messages,
            ["--- End Index PAK User Admin ---"]
        );
    }

    public function testRegisterUserDinas()
    {
        self::$messages = array_merge(
            self::$messages,
            ["\n--- Start Create PAK User Dinas ---"]
        );

        $return = $this->postRequestExpectPaginatedResponse('pak/user/register',
        [
            "confirm_password" => "password12345",
            "email" => "pak.dinas.kota.depok@mail.com",
            "id" => "",
            "id_instansi" => 542,
            "instansi" => ["label" => "Pemerintah Kota Depok", "value" => 542],
            "is_banned" => false,
            "jenis_kelamin" => "L",
            "nama" => "Pemerintah Kota Depok",
            "password" => "password12345",
            "phone" => "0812309812039",
            "roles" => ["user_dinas_pak"],
            "username" => "pak.dinas.kota.depok",
        ]);

        self::$messages = array_merge(
            self::$messages,
            ["--- End Create PAK User Dinas ---"]
        );

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

    /**
     * @depends testRegisterUserDinas
     * @return mixed
     */
    public function testUpdateUserDinas($data)
    {
        self::$messages = array_merge(
            self::$messages,
            ["\n--- Start Update PAK User Dinas ---"]
        );

        $return = $this->postRequestExpectPaginatedResponse('pak/user/update/' . $data['um_id'], [
            "email" => "pak.dinas.kota.depok@mail.com",
            "id" => 2265,
            "id_instansi" => 542,
            "instansi" => ["label" => "Pemerintah Kota Depok", "value" => 542],
            "is_banned" => false,
            "jenis_kelamin" => "L",
            "nama" => "Pemerintah Kota Depok",
            "phone" => "0812309812039",
            "roles" => ["user_dinas_pak"],
            "username" => "pak.dinas.kota.depok",
        ]);

        self::$messages = array_merge(
            self::$messages,
            ["--- End Update PAK User Dinas ---"]
        );

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

    /**
     * @depends testUpdateUserDinas
     * @param $data
     * @return mixed
     */
    public function testDetailUserDinas($data)
    {
        self::$messages = array_merge(
            self::$messages,
            ["\n--- Start Detail PAK User Dinas ---"]
        );

        $return = $this->createRequestExpectPaginatedResponse('pak/user/view/' . $data['um_id']);

        self::$messages = array_merge(
            self::$messages,
            ["--- End Detail PAK User Dinas ---"]
        );

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

    /**
     * @depends testDetailUserDinas
     * @param $data
     * @return mixed
     */
    public function testBanUserDinas($data)
    {
        self::$messages = array_merge(
            self::$messages,
            ["\n--- Start Ban PAK User Dinas ---"]
        );

        $this->createRequestExpectPaginatedResponse('pak/user/ban/' . $data['um_id']);

        self::$messages = array_merge(
            self::$messages,
            ["--- End Ban PAK User Dinas ---"]
        );

        return $data;
    }

    /**
     * @depends testBanUserDinas
     * @param $data
     * @return mixed
     */
    public function testUnbanUserDinas($data)
    {
        self::$messages = array_merge(
            self::$messages,
            ["\n--- Start Unban PAK User Dinas ---"]
        );

        $this->createRequestExpectPaginatedResponse('pak/user/unban/' . $data['um_id']);

        self::$messages = array_merge(
            self::$messages,
            ["--- End Unban PAK User Dinas ---"]
        );

        return $data;
    }

    /**
     * @depends testUnbanUserDinas
     * @param $data
     * @return mixed
     */
    public function testRegisterUserSekolah($data)
    {
        self::$messages = array_merge(
            self::$messages,
            ["\n--- Start Register PAK User Sekolah ---"]
        );

        $return = $this->postRequestExpectPaginatedResponse('pak/user/register', [
            "confirm_password" => "password12345",
            "email" => "sd.alamkebuntumbuh.depok@mail.com",
            "id" => "",
            "id_instansi" => $data['instansi']['id'],
            "instansi" => ["label" => $data['instansi']['nama'], "value" => $data['instansi']['id'], "id_kota_kabupaten" => $data['instansi']['id_kota_kabupaten'], "id_provinsi" => $data['instansi']['id_provinsi']],
            "is_banned" => false,
            "jenis_kelamin" => "L",
            "nama" => " SD ALAM KEBUN TUMBUH",
            "npsn" => "",
            "npsn_sekolah" => "69995882",
            "password" => "password12345",
            "phone" => "0819208301982",
            "roles" => ["user_sekolah_pak"],
            "sekolah" => ["label" => " SD ALAM KEBUN TUMBUH", "value" => "69995882", "kabKota" => "Kota Depok"],
            "username" => "SD.AlamKebunTumbuh.Depok",
        ]);

        self::$messages = array_merge(
            self::$messages,
            ["--- End Register PAK User Sekolah ---"]
        );

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

    /**
     * @depends testRegisterUserSekolah
     * @param $data
     * @return mixed
     */
    public function testUpdateUserSekolah($data)
    {
        self::$messages = array_merge(
            self::$messages,
            ["\n--- Start Update PAK User Sekolah ---"]
        );

        $return = $this->postRequestExpectPaginatedResponse('pak/user/update/' . $data['um_id'], [
            "email" => "sd.alamkebuntumbuh.depok@mail.com",
            "id" => $data['um_id'],
            "id_instansi" => $data['instansi']['id'],
            "instansi" => [
                "id_kota_kabupaten" => $data['instansi']['id'],
                "id_provinsi" => $data['instansi']['id_provinsi'],
                "value" => $data['instansi']['id'],
            ],
            "is_banned" => false,
            "jenis_kelamin" => "L",
            "nama" => " SD ALAM KEBUN TUMBUH",
            "npsn_sekolah" => "69995882",
            "phone" => "0819208301982",
            "roles" => ["user_sekolah_pak"],
            "sekolah" => [
                "value" => "69995882",
                "label" => " SD ALAM KEBUN TUMBUH",
                "kabKota" => "Kota Depok"
            ],
            "username" => "SD.AlamKebunTumbuh.Depok",
        ]);

        self::$messages = array_merge(
            self::$messages,
            ["--- End Update PAK User Sekolah ---"]
        );

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

    /**
     * @depends testUpdateUserSekolah
     * @param $data
     * @return mixed
     */
    public function testBanUserSekolah($data)
    {
        self::$messages = array_merge(
            self::$messages,
            ["\n--- Start Ban PAK User Sekolah ---"]
        );

        $this->createRequestExpectPaginatedResponse('pak/user/ban/' . $data['um_id']);

        self::$messages = array_merge(
            self::$messages,
            ["--- End Ban PAK User Sekolah ---"]
        );

        return $data;
    }

    /**
     * @depends testBanUserSekolah
     * @param $data
     * @return mixed
     */
    public function testUnbanUserSekolah($data)
    {
        self::$messages = array_merge(
            self::$messages,
            ["\n--- Start Unban PAK User Sekolah ---"]
        );

        $this->createRequestExpectPaginatedResponse('pak/user/unban/' . $data['um_id']);

        self::$messages = array_merge(
            self::$messages,
            ["--- End Unban PAK User Sekolah ---"]
        );

        return $data;
    }

    /**
     * @depends testUnbanUserSekolah
     * @param $data
     * @return mixed
     */
    public function testDetailUserSekolah($data)
    {
        self::$messages = array_merge(
            self::$messages,
            ["\n--- Start Detail PAK User Sekolah ---"]
        );

        $this->createRequestExpectPaginatedResponse('pak/user/view/' . $data['um_id']);

        self::$messages = array_merge(
            self::$messages,
            ["--- End Detail PAK User Sekolah ---"]
        );

        return $data;
    }
}