<?php

require_once 'ABaseTest.php';

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

    public function testIndexSuccess()
    {
        $this->doAPIShouldGiveSuccessResponse(
            'GET',
            'stranas/_periode',
            [
                'headers' => [
                    'Authorization' => 'Bearer ' . $this->token
                ]
            ],
            200,
            "\ntestIndexSuccess Passed"
        );
    }

    public function testCreateSuccess()
    {
        $results = $this->doAPIShouldGiveSuccessResponse(
            'POST',
            'stranas/_periode/create',
            [
                'headers' => [
                    'Authorization' => 'Bearer ' . $this->token
                ],
                'json' => [
                    'yearstart' => '2021',
                    'level1' => 'Level 1',
                    'level2' => 'Level 2',
                    'level3' => 'Level 3',
                    'level4' => 'Level 4',
                    'is_active' => false
                ]
            ],
            200,
            "testCreateSuccess Passed"
        );

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

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

        return $data;
    }

    /**
     * @depends testDetailSuccess
     * @param $data
     * @return mixed
     */
    public function testUpdateSuccess($data)
    {
        $results = $this->doAPIShouldGiveSuccessResponse(
            'POST',
            'stranas/_periode/update/' . $data['id'],
            [
                'headers' => [
                    'Authorization' => 'Bearer ' . $this->token
                ],
                'json' => [
                    'yearstart' => $data['yearstart'],
                    'level1' => $data['level1'] . ' Edit',
                    'level2' => $data['level2'] . ' Edit',
                    'level3' => $data['level3'] . ' Edit',
                    'level4' => $data['level4'] . ' Edit',
                    'is_active' => false
                ]
            ],
            200,
            "testUpdateSuccess Passed"
        );

        $this->assertEquals($data['yearstart'], $results['data']['result'][0]['yearstart']);
        $this->assertEquals($data['level1'] . ' Edit', $results['data']['result'][0]['level1']);
        $this->assertEquals($data['level2'] . ' Edit', $results['data']['result'][0]['level2']);
        $this->assertEquals($data['level3'] . ' Edit', $results['data']['result'][0]['level3']);
        $this->assertEquals($data['level4'] . ' Edit', $results['data']['result'][0]['level4']);

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

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

        $this->assertEquals((int)$data['is_active'] ? 0 : 1, (int)$results['data']['result'][0]['is_active']);

        return $data;
    }

    /**
     * @depends testToggleActiveSuccess
     * @param $data
     * @throws Exception
     */
    public function testUpdateTriwulan($data) {
        $listPeriode = $this->doAPIShouldGiveSuccessResponse(
            'GET',
            'stranas/_periode',
            [
                'headers' => [
                    'Authorization' => 'Bearer ' . $this->token
                ]
            ],
            200,
            ""
        );
        $resultPeriode = $listPeriode['data']['result'];
        $rowPeriode = $resultPeriode[sizeof($resultPeriode) - 1];
        $triwulans = $rowPeriode['triwulan'];
        $triwulan = $triwulans[sizeof($triwulans) - 1];

        $started = new DateTime($triwulan['started_at']);
        $started->setTime(2, 30, 30);

        $ended = new DateTime($triwulan['ended_at']);
        $ended->setTime(2, 30, 30);

        $verification_started_at = new DateTime($triwulan['verification_started_at']);
        $verification_started_at->setTime(2, 30, 30);

        $verification_ended_at = new DateTime($triwulan['verification_ended_at']);
        $verification_ended_at->setTime(2, 30, 30);

        $this->doAPIShouldGiveSuccessResponse(
            'POST',
            'stranas/_periode/updateTriwulan/' . $triwulan['id'],
            [
                'headers' => [
                    'Authorization' => 'Bearer ' . $this->token
                ],
                'json' => [
                    'started_at' => $started->format('Y-m-d H:i:s'),
                    'ended_at' => $ended->format('Y-m-d H:i:s'),
                    'verification_started_at' => $verification_started_at->format('Y-m-d H:i:s'),
                    'verification_ended_at' => $verification_ended_at->format('Y-m-d H:i:s')
                ]
            ],
            200,
            "testUpdateTriwulan Passed"
        );

        return $data;
    }

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

        $this->assertNotEquals(null, $result['deleted_at']);
    }
}