<?php

require_once 'ABaseTest.php';

class LitbangKajianRepositoriTest extends BaseTest {
    public $token;
    public function setUp()
    {
        parent::setUp();

        $loginInfo = $this->doLogin();
        $this->token = $loginInfo['token'];
    }

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

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

        $attachmentId14 = $this->uploadAttachment();
        $attachmentId15 = $this->uploadAttachment();
        $attachmentId16 = $this->uploadAttachment();
        $attachmentId17 = $this->uploadAttachment();
        $attachmentId18 = $this->uploadAttachment();
        $attachmentId19 = $this->uploadAttachment();

        $list = $this->listRepositori();
        $total = ((int)$list['data']['total_record'] + 1);

        $response = $this->client->request(
            'POST',
            'litbang/kajian-repositori/create',
            [
                'json' => [
                    "sektor_id" => 1,
                    "pengajuan_id" => null,
                    "tahun" => 2021,
                    "judul" => "Repositori Kajian " . $total,
                    "latar_belakang" => "Latar belakang",
                    "tujuan_penelitian" => "Tujuan penelitian",
                    "metode_pengumpulan_data" => "Metode pengumpulan data",
                    "lokasi_subyek" => "Lokasi subyek",
                    "abstrak" => "Abstrak adalah gambaran dari suatu makalah, karya tulis maupun skripsi secara singkat, padat dan mudah dipahami oleh pembaca. Abstrak berbentuk ringkasan yang menjelaskan point penting dari suatu karya tulis. Selain itu abstrak juga menjelaskan tentang ruang lingkup dan seberapa luas suatu topik akan dibahas didalamnya. Dengan begitu, pembaca akan paham dengan ide pokok didalam karya ilmiah hanya dengan membaca abstrak ini. Abstrak memiliki beberapa bagian seperti nama peneliti, nomor mahasiswa, judul penelitian, pokok/rumusan masalah, teori dan metode penelitian yang digunakan, sumber data, variabel, hasil penelitian, dan yang terakhir adalah simpulan dari penelitian tersebut.",
                    "kata_kunci" => "[\"kajian\",\"kpk\"]",
                    "kesimpulan" => "Seperti saya singgung diawal, abstrak juga memudahkan para pembaca. Semua point-point penting sudah dijelaskan di awal sehingga simpulan. Pembaca akan lebih mudah membayangkan apa saja isi dari karya ilmiah. Selain itu, jika abstrak dikemas dengan menarik, maka tentu akan mengundang rasa penasaran untuk membaca lebih lanjut. Abstrak diumpamakan seperti cover book, jika tidak menarik, tentu pembaca akan malas untuk membaca isi keseluruhan dari karya ilmiah tersebut",
                    "daftar_peneliti" => "[\"Wawan Wardiana (Direktur Litbang)\",\"Dedi Hartono (Fungsional Litbang)\"]",
                    "kontak_peneliti" => "wawan@litbang.go.id",
                    "tgl_presentasi" => "2021-08-10",
                    "tgl_publikasi" => "2021-08-10",
                    "mitra_kerjasama" => "Tidak ada",
                    "narasumber" => "Tri Hita Karana",
                    "submit_status" => "DRAFT",
                    "attachments" => [
                        ["attachment_id" => $attachmentId14, "jenis_dokumen_id" => 14],
                        ["attachment_id" => $attachmentId15, "jenis_dokumen_id" => 15],
                        ["attachment_id" => $attachmentId16, "jenis_dokumen_id" => 16],
                        ["attachment_id" => $attachmentId17, "jenis_dokumen_id" => 17],
                        ["attachment_id" => $attachmentId18, "jenis_dokumen_id" => 18],
                        ["attachment_id" => $attachmentId19, "jenis_dokumen_id" => 19],
                    ],
                    "klpds" => [
                        [
                            "instansi" => [
                                "id" => 20005
                            ],
                            "rekomendasi_list" => [
                                [
                                    "konten" => "Rekomendasi I dari Kementerian Kesehatan untuk Repositori Kajian"
                                ]
                            ]
                        ]
                    ]

                ],
                'headers' => [
                    'Authorization' => 'Bearer ' . $this->token
                ]
            ]
        );

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

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

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

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

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

        $response = $this->client->request(
            'GET',
            'litbang/kajian-repositori/detail/' . $id,
            [
                'headers' => [
                    'Authorization' => 'Bearer ' . $this->token
                ]
            ]
        );

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

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

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

        return $jsonResponse['data'];
    }

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

        // uncomment to publish
        // $data['submit_status'] = 'PUBLISHED';
        $data['judul'] = $data['judul'] . ' Edited';
        $data['tgl_presentasi'] = date('Y-m-d', strtotime($data['tgl_presentasi']));
        $data['tgl_publikasi'] = date('Y-m-d', strtotime($data['tgl_publikasi']));
        $attachments = [];
        foreach ($data['attachments'] as $attachment) {
            $attachment['jenis_dokumen_id'] = $attachment['jenis_dokumen']['id'];
            array_push($attachments, $attachment);
        }
        $data['attachments'] = $attachments;

        $response = $this->client->request(
            'POST',
            'litbang/kajian-repositori/update/' . $data['id'],
            [
                'json' => $data,
                '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,
            ["updateRepositori ...passed"]
        );

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

        return $data;
    }

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

        $this->listRepositori();

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

    #region PRIVATE
    private function uploadAttachment() {
        $filename = 'test.pdf';
        $filepath = dirname(__FILE__).'/sample-files/'.$filename;

        $response = $this->client->request(
            'POST',
            'litbang/kajian-repositori/upload',
            [
                'multipart' => [
                    [
                        'name'     => 'file[0]',
                        'contents' => fopen($filepath, 'r'),
                        'headers'  => ['Content-Type' => 'application/pdf']
                    ],
                ],
                'headers' => [
                    'Authorization' => 'Bearer ' . $this->token
                ]
            ]
        );

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

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

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

    private function listRepositori() {
        $response = $this->client->request(
            'GET',
            'litbang/kajian-repositori',
            [
                '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,
            ["indexRepositori ...passed"]
        );

        return $jsonResponse;
    }
    #endregoin
}
