<?php

require_once 'ABaseTest.php';

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

    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,
            "StranasTargetTest:login Failed"
        );
        return $login['data'];
    }

    public function testIndexSuccess() {
        try {
            $this->doAPIShouldGiveSuccessResponse(
                'GET',
                'stranas/target',
                [
                    'headers' => [
                        'Authorization' => 'Bearer ' . $this->token
                    ]
                ],
                200,
                "\ntestIndexSuccess Passed"
            );
        } catch (Exception $e) {
            self::$messages = array_merge(self::$messages, ["testIndexSuccess Failed", $e->getMessage()]);
        }
    }

    /**
     * @param $data
     * @return array
     */
    public function testFetchUkuranKeberhasilan() {
        $results = $this->doAPIShouldGiveSuccessResponse(
            'GET',
            'stranas/ukuran_keberhasilan',
            [
                'headers' => [
                    'Authorization' => 'Bearer ' . $this->token
                ]
            ],
            200,
            "testFetchUkuranKeberhasilan Passed"
        );

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

    /**
     * @depends testFetchUkuranKeberhasilan
     * @param $data
     * @return mixed
     */
    public function testCreateSuccess($data) {
        $results = $this->doAPIShouldGiveSuccessResponse(
            'POST',
            'stranas/target/create',
            [
                'headers' => [
                    'Authorization' => 'Bearer ' . $this->token
                ],
                'json' => [
                    "id_subaksi" => $data['id_subaksi'],
                    "id_ukuran_keberhasilan" => $data['id'],
                    "keterangan" => "Test create stranas target dari PHPUnit",
                    "presentase_bobot" => 100
                ]
            ],
            200,
            "testCreateSuccess Passed"
        );

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

    /**
     * @depends testCreateSuccess
     * @param $data
     * @return mixed
     */
    public function testEditSuccess($data) {
        $this->doAPIShouldGiveSuccessResponse(
            'POST',
            'stranas/target/update/' . $data['id'],
            [
                'headers' => [
                    'Authorization' => 'Bearer ' . $this->token
                ],
                'json' => [
                    "id_subaksi" => $data['id_subaksi'],
                    "id_ukuran_keberhasilan" => $data['id_ukuran_keberhasilan'],
                    "keterangan" => "Test edit stranas target dari PHPUnit",
                    "presentase_bobot" => 100
                ]
            ],
            200,
            "testEditSuccess Passed"
        );

        return $data;
    }

    /**
     * @depends testEditSuccess
     * @param $data
     * @return mixed
     */
    public function testDetailSuccess($data) {
        $results = $this->doAPIShouldGiveSuccessResponse(
            'GET',
            'stranas/target/detail/' . $data['id'],
            [
                'headers' => [
                    'Authorization' => 'Bearer ' . $this->token
                ]
            ],
            200,
            "testDetailSuccess Passed"
        );
        $result = $results['data']['result'][0];
        $this->assertEquals($result['id'], $data['id']);
        return $data;
    }

    /**
     * @depends testDetailSuccess
     * @param $data
     * @return mixed
     */
    public function testDeleteSuccess($data) {
        $this->doAPIShouldGiveSuccessResponse(
            'POST',
            'stranas/target/delete/' . $data['id'],
            [
                'headers' => [
                    'Authorization' => 'Bearer ' . $this->token,
                    'Content-Type' => 'application/json'
                ],
            ],
            200,
            "testDeleteSuccess Passed"
        );

        return $data;
    }

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