<?php

require_once 'ABaseTest.php';

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

    const USERNAME_PELAPOR = 'user1.mail.com';

    public function setUp()
    {
        parent::setUp();
        $loginInfo = $this->doLogin();
        $this->token = $loginInfo['token'];
        $this->userId = $loginInfo['user_id'];
    }

    public function getHeader()
    {
        return ['headers' => [
            'Authorization' => 'Bearer ' . $this->token
        ]];
    }

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

    public function testIndexSuccess() {
        try {
            $results  = $this->doAPIListShouldSuccess('lapor', $this->getHeader());
            return $results['data']['result'];
        }
        catch (Exception $e) {
            self::$messages = array_merge(self::$messages, ["testIndexSuccess Failed", $e->getMessage()]);
        }
    }

    /**
     * @depends testIndexSuccess
     * @param $results
     * @return mixed
     */
    public function testLoginUserPelaporSuccess($results) {
        $lapor = $results[0];
        $username = 'user' . $lapor['user']['um_id'] . '@mail.com';
        $login = $this->login($username, getenv("TEST_ADMIN_PASSWORD"));
        $this->assertContains(
            [
                'success' => true
            ],
            $login,
            "testLoginUserPelaporSuccess Failed"
        );

        $lapor['login'] = [
            'token' => $login['data']['token'],
            'userId' => $login['data']['user_id']
        ];
        return $lapor;
    }

    /**
     * @depends testLoginUserPelaporSuccess
     * @param $lapor
     */
    public function testDetailSuccess($lapor) {
        try {
            $this->doAPIListShouldSuccess(
                'lapor/detail?id_diskusi=' . $lapor['diskusi']['id'],
                [
                    'headers' => [
                        'Authorization' => 'Bearer ' . $lapor['login']['token']
                    ]
                ]
            );
        } catch (Exception $e) {
            self::$messages = array_merge(self::$messages, ["testDetailSuccess Failed", $e->getMessage()]);
        }
    }

    public function testKategoriSuccess() {
        try {
            return $this->doAPIListShouldSuccess('lapor/kategori');
        } catch (Exception $e) {
            self::$messages = array_merge(self::$messages, ["testKategoriSuccess Failed", $e->getMessage()]);
        }
    }

    public function testUserCategoryListSuccess() {
        try {
            $this->doAPIListShouldSuccess('lapor/user_category_list');
        } catch (Exception $e) {
            self::$messages = array_merge(self::$messages, ["testUserCategoryListSuccess Failed", $e->getMessage()]);
        }
    }

    /**
     * @depends testKategoriSuccess
     * @throws \GuzzleHttp\Exception\GuzzleException
     */
    public function testCreateSuccess($kategoris) {
        // local notes: disable bg notif
        try {
            $diskusiRequest = $this->client->request(
                'GET',
                'diskusi/kumpulan'
            );
            $diskusi = \GuzzleHttp\json_decode($diskusiRequest->getBody(), true)['data']['result'][0];
            $kategori = $kategoris['data']['result'][0];
            $header = $this->getHeader();
            $header['json'] = [
                'id_diskusi' => $diskusi['id'],
                'id_kategori' => $kategori['id'],
                'isi' => $kategori['keterangan']
            ];
            $result = $this->doAPIShouldGiveSuccessResponse(
                'POST',
                'lapor',
                $header,
                200,
                "testCreateSuccess Passed"
            );

            return $result['data']['result'][0];
        } catch (Exception $e) {
            self::$messages = array_merge(self::$messages, ["testCreateSuccess Failed", $e->getMessage()]);
        }
    }

    /**
     * @depends testCreateSuccess
     * @param $lapor
     * const STATUS_INIT = 0;
     * const STATUS_DISETUJUI = 1;
     * const STATUS_DITOLAK = 2;
     * const STATUS_DITINDAKLANJUTI = 3;
     * const TYPE_DISKUSI = 100;
     * const TYPE_KOMENTAR = 101;
     */
    public function testFollowUpSuccess($lapor) {
        // local notes: disable bg notif
        try {
            $header = $this->getHeader();
            $header['json'] = [
                'status' => 2,
                'id' => $lapor['id']
            ];
            $this->doAPIShouldGiveSuccessResponse(
                'POST',
                'lapor/follow_up',
                $header,
                200,
                'testFollowUpSuccess Passed'
            );

            return $lapor;
        } catch (Exception $e) {
            self::$messages = array_merge(self::$messages, ["testFollowUpSuccess Failed", $e->getMessage()]);
        }
    }

    /**
     * @depends testFollowUpSuccess
     * @param $lapor
     */
    public function testBatchFollowUpSuccess($lapor) {
        // local notes: disable bg notif
        try {
            $header = $this->getHeader();
            $header['json'] = [
                'status' => 3,
                'ids' => [$lapor['id']]
            ];
            $this->doAPIShouldGiveSuccessResponse(
                'POST',
                'lapor/batch_follow_up',
                $header,
                200,
                'testBatchFollowUpSuccess Passed'
            );
        } catch (Exception $e) {
            self::$messages = array_merge(self::$messages, ["testBatchFollowUpSuccess Failed", $e->getMessage()]);
        }
    }
}
