<?php

class KorsupgahTemplateTest extends BaseTest
{
    const BASE_URL = "korsupgah/template";
    public function testLogin()
    {
        $login = $this->login(getenv("TEST_ADMIN_USERNAME"), getenv("TEST_ADMIN_PASSWORD"));
        $this->assertContains(
            [
                'success' => true
            ],
            $login,
            "\nlogin Failed"
        );
        return $login['data']['token'];
    }

    /**
     * @depends testLogin
     * @param $token
     * @return array
     */
    public function testCreateShouldGiveSuccessResponse($token)
    {
        $res = $this->doAPIShouldGiveSuccessResponse(
            'POST',
            self::BASE_URL . '/create',
            [
                'json' => [
                    'nama' => 'Nama Template'
                ],
                'headers' => [
                    'Authorization' => 'Bearer ' . $token
                ]
            ],
            200,
            "\ncreate Passed"
        );

        return [
            'id' => (int)$res['data']['result'][0]['id'],
            'data' => $res['data']['result'][0],
            'token' => $token
        ];
    }

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

    /**
     * @depends testCreateShouldGiveSuccessResponse
     * @param $data
     */
    public function testUpdateShouldGiveSuccessResponse($data)
    {
        $this->doAPIShouldGiveSuccessResponse(
            'POST',
            self::BASE_URL . '/update/' . $data['id'],
            [
                'headers' => [
                    'Authorization' => "Bearer " . $data['token']
                ],
                'json' => [
                    'nama' => 'Nama Template Edited'
                ]
            ],
            200,
            "\nupdate Passed"
        );
    }

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

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

    /**
     * @depends testLogin
     * @param $token
     */
    public function testListShouldGiveSuccessResponse($token)
    {
        $this->doAPIShouldGiveSuccessResponse(
            'GET',
            self::BASE_URL . '/list',
            [
                'headers' => [
                    'Authorization' => "Bearer " . $token,
                    'Content-Type' => 'application/json'
                ]
            ],
            200,
            "\nlist Passed"
        );
    }

    /**
     * @depends testLogin
     * @param $token
     */
    public function testListWithAreaIntervensiShouldGiveSuccessResponse($token)
    {
        $this->doAPIShouldGiveSuccessResponse(
            'GET',
            self::BASE_URL . '/list_with_area_intervensi',
            [
                'headers' => [
                    'Authorization' => "Bearer " . $token,
                    'Content-Type' => 'application/json'
                ]
            ],
            200,
            "list_with_area_intervensi Passed"
        );
    }

    /**
     * @depends testLogin
     * @param $token
     * @return mixed
     */
    public function testAddQuestionShouldGiveSuccessResponse($token)
    {
        $templates = $this->doAPIShouldGiveSuccessResponse(
            'GET',
            'korsupgah/template/list',
            [
                'headers' => [
                    'Authorization' => 'Bearer ' . $token
                ]
            ],
            200,
            ''
        );
        $templateId = $templates['data']['result'][0]['id'];

        $subIndikators = $this->doAPIShouldGiveSuccessResponse(
            'GET',
            'korsupgah/sub_indikator/list',
            [
                'headers' => [
                    'Authorization' => 'Bearer ' . $token
                ]
            ],
            200,
            ''
        );
        $subIndikatorId = $subIndikators['data']['result'][0]['id'];

        $res = $this->doAPIShouldGiveSuccessResponse(
            'POST',
            self::BASE_URL . '/add_question',
            [
                'json' => [
                    'id' => (int)$templateId,
                    'id_sub_indikator' => (int)$subIndikatorId
                ],
                'headers' => [
                    'Authorization' => 'Bearer ' . $token
                ]
            ],
            200,
            "\naddQuestion Passed"
        );

        return [
            'data' => $res['data']['result'][0],
            'token' => $token
        ];
    }

    /**
     * @depends testAddQuestionShouldGiveSuccessResponse
     * @param $data
     */
    public function testAddQuestionShouldGiveInvalidRequestResponse1($data)
    {
        $this->doAPIShouldGiveSubsetResponse(
            'POST',
            self::BASE_URL . '/add_question',
            461,
            [
                'success' => false
            ],
            "addQuestion invalid request:duplicate sub indikator Passed",
            [
                'json' => [
                    'id' => (int)$data['data']['id_template'],
                    'id_sub_indikator' => (int)$data['data']['id_sub_indikator']
                ],
                'headers' => [
                    'Authorization' => 'Bearer ' . $data['token']
                ]
            ]
        );
    }

    /**
     * @depends testLogin
     * @param $token
     */
    public function testAddQuestionShouldGiveInvalidRequestResponse2($token)
    {
        $this->doAPIShouldGiveSubsetResponse(
            'POST',
            self::BASE_URL . '/add_question',
            461,
            [
                'success' => false
            ],
            "addQuestion invalid request:template not found Passed",
            [
                'json' => [
                    'id' => 99999,
                    'id_sub_indikator' => 1
                ],
                'headers' => [
                    'Authorization' => 'Bearer ' . $token
                ]
            ]
        );
    }

    /**
     * @depends testLogin
     * @param $token
     */
    public function testAddQuestionShouldGiveInvalidRequestResponse3($token)
    {
        $this->doAPIShouldGiveSubsetResponse(
            'POST',
            self::BASE_URL . '/add_question',
            461,
            [
                'success' => false
            ],
            "addQuestion invalid request:sub indikator not found Passed",
            [
                'json' => [
                    'id' => 1,
                    'id_sub_indikator' => 99999
                ],
                'headers' => [
                    'Authorization' => 'Bearer ' . $token
                ]
            ]
        );
    }

    /**
     * @depends testLogin
     * @param $token
     * @return mixed
     */
    public function testAddQuestionsShouldGiveSuccessResponse($token)
    {
        $templates = $this->doAPIShouldGiveSuccessResponse(
            'GET',
            'korsupgah/template/list',
            [
                'headers' => [
                    'Authorization' => 'Bearer ' . $token
                ]
            ],
            200,
            ''
        );
        $templateId = $templates['data']['result'][1]['id'];

        $subIndikators = $this->doAPIShouldGiveSuccessResponse(
            'GET',
            'korsupgah/sub_indikator/list',
            [
                'headers' => [
                    'Authorization' => 'Bearer ' . $token
                ]
            ],
            200,
            ''
        );
        $subIndikatorIds = [];
        foreach ($subIndikators['data']['result'] as $datum) {
            array_push($subIndikatorIds, $datum['id']);
        }

        $this->doAPIShouldGiveSubsetResponse(
            'POST',
            self::BASE_URL . '/add_questions',
            200,
            [
                'success' => true
            ],
            "\naddQuestions Passed",
            [
                'json' => [
                    'id' => (int)$templateId,
                    'id_sub_indikator_list' => $subIndikatorIds
                ],
                'headers' => [
                    'Authorization' => 'Bearer ' . $token
                ]
            ]
        );
    }

    /**
     * @depends testAddQuestionShouldGiveSuccessResponse
     * @param $data
     */
    public function testRemoveQuestionShouldGiveSuccessResponse($data)
    {
        $this->doAPIShouldGiveSuccessResponse(
            'POST',
            self::BASE_URL . '/remove_question',
            [
                'headers' => [
                    'Authorization' => 'Bearer ' . $data['token']
                ],
                'json' => [
                    'id' => $data['data']['id_template'],
                    'id_sub_indikator' => $data['data']['id_sub_indikator']
                ]
            ],
            200,
            "\nremoveQuestion Passed"
        );
    }

    // todo: lanjut endpoint lain
}