<?php
require_once 'ABaseTest.php';

class LitbangKajianTest extends BaseTest
{
    protected $token;
    protected $userId;

    const INSTANSI_ID = 20005; // instansi Kementerian Kesehatan

    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"]
        );
    }

    private function createRequestExpectSuccessResponse($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
        );

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

        return $jsonResponse['data'];
    }

    public function testList()
    {
        self::$messages = array_merge(
            self::$messages,
            ["\n--- Start List Litbang Kajian ---"]
        );

        $this->createRequestExpectPaginatedResponse('litbang/kajian/list');

        self::$messages = array_merge(
            self::$messages,
            ["--- End List Litbang Kajian ---"]
        );
    }

    public function testListAll()
    {
        self::$messages = array_merge(
            self::$messages,
            ["\n--- Start List All Litbang Kajian ---"]
        );

        $this->createRequestExpectPaginatedResponse('litbang/kajian/list');

        self::$messages = array_merge(
            self::$messages,
            ["--- End List All Litbang Kajian ---"]
        );
    }

    public function testDashboard() {
        self::$messages = array_merge(
            self::$messages,
            ["\n--- Start Dashboard Litbang Kajian ---"]
        );

        $this->createRequestExpectSuccessResponse('litbang/kajian/dashboard');

        self::$messages = array_merge(
            self::$messages,
            ["--- End Dashboard Litbang Kajian ---"]
        );
    }

    public function testYears()
    {
        self::$messages = array_merge(
            self::$messages,
            ["\n--- Start Years Litbang Kajian ---"]
        );

        $this->createRequestExpectPaginatedResponse('litbang/kajian/years');

        self::$messages = array_merge(
            self::$messages,
            ["--- End Years Litbang Kajian ---"]
        );
    }

    public function testRandom()
    {
        self::$messages = array_merge(
            self::$messages,
            ["\n--- Start Random Litbang Kajian ---"]
        );

        $this->createRequestExpectSuccessResponse('litbang/kajian/random');

        self::$messages = array_merge(
            self::$messages,
            ["--- End Random Litbang Kajian ---"]
        );
    }

    public function testCreate()
    {
        self::$messages = array_merge(
            self::$messages,
            ["\n--- Start Create Litbang Kajian ---"]
        );

        $url = 'litbang/kajian/create';

        $response = $this->client->request(
            'POST',
            $url,
            [
                'json' => [
                    "attachment_uuid" => null,
                    "daftar_pustaka" => "Bappeda Kabupaten Cirebon, 2014, Perencanaan Pembangunan Desa, http://www.umc.ac.id/wp- content/uploads/2014/07/Paparan-Pembangunan-Desa_.pdf\nCamargo,B. Claudia., Jacobs, Eelco, 2011, Social Accountability and its Conceptual Challenges : An analytical framework, Working Paper Serie 16, Basel Institute, https://www.baselgovernance.org/sites/collective.localhost/files/publications/biog_working_pa per_16.pdf",
                    "deskripsi" => "Tujuan pokok kajian yaitu mengidentifikasi celah korupsi serta memberikan rekomendasi untuk menutup celah korupsi dalam tiap implementasi kebijakan subsidi di bidang pertanian. Dalam pelaksanaannya, perspektif yang dipergunakan berfokus pada tiga siklus utama kebijakan publik, yaitu perencanaan, pelaksanaan dan pengawasan kebijakan.",
                    "jenis_id" => 1,
                    "judul" => "Judul",
                    "kode" => "2021092701",
                    "potensi_penyelamatan_keuangan" => "Tidak ada",
                    "sektor_id" => 1,
                    "tahun" => "2021",
                ],
                'headers' => [
                    'Authorization' => 'Bearer ' . $this->token
                ]
            ]
        );

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

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

        self::$messages = array_merge(
            self::$messages,
            ["--- End Create Litbang Kajian ---"]
        );

        return $data;
    }

    /**
     * @depends testCreate
     * @param $data
     * @return mixed
     * @throws \GuzzleHttp\Exception\GuzzleException
     */
    public function testUpdate($data)
    {
        self::$messages = array_merge(
            self::$messages,
            ["\n--- Start Update Litbang Kajian ---"]
        );

        $url = 'litbang/kajian/update/' . $data['id'];

        $response = $this->client->request(
            'POST',
            $url,
            [
                'json' => [
                    "attachment_uuid" => null,
                    "daftar_pustaka" => "Bappeda Kabupaten Cirebon, 2014, Perencanaan Pembangunan Desa, http://www.umc.ac.id/wp- content/uploads/2014/07/Paparan-Pembangunan-Desa_.pdf\nCamargo,B. Claudia., Jacobs, Eelco, 2011, Social Accountability and its Conceptual Challenges : An analytical framework, Working Paper Serie 16, Basel Institute, https://www.baselgovernance.org/sites/collective.localhost/files/publications/biog_working_pa per_16.pdf",
                    "deskripsi" => "Tujuan pokok kajian yaitu mengidentifikasi celah korupsi serta memberikan rekomendasi untuk menutup celah korupsi dalam tiap implementasi kebijakan subsidi di bidang pertanian. Dalam pelaksanaannya, perspektif yang dipergunakan berfokus pada tiga siklus utama kebijakan publik, yaitu perencanaan, pelaksanaan dan pengawasan kebijakan.",
                    "jenis_id" => 1,
                    "judul" => "Judul Edit",
                    "kode" => "2021092701",
                    "potensi_penyelamatan_keuangan" => "Tidak ada",
                    "sektor_id" => 1,
                    "tahun" => "2021",
                ],
                'headers' => [
                    'Authorization' => 'Bearer ' . $this->token
                ]
            ]
        );

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

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

        self::$messages = array_merge(
            self::$messages,
            ["--- End Update Litbang Kajian ---"]
        );

        return $data;
    }

    /**
     * @depends testUpdate
     * @param $data
     * @return mixed
     * @throws \GuzzleHttp\Exception\GuzzleException
     */
    public function testDelete($data)
    {
        self::$messages = array_merge(
            self::$messages,
            ["\n--- Start Delete Litbang Kajian ---"]
        );

        $url = 'litbang/kajian/delete/' . $data['id'];

        $response = $this->client->request(
            'POST',
            $url,
            [
                'headers' => [
                    'Authorization' => 'Bearer ' . $this->token,
                    'Content-Type' => 'application/json'
                ]
            ]
        );

        $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"]
        );

        self::$messages = array_merge(
            self::$messages,
            ["--- End Delete Litbang Kajian ---"]
        );

        return $data;
    }

    /**
     * @depends testDelete
     * @param $data
     * @return mixed
     * @throws \GuzzleHttp\Exception\GuzzleException
     */
    public function testRestore($data)
    {
        self::$messages = array_merge(
            self::$messages,
            ["\n--- Start Restore Litbang Kajian ---"]
        );

        $url = 'litbang/kajian/restore/' . $data['id'];

        $response = $this->client->request(
            'POST',
            $url,
            [
                'headers' => [
                    'Authorization' => 'Bearer ' . $this->token,
                    'Content-Type' => 'application/json'
                ]
            ]
        );

        $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"]
        );

        self::$messages = array_merge(
            self::$messages,
            ["--- End Restore Litbang Kajian ---"]
        );

        return $data;
    }

    /**
     * @depends testRestore
     * @param $data
     * @return mixed
     */
    public function testDetail($data)
    {
        self::$messages = array_merge(
            self::$messages,
            ["\n--- Start Restore Litbang Kajian ---"]
        );

        $this->createRequestExpectSuccessResponse('litbang/kajian/detail/' . $data['id']);

        self::$messages = array_merge(
            self::$messages,
            ["--- End Restore Litbang Kajian ---"]
        );

        return $data;
    }

    /**
     * @depends testDetail
     * @param $data
     * @return mixed
     * @throws \GuzzleHttp\Exception\GuzzleException
     */
    public function testAddInstansi($data)
    {
        self::$messages = array_merge(
            self::$messages,
            ["\n--- Start Add Instansi Litbang Kajian ---"]
        );

        $url = 'litbang/kajian/add-instansi/' . $data['id'];

        $response = $this->client->request(
            'POST',
            $url,
            [
                'json' => [
                    'instansi_id' => self::INSTANSI_ID
                ],
                'headers' => [
                    'Authorization' => 'Bearer ' . $this->token,
                    'Content-Type' => 'application/json'
                ]
            ]
        );

        $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 = $this->createRequestExpectSuccessResponse('litbang/kajian/detail/' . $data['id']);

        self::$messages = array_merge(
            self::$messages,
            ["--- End Add Instansi Litbang Kajian ---"]
        );

        return $return;
    }

    /**
     * @depends testAddInstansi
     * @param $data
     * @return mixed
     * @throws \GuzzleHttp\Exception\GuzzleException
     */
    public function testAddRekomendasi($data)
    {
        self::$messages = array_merge(
            self::$messages,
            ["\n--- Start Add Rekomendasi Litbang Kajian ---"]
        );

        $url = 'litbang/kajian/add-rekomendasi';

        $response = $this->client->request(
            'POST',
            $url,
            [
                'json' => [
                    'kajian_id' => $data['id'],
                    'kajian_klpd_id' => $data['klpd_list'][0]['id'],
                    'konten' => 'Konten Rekomendasi',
                    'potensi_penyelamatan_keuangan_negara' => 'Tidak ada'
                ],
                'headers' => [
                    'Authorization' => 'Bearer ' . $this->token,
                    'Content-Type' => 'application/json'
                ]
            ]
        );

        $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 = $this->createRequestExpectSuccessResponse('litbang/kajian/detail/' . $data['id']);

        self::$messages = array_merge(
            self::$messages,
            ["--- End Add Rekomendasi Litbang Kajian ---"]
        );

        return $return;
    }

    /**
     * @depends testAddRekomendasi
     * @param $data
     * @return mixed
     * @throws \GuzzleHttp\Exception\GuzzleException
     */
    public function testDeleteRekomendasi($data)
    {
        self::$messages = array_merge(
            self::$messages,
            ["\n--- Start Delete Rekomendasi Litbang Kajian ---"]
        );

        $url = 'litbang/kajian/delete-rekomendasi/' . $data['klpd_list'][0]['rekomendasi_list'][0]['id'];

        $response = $this->client->request(
            'POST',
            $url,
            [
                'json' => [
                    'kajian_id' => $data['id'],
                    'kajian_klpd_id' => $data['klpd_list'][0]['id']
                ],
                'headers' => [
                    'Authorization' => 'Bearer ' . $this->token,
                    'Content-Type' => 'application/json'
                ]
            ]
        );

        $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 = $this->createRequestExpectSuccessResponse('litbang/kajian/detail/' . $data['id']);

        self::$messages = array_merge(
            self::$messages,
            ["--- End Delete Rekomendasi Litbang Kajian ---"]
        );

        return $return;
    }

    /**
     * @depends testDeleteRekomendasi
     * @param $data
     * @return mixed
     * @throws \GuzzleHttp\Exception\GuzzleException
     */
    public function testDeleteInstansi($data)
    {
        self::$messages = array_merge(
            self::$messages,
            ["\n--- Start Delete Instansi Litbang Kajian ---"]
        );

        $url = 'litbang/kajian/delete-instansi/' . $data['id'];

        $response = $this->client->request(
            'POST',
            $url,
            [
                'json' => [
                    'instansi_id' => $data['klpd_list'][0]['instansi']['id'],
                ],
                'headers' => [
                    'Authorization' => 'Bearer ' . $this->token,
                    'Content-Type' => 'application/json'
                ]
            ]
        );

        $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 = $this->createRequestExpectSuccessResponse('litbang/kajian/detail/' . $data['id']);;

        self::$messages = array_merge(
            self::$messages,
            ["--- End Delete Instansi Litbang Kajian ---"]
        );

        return $return;
    }
}
