<?php

require_once 'ABaseTest.php';

class KorwilTeamsTest extends BaseTest
{
    const BASE_URL = "korwil/teams";
    protected $token;

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

    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 testCreateStatusShouldGiveSuccessResponse()
    {
        $res = $this->doAPIShouldGiveSuccessResponse(
            'POST',
            'korwil/team_member_statuses/create',
            [
                'json' => [
                    'name' => 'REGISTERED',
                ],
                'headers' => [
                    'Authorization' => 'Bearer ' . $this->token
                ]
            ],
            200,
            "\ncreate status Passed"
        );

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

    public function testCreateShouldGiveSuccessResponse()
    {
        $periodeRequest = $this->client->request('GET', 'korsupgah/periode/list', [
            'headers' => [
                'Authorization' => 'Bearer ' . $this->token
            ]
        ]);
        $periodeResponse = \GuzzleHttp\json_decode($periodeRequest->getBody(), true);
        $periodeResult = $periodeResponse['data']['result'][0];

        $res = $this->doAPIShouldGiveSuccessResponse(
            'POST',
            self::BASE_URL . '/create',
            [
                'json' => [
                    'name' => 'Team PHPUnit A',
                    'id_periode' => $periodeResult['id'],
                ],
                'headers' => [
                    'Authorization' => 'Bearer ' . $this->token
                ]
            ],
            200,
            "create 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' => [
                    'name' => 'Team PHPUnit B',
                    'id_periode' => $data['id_periode']
                ],
                '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"
        );
    }

    /**
     * @depends testCreateShouldGiveSuccessResponse
     * @param $data
     */
    public function testSyncUsersShouldGiveSuccessResponse($data)
    {
        $this->doAPIShouldGiveSubsetResponse(
            "POST",
            self::BASE_URL . '/sync_users',
            200,
            [
                'success' => true
            ],
            "sync_users Passed",
            [
                'json' => [
                    'id' => $data['id'],
                    'user_ids' => [1,2,3]
                ],
                'headers' => [
                    'Authorization' => "Bearer " . $this->token,
                    'Content-Type' => 'application/json'
                ]
            ]
        );
    }

    /**
     * @depends testCreateShouldGiveSuccessResponse
     * @param $data
     */
    public function testSyncInstansiShouldGiveSuccessResponse($data)
    {
        $this->doAPIShouldGiveSubsetResponse(
            "POST",
            self::BASE_URL . '/sync_instansi',
            200,
            [
                'success' => true
            ],
            "sync_instansi Passed",
            [
                'json' => [
                    'id' => $data['id'],
                    'instansi_ids' => [1,2,3]
                ],
                'headers' => [
                    'Authorization' => "Bearer " . $this->token,
                    'Content-Type' => 'application/json'
                ]
            ]
        );
    }

    /**
     * @depends testCreateShouldGiveSuccessResponse
     * @param $data
     * @throws \GuzzleHttp\Exception\GuzzleException
     */
    public function testUpdateMemberStatusShouldGiveSuccessResponse($data)
    {
        $headers = [
            'headers' => [
                'Authorization' => "Bearer " . $this->token,
                'Content-Type' => 'application/json'
            ]
        ];
        $member = $this->client->request('GET', self::BASE_URL . '/detail/' . $data['id'], $headers);
        $memberResponse = \GuzzleHttp\json_decode($member->getBody(), true);
        $this->assertContains(
            ["success" => true],
            $memberResponse,
            self::BASE_URL . '/detail/' . $data['id'] . ' failed'
        );
        $memberResult = $memberResponse['data']['result'][0];

        $status = $this->client->request('GET', 'korwil/team_member_statuses/list', $headers);
        $status = \GuzzleHttp\json_decode($status->getBody(), true);
        $this->assertContains(
            ['success' => true],
            $status,
            'korwil/team_member_statuses/list failed'
        );
        $status = $status['data']['result'];

        $this->doAPIShouldGiveSubsetResponse(
            "POST",
            self::BASE_URL . '/update_membership_status',
            200,
            [
                'success' => true
            ],
            "update_member_status Passed",
            [
                'json' => [
                    'team_user_id' => $memberResult['members'][0]['id'],
                    'team_member_status_id' => $status[sizeof($status) - 1]['id']
                ],
                'headers' => [
                    'Authorization' => "Bearer " . $this->token,
                    'Content-Type' => 'application/json'
                ]
            ]
        );
    }

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