<?php

require_once 'ABaseTest.php';

class PengajuanKajianDiskusiTest extends BaseTest
{
    protected $username_anggota = 'Anggota.Satgas.1.2';
    protected $username_direktur = 'Direktur.Litbang';
    protected $anggota = [];
    protected $direktur = [];

    public function setUp()
    {
        parent::setUp();

        $loginInfo = $this->doLoginAnggota();
        $this->anggota = ['token' => $loginInfo['token'], 'userId' => $loginInfo['user_id']];

        $loginInfo = $this->doLoginDirektur();
        $this->direktur = ['token' => $loginInfo['token'], 'userId' => $loginInfo['user_id']];
    }

    public function doLoginAnggota()
    {
        $login = $this->login($this->username_anggota, getenv("TEST_ADMIN_PASSWORD"));
        $this->assertContains(
            [
                'success' => true
            ],
            $login,
            "PengajuanKajianTest:doLogin ...failed"
        );
        return $login['data'];
    }

    public function doLoginDirektur()
    {
        $login = $this->login($this->username_direktur, getenv("TEST_ADMIN_PASSWORD"));
        $this->assertContains(
            [
                'success' => true
            ],
            $login,
            "PengajuanKajianTest:doLogin ...failed"
        );
        return $login['data'];
    }

    /**
     * @return integer id
     * @throws \GuzzleHttp\Exception\GuzzleException
     */
    public function testSubmitPT(): int
    {
        self::$messages = array_merge(
            self::$messages,
            ["\n--- Start Submit Pengajuan Kajian---"]
        );

        $response = $this->client->request(
            'POST',
            'litbang/kajian-pengajuan/create',
            [
                'json' => [
                    "sektor_id" => 1,
                    "jenis_id" => 1,
                    "judul" => "Laporan Tindak Lanjut Hasil Kajian Sistem Pengelolaan Komoditas Kelapa Sawit",
                    "pt_pertimbangan_pemilihan_topik" => "Pertimbangan pemilihan topik",
                    "pt_daftar_peneliti" => "[\"1. Wawan Wardiana (Direktur Litbang)\",\"2. Dedi Hartono (Fungsional Litbang)\"]",
                    "pt_kontak_peneliti" => "wawan@litbang.go.id",
                    "pt_assign_to" => $this->anggota['userId'],
                    "submit_status" => "DRAFT",
                    "attachments" => []

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

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

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

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

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

    /**
     * @param $id
     * @return mixed
     * @throws \GuzzleHttp\Exception\GuzzleException
     * @depends testSubmitPT
     */
    public function testDiskusiAnggota($id) {
        self::$messages = array_merge(
            self::$messages,
            ["\n--- Start Submit Diskusi Anggota---"]
        );

        $response = $this->client->request(
            'POST',
            'litbang/kajian-pengajuan-diskusi/create/',
            [
                'multipart' => [
                    [
                        'name' => 'kajian_pengajuan_id',
                        'contents' => $id,
                    ],
                    [
                        'name' => 'pesan',
                        'contents' => 'Test diskusi oleh ' . $this->username_anggota
                    ]

                ],
                'headers' => [
                    'Authorization' => 'Bearer ' . $this->anggota['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,
            ["litbang/kajian-pengajuan-diskusi/create ...passed"]
        );

        self::$messages = array_merge(
            self::$messages,
            ["--- End Submit Diskusi Anggota ---"]
        );

        return $id;
    }

    /**
     * @param $id
     * @return mixed
     * @throws \GuzzleHttp\Exception\GuzzleException
     * @depends testDiskusiAnggota
     */
    public function testDiskusiDirektur($id) {
        self::$messages = array_merge(
            self::$messages,
            ["\n--- Start Submit Diskusi Direktur---"]
        );

        $response = $this->client->request(
            'POST',
            'litbang/kajian-pengajuan-diskusi/create/',
            [
                'multipart' => [
                    [
                        'name' => 'kajian_pengajuan_id',
                        'contents' => $id,
                    ],
                    [
                        'name' => 'pesan',
                        'contents' => 'Test diskusi oleh ' . $this->username_direktur
                    ]

                ],
                'headers' => [
                    'Authorization' => 'Bearer ' . $this->anggota['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,
            ["litbang/kajian-pengajuan-diskusi/create ...passed"]
        );

        self::$messages = array_merge(
            self::$messages,
            ["--- End Submit Diskusi Direktur ---"]
        );

        return $id;
    }

    /**
     * @param $id
     * @return mixed
     * @throws \GuzzleHttp\Exception\GuzzleException
     * @depends testDiskusiDirektur
     */
    public function testLampiranDiskusiAnggota($id) {
        self::$messages = array_merge(
            self::$messages,
            ["\n--- Start Submit Lampiran Diskusi Anggota---"]
        );

        $filename = 'test.pdf';
        $filepath = dirname(__FILE__) . '/sample-files/' . $filename;
        $response = $this->client->request(
            'POST',
            'litbang/kajian-pengajuan-diskusi/create/',
            [
                'multipart' => [
                    [
                        'name' => 'kajian_pengajuan_id',
                        'contents' => $id,
                    ],
                    [
                        'name' => 'pesan',
                        'contents' => 'Test lampiran diskusi oleh ' . $this->username_anggota
                    ],
                    [
                        'name'     => 'lampiran',
                        'contents' => fopen($filepath, 'r'),
                        'headers'  => ['Content-Type' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet']
                    ],

                ],
                'headers' => [
                    'Authorization' => 'Bearer ' . $this->anggota['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,
            ["litbang/kajian-pengajuan-diskusi/create ...passed"]
        );

        self::$messages = array_merge(
            self::$messages,
            ["--- End Submit Lampiran Diskusi Anggota ---"]
        );

        return $id;
    }

    /**
     * @param $id
     * @throws \GuzzleHttp\Exception\GuzzleException
     * @depends testLampiranDiskusiAnggota
     */
    public function testListDiskusiByPengajuanId($id) {
        self::$messages = array_merge(
            self::$messages,
            ["\n--- Start List Diskusi By Pengajuan ---"]
        );

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

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

        self::$messages = array_merge(
            self::$messages,
            ["litbang/kajian-pengajuan-diskusi/list/".$id." ...passed"]
        );

        self::$messages = array_merge(
            self::$messages,
            ["--- End List Diskusi By Pengajuan ---"]
        );
    }
}
