<?php

require_once 'ABaseTest.php';

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

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

    public function testFetchStranasFokus() {
        $results = $this->doAPIShouldGiveSuccessResponse(
            'GET',
            'stranas/fokus',
            [
                'headers' => [
                    'Authorization' => 'Bearer ' . $this->token
                ]
            ],
            200,
            "testFetchStranasFokus Passed"
        );

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

    /**
     * @depends testFetchStranasFokus
     * @param $stranasFokus
     * @return mixed
     */
    public function testCreateSuccess($stranasFokus) {
        try {
            $results = $this->doAPIShouldGiveSuccessResponse(
                'POST',
                'stranas/aksi/create',
                [
                    'headers' => [
                        'Authorization' => 'Bearer ' . $this->token
                    ],
                    'json' => [
                        "id_fokus" => $stranasFokus['id'],
                        "nama" => "PHPUNIT",
                        "keterangan" => "Test create stranas aksi dari PHPUnit",
                        "presentase_bobot" => 100
                    ]
                ],
                200,
                "testCreateSuccess Passed"
            );

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

    /**
     * @depends testCreateSuccess
     * @param $data
     * @return mixed
     */
    public function testEditSuccess($data) {
        try {
            $this->doAPIShouldGiveSuccessResponse(
                'POST',
                'stranas/aksi/update/' . $data['id'],
                [
                    'headers' => [
                        'Authorization' => 'Bearer ' . $this->token
                    ],
                    'json' => [
                        "id_fokus" => $data['id_fokus'],
                        "nama" => "PHPUNIT EDITED",
                        "keterangan" => "Test create stranas fokus dari PHPUnit Edited",
                        "presentase_bobot" => 100
                    ]
                ],
                200,
                "testEditSuccess Passed"
            );

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

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

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

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

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

    /**
     * @depends testDeleteSuccess
     * @param $data
     */
    public function testRestoreSuccess($data) {
        try {
            $this->doAPIShouldGiveSuccessResponse(
                'POST',
                'stranas/aksi/restore/' . $data['id'],
                [
                    'headers' => [
                        'Authorization' => 'Bearer ' . $this->token,
                        'Content-Type' => 'application/json'
                    ]
                ],
                200,
                "testRestoreSuccess Passed"
            );
        } catch (Exception $e) {
            self::$messages = array_merge(self::$messages, ["testRestoreSuccess Failed", $e->getMessage()]);
        }
    }
}
