<?php

require_once 'ABaseTest.php';
class KorsupgahSurveyTest extends BaseTest
{
    const BASE_URL = "korsupgah/survey";
    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 testCreateShouldGiveSuccessResponse()
    {
        $periodes = $this->client->request('GET', 'korsupgah/periode/list', [
            'headers' => [
                'Authorization' => 'Bearer ' . $this->token
            ]
        ]);
        $periodes = \GuzzleHttp\json_decode($periodes->getBody(), true);
        $periodeId = $periodes['data']['result'][0]['id'];

        $templates = $this->client->request('GET', 'korsupgah/template/list', [
            'headers' => [
                'Authorization' => 'Bearer ' . $this->token
            ]
        ]);
        $templates = \GuzzleHttp\json_decode($templates->getBody(), true);
        $templateId = $templates['data']['result'][0]['id'];

        $instansis = $this->client->request('GET', 'instansi/', []);
        $instansis = \GuzzleHttp\json_decode($instansis->getBody(), true);
        $instansiId = $instansis['data']['result'][0]['id'];

        $res = $this->doAPIShouldGiveSuccessResponse(
            'POST',
            self::BASE_URL . '/create',
            [
                'json' => [
                    'id_periode' => $periodeId,
                    'id_instansi' => $instansiId,
                    'id_template' => $templateId,
                ],
                'headers' => [
                    'Authorization' => 'Bearer ' . $this->token
                ]
            ],
            200,
            "\ncreate Passed"
        );

        return [
            'id' => (int)$res['data']['result'][0]['id'],
            'id_periode' => $periodeId,
            'id_instansi' => $instansiId,
            'id_template' => $templateId,
            'data' => $res['data']['result'][0]
        ];
    }

    /**
     * @depends testCreateShouldGiveSuccessResponse
     * @param $data
     */
    public function testUpdateShouldGiveSuccessResponse($data)
    {
        $this->doAPIShouldGiveSuccessResponse(
            'POST',
            self::BASE_URL . '/update/' . $data['id'],
            [
                'headers' => [
                    'Authorization' => "Bearer " . $this->token
                ],
                'json' => [
                    'id_periode' => $data['id_periode'],
                    'id_instansi' => $data['id_instansi'],
                    'id_template' => $data['id_template'],
                    'keterangan' => 'Survey ini telah diubah'
                ]
            ],
            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 testSummaryShouldGiveSuccessResponse($data)
    {
        $this->doAPIShouldGiveSubsetResponse(
            'GET',
            self::BASE_URL . '/summary/' . $data['id'],
            200,
            [
                'success' => true,
                'data' => ['id' => $data['id']]
            ],
            "summary Passed",
            [
                'headers' => [
                    'Authorization'=> 'Bearer ' . $this->token
                ]
            ]
        );
    }

    /**
     * @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"
        );
    }

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

    public function testAllInstansiOverviewShouldGiveSuccessResponse()
    {
        $this->doAPIShouldGiveSuccessResponse(
            'GET',
            self::BASE_URL . '/all_instansi_overview',
            [
                'headers' => [
                    'Authorization' => "Bearer " . $this->token,
                    'Content-Type' => 'application/json'
                ]
            ],
            200,
            "all_instansi_overview Passed"
        );
    }

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

    public function testMyShouldGiveSuccessResponse()
    {
        $this->doAPIShouldGiveSuccessResponse(
            'GET',
            self::BASE_URL . '/my',
            [
                'headers' => [
                    'Authorization' => "Bearer " . $this->token,
                    'Content-Type' => 'application/json'
                ]
            ],
            200,
            "my Passed"
        );
    }

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

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

        $templates = $this->client->request('GET', 'korsupgah/template/list', [
            'headers' => [
                'Authorization' => 'Bearer ' . $this->token
            ]
        ]);
        $templates = \GuzzleHttp\json_decode($templates->getBody(), true);
        $templateId = $templates['data']['result'][0]['id'];

        $instansis = $this->client->request('GET', 'instansi?limit=5', []);
        $instansis = \GuzzleHttp\json_decode($instansis->getBody(), true);
        $instansiIds = [];
        foreach ($instansis['data']['result'] as $instansi) {
            array_push($instansiIds, $instansi['id']);
        }

        $this->doAPIShouldGiveSubsetResponse(
            'POST',
            self::BASE_URL . '/batch_create',
            200,
            [
                'success' => true
            ],
            "batch_create Passed",
            [
                'json' => [
                    'id_periode' => $periodeId,
                    'id_instansi_list' => $instansiIds,
                    'id_template' => $templateId,
                ],
                'headers' => [
                    'Authorization' => 'Bearer ' . $this->token
                ]
            ]
        );
    }

    /**
     * @depends testCreateShouldGiveSuccessResponse
     * @param $data
     * @return mixed
     */
    public function testAnswerShouldGiveSuccessResponse($data)
    {
        $res = $this->doAPIShouldGiveSuccessResponse(
            'POST',
            self::BASE_URL . '/answer',
            [
                'json' => [
                    'id_survey' => $data['id'],
                    'id_sub_indikator' => 1,
                    'nilai' => 90,
                ],
                'headers' => [
                    'Authorization' => 'Bearer ' . $this->token
                ]
            ],
            200,
            "answer Passed"
        );

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

    /**
     * @depends testAnswerShouldGiveSuccessResponse
     * @param $data
     */
    public function testUpdateAnswerShouldGiveSuccessResponse($data)
    {
        $res = $this->doAPIShouldGiveSuccessResponse(
            'POST',
            self::BASE_URL . '/update_answer/' . $data['id'],
            [
                'json' => [
                    'nilai' => 88,
                    'keterangan' => 'Answer ini telah diubah'
                ],
                'headers' => [
                    'Authorization' => 'Bearer ' . $this->token
                ]
            ],
            200,
            "answer Passed"
        );

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

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

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

    public function testAnswerByInstansi() {
        $login = $this->login(getenv("TEST_ADMIN_USERNAME"), getenv("TEST_ADMIN_PASSWORD"));
        $this->assertContains(
            [
                'success' => true
            ],
            $login
        );
        $token = $login['data']['token'];

        $surveysResponse = $this->doAPIShouldGiveSuccessResponse(
            'GET',
            "korsupgah/survey/list?limit=100&offset=0&order_direction=asc&id_provinsi=51&id_periode=18",
            [
                'headers' => [
                    'Authorization' => "Bearer " . $token
                ]
            ],
            200,
            "GET Surveys Response Passed"
        );
        $surveys = $surveysResponse['data']['result'];
        foreach ($surveys as $survey) {
            $idSurvey = $survey['id'];
            $detailSurveyResponse = $this->doAPIShouldGiveSuccessResponse(
                'GET',
                "korsupgah/survey/detail/$idSurvey",
                [
                    'headers' => [
                        'Authorization' => "Bearer " . $token
                    ]
                ],
                200,
                "GET My Survey Response Passed"
            );

            $questions = $detailSurveyResponse['data']['result'][0]['template']['questions'];
            $answers = [];
            foreach ($questions as $question) {
                $idSubIndikator = $question['id'];
                $keterangan = $question['info_nilai'];
                $skor = rand(5, 10) * rand(8, 10);
                $payload = [
                    "id_survey" => $idSurvey,
                    "id_sub_indikator" => $idSubIndikator,
                    "nilai" => $skor,
                    "keterangan" => $keterangan,
                    "deleted_attachments" => [],
                    "attachments" => [
                        '24cf8bd6-aeea-4276-838d-1d0032d21e05',
                        '91109e4d-1602-40a6-aae3-2bc175780730',
                        '8b3b8b01-cd12-4c6f-8aea-d1bb278dd8f3'
                    ],
                    "old_attachments" => []
                ];

                $answerResponse = $this->doAPIShouldGiveSuccessResponse(
                    'POST',
                    "korsupgah/survey/answer",
                    [
                        'headers' => [
                            'Authorization' => "Bearer " . $token
                        ],
                        'json' => $payload,
                    ],
                    200,
                    "POST Answer Response $idSubIndikator Passed"
                );
                $answers[] = [
                    'id' => $answerResponse['data']['result'][0]['id'],
                    'skor' => $skor
                ];
            }

//            foreach ($answers as $answer) {
//                $answerId = $answer['id'];
//                $answerSkor = $answer['skor'];
//                $payload = [
//                    "nilai_verifikasi" => $answerSkor,
//                    "keterangan_verifikasi" => "Sudah sesuai",
//                    "attachments" => []
//                ];
//                $this->doAPIShouldGiveSuccessResponse(
//                    'POST',
//                    "korsupgah/survey/verify/$answerId",
//                    [
//                        'headers' => [
//                            'Authorization' => "Bearer " . $token
//                        ],
//                        'json' => $payload,
//                    ],
//                    200,
//                    "POST Survey Verify Response $answerId Passed"
//                );
//            }
        }
    }

    public function testVerifyLastAnswerForSurvey()
    {
        $login = $this->login(getenv("TEST_ADMIN_USERNAME"), getenv("TEST_ADMIN_PASSWORD"));
        $this->assertContains(
            [
                'success' => true
            ],
            $login
        );
        $token = $login['data']['token'];

        $surveysResponse = $this->doAPIShouldGiveSuccessResponse(
            'GET',
            "korsupgah/survey/last-answers/3941",
            [
                'headers' => [
                    'Authorization' => "Bearer " . $token
                ]
            ],
            200,
            "GET Surveys Response Passed"
        );
        $answers = $surveysResponse['data']['result'];
        foreach ($answers as $answer) {
            $answerId = $answer['id'];
            $answerNilai = $answer['nilai'];
            $payload = [
                "nilai_verifikasi" => $answerNilai,
                "keterangan_verifikasi" => "Sudah sesuai",
                "attachments" => []
            ];
            $this->doAPIShouldGiveSuccessResponse(
                'POST',
                "korsupgah/survey/verify/$answerId",
                [
                    'headers' => [
                        'Authorization' => "Bearer " . $token
                    ],
                    'json' => $payload,
                ],
                200,
                "POST Survey Verify Response $answerId Passed"
            );
        }
    }

    public function testVerifyUnverifiedAnswer()
    {
        $login = $this->login(getenv("TEST_ADMIN_USERNAME"), getenv("TEST_ADMIN_PASSWORD"));
        $this->assertContains(
            [
                'success' => true
            ],
            $login
        );
        $token = $login['data']['token'];

        $surveysResponse = $this->doAPIShouldGiveSuccessResponse(
            'GET',
            "korsupgah/survey/unverified-answers?id_provinsi=51&id_template=9",
            [
                'headers' => [
                    'Authorization' => "Bearer " . $token
                ]
            ],
            200,
            "GET Surveys Response Passed"
        );
        $answers = $surveysResponse['data']['result'];
        foreach ($answers as $answer) {
            $answerId = $answer['id'];
            $answerNilai = $answer['nilai'];
            $payload = [
                "nilai_verifikasi" => $answerNilai,
                "keterangan_verifikasi" => "Sudah sesuai",
                "attachments" => []
            ];
            $this->doAPIShouldGiveSuccessResponse(
                'POST',
                "korsupgah/survey/verify/$answerId",
                [
                    'headers' => [
                        'Authorization' => "Bearer " . $token
                    ],
                    'json' => $payload,
                ],
                200,
                "POST Survey Verify Response $answerId Passed"
            );
        }
    }

    public function testGetAllPreviousAnswerAttachmentShouldGiveSuccessResponse() {
        $this->doAPIShouldGiveSuccessResponse(
            "GET",
            self::BASE_URL . '/all_prev_ans_attc/' . 522 . '/' . 1,
            [
                'headers' => [
                    'Authorization' => "Bearer " . $this->token,
                    'Content-Type' => 'application/json'
                ]
            ],
            200,
            "all_prev_ans_attc Passed"
        );
    }

    public function testGetNotifikasiShouldGiveSuccessResponse() {
        $this->doAPIShouldGiveSimpleResponse(
            "GET",
            self::BASE_URL . '/notifikasi',
            [
                'headers' => [
                    'Authorization' => "Bearer " . $this->token,
                    'Content-Type' => 'application/json'
                ]
            ],
            200,
            "notifikasi Passed"
        );
    }

    public function testGetAttachmentInlineShouldGiveSuccessResponse() {
        $this->doAPIShouldGiveSimpleResponse(
            "GET",
            self::BASE_URL . '/attachment_inline/a8738b1a-cba2-4e67-85b2-61c1ff492e89',
            [
                'query' => [
                    'is_inline' => true
                ],
                'headers' => [
                    'Authorization' => "Bearer " . $this->token,
                    'Content-Type' => 'application/json'
                ]
            ],
            200,
            "attachment_inline Passed"
        );
    }
    // todo: lanjut endpoint lain
}
