<?php
require_once 'ABaseTest.php';

class PAKIsianSekolahTest extends BaseTest {
    const BASE_URL = "pak/isiansekolah";

    protected $token;
    protected $tokenVerifikator;
    protected $userId;

    const USER_SEKOLAH = "SD.AlamKebunTumbuh.Depok";
    const USER_VERIFIKATOR = "pak.dinas.kota.depok";

    public function setUp()
    {
        parent::setUp();
        $loginInfo = $this->doLogin();
        $this->token = $loginInfo['token'];
        $this->userId = $loginInfo['user_id'];

        $loginInfo = $this->doLogin(self::USER_VERIFIKATOR);
        $this->tokenVerifikator = $loginInfo['token'];
    }

    public function doLogin($username = self::USER_SEKOLAH)
    {
        $login = $this->login($username, getenv("TEST_ADMIN_PASSWORD"));
        $this->assertContains(
            [
                'success' => true
            ],
            $login
        );
        return $login['data'];
    }

    private function createRequestExpectPaginatedResponse($url, $token = null)
    {
        if (!$token) $token = $this->token;
        $response = $this->client->request(
            'GET',
            $url,
            [
                'headers' => [
                    'Authorization' => 'Bearer ' . $token
                ]
            ]
        );

        $statusCode = $response->getStatusCode();
        $jsonResponse = json_decode($response->getBody(), TRUE);
        $this->assertEquals(200, $statusCode);
        $this->assertContains(
            [
                'success' => true
            ],
            $jsonResponse
        );
        $this->assertGreaterThan(0, $jsonResponse['data']['total_record']);

        self::$messages = array_merge(
            self::$messages,
            [$url . " ...passed"]
        );

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

    private function postRequestExpectPaginatedResponse($url, $postJson, $token = null)
    {
        if (!$token) $token = $this->token;
        $response = $this->client->request(
            'POST',
            $url,
            [
                'json' => $postJson,
                'headers' => [
                    'Authorization' => 'Bearer ' . $token,
                    'Content-Type' => 'application/json'
                ]
            ]
        );

        $statusCode = $response->getStatusCode();
        $jsonResponse = json_decode($response->getBody(), TRUE);
        $this->assertEquals(200, $statusCode);
        $this->assertContains(
            [
                'success' => true
            ],
            $jsonResponse
        );

        self::$messages = array_merge(
            self::$messages,
            [$url . " ...passed"]
        );

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

    private function postUploadFile($url, $multipart)
    {
        $response = $this->client->request(
            'POST',
            $url,
            [
                'multipart' => $multipart,
                'headers' => [
                    'Authorization' => 'Bearer ' . $this->token
                ]
            ]
        );

        $statusCode = $response->getStatusCode();
        $jsonResponse = json_decode($response->getBody(), TRUE);
        $this->assertEquals(200, $statusCode);
        $this->assertContains(
            [
                'success' => true
            ],
            $jsonResponse,
            $url . " ...failed"
        );

        self::$messages = array_merge(
            self::$messages,
            [$url . " ...passed"]
        );

        return $jsonResponse['data']['result'][0]['id'];
    }

    private function doUploadDoc()
    {
        $filename = 'test.pdf';
        $filepath = dirname(__FILE__).'/sample-files/'.$filename;
        return $this->postUploadFile('pak/isiansekolah/attachment/upload-doc', [
            [
                'name'     => 'file[0]',
                'contents' => fopen($filepath, 'r'),
                'headers'  => ['Content-Type' => 'application/pdf']
            ]
        ]);
    }

    private function doUploadImage()
    {
        $filename = 'file.png';
        $filepath = dirname(__FILE__).'/sample-files/'.$filename;
        return $this->postUploadFile('pak/isiansekolah/attachment/upload-image', [
            [
                'name'     => 'file[0]',
                'contents' => fopen($filepath, 'r'),
                'headers'  => ['Content-Type' => 'multipart/form-data']
            ]
        ]);
    }

    private function doCreateIsianSekolah()
    {
        $docId = $this->doUploadDoc();
        $imgId = $this->doUploadImage();

        $url = 'pak/isiansekolah/create';
        $return = $this->postRequestExpectPaginatedResponse($url, [
            "deskripsi" => "Kegiatan PAK SD Alam Kebun Tumbuh 2019 - 2020",
            "detail" => [
                [
                    "deskripsi" => "Metode insersi pada mata pelajaran Bahasa Indonesia",
                    "documents" => [["attachment_id" => $docId]],
                    "documentsFile" => [[]],
                    "id" => null,
                    "images" => [["attachment_id" => $imgId]],
                    "imagesFile" => [[]],
                    "kelas" => "6",
                    "link_blog" => "",
                    "link_facebook" => "",
                    "link_youtube" => "",
                    "mata_pelajaran" => "Bahasa Indonesia",
                    "metode_id" => 1,
                    "tgl_penerapan" => "2019-06-06",
                ]
            ],
            "id" => "",
            "tahun_ajaran" => "2019-2020",
        ]);

        self::$messages = array_merge(
            self::$messages,
            [$url . " ...passed"]
        );

        return $return;
    }

    public function testCreate()
    {
        self::$messages = array_merge(
            self::$messages,
            ["\n--- Start Create PAK Isian Sekolah ---"]
        );

        $return = $this->doCreateIsianSekolah();

        self::$messages = array_merge(
            self::$messages,
            ["--- End Create PAK Isian Sekolah ---"]
        );

        return $return;
    }

    /**
     * @depends testCreate
     * @param $data
     * @return mixed
     */
    public function testUpdate($data)
    {
        self::$messages = array_merge(
            self::$messages,
            ["\n--- Start Update PAK Isian Sekolah ---"]
        );

        $return = $this->postRequestExpectPaginatedResponse('pak/isiansekolah/update/' . $data['id'], [
            "deskripsi" => "Kegiatan PAK SD Alam Kebun Tumbuh 2019 - 2020",
            "detail" => [
                [
                    "deskripsi" => "Metode insersi pada mata pelajaran Bahasa Indonesia",
                    "documents" => [["attachment_id" => $data['detail'][0]['documents'][0]['attachment_id']]],
                    "id" => $data['detail'][0]['id'],
                    "images" => [["attachment_id" => $data['detail'][0]['images'][0]['attachment_id']]],
                    "kelas" => "6",
                    "link_blog" => "",
                    "link_facebook" => "",
                    "link_youtube" => "",
                    "mata_pelajaran" => "Bahasa Indonesia",
                    "metode_id" => 1,
                    "tgl_penerapan" => "2019-06-06",
                ]
            ],
            "tahun_ajaran" => "2019-2020",
        ]);

        self::$messages = array_merge(
            self::$messages,
            ["--- End Update PAK Isian Sekolah ---"]
        );

        return $return;
    }

    /**
     * @depends testUpdate
     * @param $data
     */
    public function testDetail($data) {
        self::$messages = array_merge(
            self::$messages,
            ["\n--- Start Detail PAK Isian Sekolah ---"]
        );

        $this->createRequestExpectPaginatedResponse('pak/isiansekolah/view/' . $data['id']);

        self::$messages = array_merge(
            self::$messages,
            ["--- End Detail PAK Isian Sekolah ---"]
        );

        return $data;
    }

    /**
     * @depends testDetail
     * @param $data
     * @return mixed
     */
    public function testIndex($data) {
        self::$messages = array_merge(
            self::$messages,
            ["\n--- Start Index PAK Isian Sekolah ---"]
        );

        $this->createRequestExpectPaginatedResponse('pak/isiansekolah/index');

        self::$messages = array_merge(
            self::$messages,
            ["--- End Index PAK Isian Sekolah ---"]
        );

        return $data;
    }

    /**
     * @depends testIndex
     * @param $data
     * @return mixed
     */
    public function testDelete($data) {
        self::$messages = array_merge(
            self::$messages,
            ["\n--- Start Delete PAK Isian Sekolah ---"]
        );

        $this->postRequestExpectPaginatedResponse('pak/isiansekolah/destroy/' . $data['id'], []);

        self::$messages = array_merge(
            self::$messages,
            ["--- End Delete PAK Isian Sekolah ---"]
        );

        return $data;
    }

    public function testInitDataToVerify() {
        self::$messages = array_merge(
            self::$messages,
            ["\n--- Start Init Data To Verify PAK Isian Sekolah ---"]
        );

        $return = $this->doCreateIsianSekolah();

        self::$messages = array_merge(
            self::$messages,
            ["--- End Init Data To Verify PAK Isian Sekolah ---"]
        );

        return $return;
    }

    /**
     * @depends testInitDataToVerify
     * @param $data
     * @return mixed
     */
    public function testVerify($data) {
        self::$messages = array_merge(
            self::$messages,
            ["\n--- Start Verify PAK Isian Sekolah ---"]
        );

        $this->postRequestExpectPaginatedResponse('pak/isiansekolah/verify/' . $data['id'], [], $this->tokenVerifikator);

        self::$messages = array_merge(
            self::$messages,
            ["--- End Verify PAK Isian Sekolah ---"]
        );

        return $data;
    }

    /**
     * @depends testVerify
     * @param $data
     * @return mixed
     */
    public function testPublish($data) {
        self::$messages = array_merge(
            self::$messages,
            ["\n--- Start Publish PAK Isian Sekolah ---"]
        );

        $this->createRequestExpectPaginatedResponse('pak/isiansekolah/publish/' . $data['id'], $this->tokenVerifikator);

        self::$messages = array_merge(
            self::$messages,
            ["--- End Publish PAK Isian Sekolah ---"]
        );

        return $data;
    }

    /**
     * @depends testPublish
     * @param $data
     * @return mixed
     */
    public function testUnpublish($data) {
        self::$messages = array_merge(
            self::$messages,
            ["\n--- Start Unpublish PAK Isian Sekolah ---"]
        );

        $this->createRequestExpectPaginatedResponse('pak/isiansekolah/unpublish/' . $data['id'], $this->tokenVerifikator);

        self::$messages = array_merge(
            self::$messages,
            ["--- End Unpublish PAK Isian Sekolah ---"]
        );

        return $data;
    }

    /**
     * RESTORE DATA
     * DELETE FROM pak_isian_sekolah WHERE id > 25;
     * DELETE FROM pak_isian_sekolah_detail WHERE isian_id::INTEGER > 25;
     * DELETE FROM pak_isian_sekolah_attachment WHERE isian_detail_id > 25;
     */

    public function testKegiatanFavoriteShouldGiveSuccessResponse() {
        $this->doAPIShouldGiveSimpleSuccessResponse(
            "POST",
            self::BASE_URL . '/kegiatan_favorite/24',
            [
                'json' => [
                    'ids' => [1,3,5]
                ],
                'headers' => [
                    'Authorization' => "Bearer " . $this->doLogin(env("TEST_ADMIN_USERNAME"))['token'],
                ]
            ],
            200,
            "kegiatan_favorite Passed"
        );
    }

    public function testKegiatanUnFavoriteShouldGiveSuccessResponse() {
        $this->doAPIShouldGiveSimpleSuccessResponse(
            "POST",
            self::BASE_URL . '/kegiatan_unfavorite/24',
            [
                'json' => [
                    'ids' => [1,3,5]
                ],
                'headers' => [
                    'Authorization' => "Bearer " . $this->doLogin(env("TEST_ADMIN_USERNAME"))['token'],
                ]
            ],
            200,
            "kegiatan_unfavorite Passed"
        );
    }
}