<?php

class ProfilDaerahTest extends BaseTest
{
    public function testImportShouldGiveSuccessResponse() {
        $filename = 'Upload_Profil_Daerah.xlsx';
        $filepath = dirname(__FILE__) . '/sample-files/' . $filename;

        $login_info = $this->login(getenv("TEST_ADMIN_USERNAME"), getenv("TEST_ADMIN_PASSWORD"));
        $this->doAPIShouldGiveSubsetResponse(
            'POST',
            'profil-daerah/import',
            200,
            [
                'success' => true
            ],
            "\nimport Passed",
            [
                'multipart' => [
                    [
                        'name'     => 'document',
                        'contents' => fopen($filepath, 'r'),
                        'headers'  => ['Content-Type' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet']
                    ],
                ],
                'headers' => [
                    'Authorization' => 'Bearer ' . $login_info['data']['token']
                ]
            ]
        );
    }

    public function testListShouldGiveSuccessResponse() {
        $this->doAPIShouldGiveSuccessResponse('GET', 'profil-daerah/list', [], 200, "\nlist Passed");
    }

    public function testListAllShouldGiveSuccessResponse() {
        $login_info = $this->login(getenv("TEST_ADMIN_USERNAME"), getenv("TEST_ADMIN_PASSWORD"));
        $this->doAPIShouldGiveSuccessResponse('GET', 'profil-daerah/list-all',
            [
                'headers' => [
                    'Authorization' => 'Bearer ' . $login_info['data']['token']
                ]
            ],
            200, "\nlist-all Passed");
    }

    public function testListAllShouldGiveErrorResponse() {
        $this->doAPIShouldGiveSubsetResponse(
            'GET',
            'profil-daerah/list-all',
            465,
            [
                'success' => false,
                'message' => "User is not allowed to perform this action"
            ],
            "list-all Not Allowed Passed");
    }

    public function testDetailByCodeShouldGiveSuccessResponse() {
        $login_info = $this->login(getenv("TEST_ADMIN_USERNAME"), getenv("TEST_ADMIN_PASSWORD"));
        $this->doAPIShouldGiveSubsetResponse(
            'GET',
            'profil-daerah/detail-by-code/31?tahun=2019',
            200,
            [
                'success' => true,
                'data' => [
                    "code_klpd" => 619
                ]
            ],
            "\ndetail-by-code Passed",
            [
                'headers' => [
                    'Authorization' => 'Bearer ' . $login_info['data']['token']
                ]
            ]
        );
    }

    public function testCreateShouldGiveSuccessResponse() {
        $login_info = $this->login(getenv("TEST_ADMIN_USERNAME"), getenv("TEST_ADMIN_PASSWORD"));
        $form = [
            [
                'name' => 'nama_wilayah',
                'contents' => 'Wilayah',
            ],
            [
                'name' => 'code_klpd',
                'contents' => '619',
            ],
            [
                'name' => 'jenis',
                'contents' => 'provinsi',
            ],
            [
                'name' => 'nama_kepala_daerah',
                'contents' => 'Nama Kepala Daerah',
            ],
            [
                'name' => 'jabatan_kepala_daerah',
                'contents' => 'Kepala Daerah',
            ],
            [
                'name' => 'nama_wakil_kepala_daerah',
                'contents' => 'Nama Wakil Kepala Daerah',
            ],
            [
                'name' => 'jabatan_wakil_kepala_daerah',
                'contents' => 'Wakil Kepala Daerah',
            ],
            [
                'name' => 'audit_bpk',
                'contents' => 'WTP',
            ],
            [
                'name' => 'keterangan_bpk',
                'contents' => 'Keterangan BPK',
            ],
            [
                'name' => 'nilai_lakip',
                'contents' => '85.5',
            ],
            [
                'name' => 'keterangan_lakip',
                'contents' => 'Keterangan Lakip',
            ],
            [
                'name' => 'nilai_ptk',
                'contents' => '95.5',
            ],
            [
                'name' => 'keterangan_ptk',
                'contents' => 'Keterangan PTK',
            ],
        ];
        $response = $this->client->request('POST', 'profil-daerah/create',
            [
                'multipart' => $form,
                'headers' => [
                    'Authorization' => 'Bearer ' . $login_info['data']['token']
                ]
            ]
        );
        $statusCode = $response->getStatusCode();
        $jsonResponse = \GuzzleHttp\json_decode($response->getBody(), TRUE);
        $this->assertEquals(200, $statusCode);
        $this->assertContains(
            [
                'success' => true,
                'data' => $form
            ],
            $jsonResponse,
            "Error create profil-daerah"
        );
        self::$messages = array_merge(self::$messages, ["\ncreate Passed"]);

        return [
            'id' => $jsonResponse['data']['id'],
            'code_klpd' => $jsonResponse['data']['code_klpd']
        ];
    }

    /**
     * @depends testCreateShouldGiveSuccessResponse
     */
    public function testViewShouldGiveSuccessResponse($data) {
        $login_info = $this->login(getenv("TEST_ADMIN_USERNAME"), getenv("TEST_ADMIN_PASSWORD"));
        $this->doAPIShouldGiveSubsetResponse(
            'GET',
            'profil-daerah/view/' . $data['id'],
            200,
            [
                'success' => true,
                'data' => [
                    "id" => (int) $data['id']
                ]
            ],
            "\nview Passed",
            [
                'headers' => [
                    'Authorization' => 'Bearer ' . $login_info['data']['token']
                ]
            ]
        );
    }

    /**
     * @depends testCreateShouldGiveSuccessResponse
     */
    public function testDetailByCodeKlpdShouldGiveSuccessResponse($data) {
        $login_info = $this->login(getenv("TEST_ADMIN_USERNAME"), getenv("TEST_ADMIN_PASSWORD"));
        $this->doAPIShouldGiveSubsetResponse(
            'GET',
            'profil-daerah/detail-by-code-klpd/' . $data['code_klpd'] . '?tahun=2019',
            200,
            [
                'success' => true,
                'data' => [
                    "code_klpd" => (int) $data['code_klpd']
                ]
            ],
            "\ndetail-by-code-klpd Passed",
            [
                'headers' => [
                    'Authorization' => 'Bearer ' . $login_info['data']['token']
                ]
            ]
        );
    }

    /**
     * @depends testCreateShouldGiveSuccessResponse
     * @return array
     * @throws \GuzzleHttp\Exception\GuzzleException
     */
    public function testUpdateGiveSuccessResponse($data) {
        $login_info = $this->login(getenv("TEST_ADMIN_USERNAME"), getenv("TEST_ADMIN_PASSWORD"));
        $form = [
            [
                'name' => 'nama_wilayah',
                'contents' => 'Wilayah Edit',
            ],
            [
                'name' => 'code_klpd',
                'contents' => '619',
            ],
            [
                'name' => 'jenis',
                'contents' => 'kota',
            ],
            [
                'name' => 'nama_kepala_daerah',
                'contents' => 'Nama Kepala Daerah Edit',
            ],
            [
                'name' => 'jabatan_kepala_daerah',
                'contents' => 'Kepala Daerah Edit',
            ],
            [
                'name' => 'nama_wakil_kepala_daerah',
                'contents' => 'Nama Wakil Kepala Daerah Edit',
            ],
            [
                'name' => 'jabatan_wakil_kepala_daerah',
                'contents' => 'Wakil Kepala Daerah Edit',
            ],
            [
                'name' => 'audit_bpk',
                'contents' => 'WTE',
            ],
            [
                'name' => 'keterangan_bpk',
                'contents' => 'Keterangan BPK Edit',
            ],
            [
                'name' => 'nilai_lakip',
                'contents' => '85.8',
            ],
            [
                'name' => 'keterangan_lakip',
                'contents' => 'Keterangan Lakip Edit',
            ],
            [
                'name' => 'nilai_ptk',
                'contents' => '95.9',
            ],
            [
                'name' => 'keterangan_ptk',
                'contents' => 'Keterangan PTK Edit',
            ],
        ];
        $response = $this->client->request('POST', 'profil-daerah/update/' . $data['id'],
            [
                'multipart' => $form,
                'headers' => [
                    'Authorization' => 'Bearer ' . $login_info['data']['token']
                ]
            ]
        );
        $statusCode = $response->getStatusCode();
        $jsonResponse = \GuzzleHttp\json_decode($response->getBody(), TRUE);
        $this->assertEquals(200, $statusCode);
        $this->assertContains(
            [
                'success' => true,
                'data' => $form
            ],
            $jsonResponse,
            "Error update profil-daerah"
        );
        self::$messages = array_merge(self::$messages, ["\nupdate Passed"]);

        return [
            'id' => $jsonResponse['data']['id'],
            'code_klpd' => $jsonResponse['data']['code_klpd'],
            'token' => $login_info['data']['token']
        ];
    }

    /**
     * @depends testUpdateGiveSuccessResponse
     */
    public function testDeleteGiveSuccessResponse($data) {
        $response = $this->client->request('POST', 'profil-daerah/delete/' . $data['id'],
            [
                'headers' => [
                    'Authorization' => 'Bearer ' . $data['token'],
                    'Content-Type' => 'application/json'
                ]
            ]
        );
        $statusCode = $response->getStatusCode();
        $jsonResponse = \GuzzleHttp\json_decode($response->getBody(), TRUE);
        $this->assertEquals(200, $statusCode);
        $this->assertContains(
            [
                'success' => true,
                'data' => [
                    'id' => (int)$data['id']
                ]
            ],
            $jsonResponse,
            "Error delete profil-daerah"
        );
        self::$messages = array_merge(self::$messages, ["\ndelete Passed"]);
    }

    /**
     * @depends testUpdateGiveSuccessResponse
     */
    public function testRestoreGiveSuccessResponse($data) {
        $response = $this->client->request('POST', 'profil-daerah/restore/' . $data['id'],
            [
                'headers' => [
                    'Authorization' => 'Bearer ' . $data['token'],
                    'Content-Type' => 'application/json'
                ]
            ]
        );
        $statusCode = $response->getStatusCode();
        $jsonResponse = \GuzzleHttp\json_decode($response->getBody(), TRUE);
        $this->assertEquals(200, $statusCode);
        $this->assertContains(
            [
                'success' => true,
                'data' => [
                    'id' => (int)$data['id']
                ]
            ],
            $jsonResponse,
            "Error restore profil-daerah"
        );
        self::$messages = array_merge(self::$messages, ["\nrestore Passed"]);
    }
}
