<?php

require_once 'ABaseTest.php';
class KorwilAnggaranTest extends BaseTest
{
    const BASE_URL = "korwil/anggaran";
    protected $token;

    public function setUp()
    {
        parent::setUp();
        $this->token = $this->doLogin();
    }

    protected function getAnggaran()
    {
        return [
            'triwulan' => 'Triwulan 1',
            'nilai_pagu' => 96354224902,
            'hasil_penawaran' => 96051453718,
            'selisih' => 302771184
        ];
    }

    /**
     * @param $uri
     * @throws \GuzzleHttp\Exception\GuzzleException
     */
    protected function getAdditionalData($uri)
    {
        $header = [
            'headers' => [
                'Authorization' => 'Bearer ' . $this->token
            ]
        ];
        $request = $this->client->request(
            'GET',
            $uri,
            $header
        );
        $response = \GuzzleHttp\json_decode($request->getBody(), true);
        return $response['data']['result'][0];
    }

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

    public function testCreateShouldGiveSuccessResponse()
    {
        $template = $this->getAdditionalData('korsupgah/template/list');
        $periode = $this->getAdditionalData('korsupgah/periode/list');
        $instansi = $this->getAdditionalData('instansi/list');

        $res = $this->doAPIShouldGiveSuccessResponse(
            'POST',
            self::BASE_URL . '/create',
            [
                'json' => [
                    'id_template' => $template['id'],
                    'id_instansi' => $instansi['id'],
                    'id_periode' => $periode['id'],
                    'anggaran' => $this->getAnggaran()
                ],
                'headers' => [
                    'Authorization' => 'Bearer ' . $this->token
                ]
            ],
            200,
            "\ncreate Passed"
        );

        return $res['data']['result'][0];
    }

    /**
     * @depends testCreateShouldGiveSuccessResponse
     * @param $data
     * @return mixed
     */
    public function testUpdateShouldGiveSuccessResponse($data)
    {
        $this->doAPIShouldGiveSuccessResponse(
            'POST',
            self::BASE_URL . '/update/' . $data['id'],
            [
                'json' => [
                    'id_template' => $data['id_template'],
                    'id_instansi' => $data['id_instansi'],
                    'id_periode' => $data['id_periode'],
                    'anggaran' => $this->getAnggaran()
                ],
                'headers' => [
                    'Authorization' => 'Bearer ' . $this->token
                ]
            ],
            200,
            "update Passed"
        );
    }

    /**
     * @depends testCreateShouldGiveSuccessResponse
     * @param $data
     */
    public function testDetailShouldGiveSuccessResponse($data)
    {
        $this->doAPIShouldGiveSuccessResponse(
            'GET',
            self::BASE_URL . '/detail/' . $data['id'],
            [
                'headers' => [
                    'Authorization'=> 'Bearer ' . $this->token
                ]
            ],
            200,
            "detail Passed"
        );
    }

    /**
     * @depends testCreateShouldGiveSuccessResponse
     * @param $data
     */
    public function testDeleteShouldGiveSuccessResponse($data)
    {
        $this->doAPIShouldGiveSuccessResponse(
            'POST',
            self::BASE_URL . '/delete/' . $data['id'],
            [
                'headers' => [
                    'Authorization' => "Bearer " . $this->token,
                    'Content-Type' => 'application/json'
                ]
            ],
            200,
            "delete Passed"
        );
    }

    /**
     * @depends testCreateShouldGiveSuccessResponse
     * @param $data
     */
    public function testRestoreShouldGiveSuccessResponse($data)
    {
        $this->doAPIShouldGiveSuccessResponse(
            "POST",
            self::BASE_URL . '/restore/' . $data['id'],
            [
                'headers' => [
                    'Authorization' => "Bearer " . $this->token,
                    'Content-Type' => 'application/json'
                ]
            ],
            200,
            "restore Passed"
        );
    }

    public function testListShouldGiveSuccessResponse()
    {
        $this->doAPIShouldGiveSuccessResponse(
            'GET',
            self::BASE_URL . '/list',
            [
                'headers' => [
                    'Authorization'=> 'Bearer ' . $this->token
                ]
            ],
            200,
            "list Passed"
        );
    }


    /**
     * @depends testCreateShouldGiveSuccessResponse
     * @param $data
     */
    public function testUpdateVerifShouldGiveSuccessResponse($data)
    {
        $this->doAPIShouldGiveSuccessResponse(
            'POST',
            self::BASE_URL . '/updateVerif/' . $data['id'],
            [
                'json' => [
                    'anggaran_id' => $data['id'],
                    'verified_status' => 1,
                    'verified_message' => 'Sudah Diverifikasi',
                    'verificator_id' => 50
                ],
                'headers' => [
                    'Authorization' => 'Bearer ' . $this->token
                ]
            ],
            200,
            "updateVerif Passed"
        );
    }

    /**
     * @depends testCreateShouldGiveSuccessResponse
     * @param $data
     */
    public function testReportShouldGiveSuccessResponse($data)
    {
        $this->doAPIShouldGiveSuccessResponse(
            'GET',
            self::BASE_URL . '/report/' . $data['id_instansi'],
            [
                'headers' => [
                    'Authorization'=> 'Bearer ' . $this->token
                ]
            ],
            200,
            "report Passed"
        );
    }

    public function testProvinsiShouldGiveSuccessResponse()
    {
        $provinsi = $this->getAdditionalData('provinsi/list');
        $this->doAPIShouldGiveSuccessResponse(
            'GET',
            self::BASE_URL . '/provinsi/' . $provinsi['provinsi_code'],
            [
                'headers' => [
                    'Authorization'=> 'Bearer ' . $this->token
                ]
            ],
            200,
            "provinsi Passed"
        );
    }
}
