<?php

require_once 'ABaseTest.php';

class SekolahPAKTest extends BaseTest {
    const LIMIT = 1000;
    #region PAK
    public function testListKegiatanPak() {
        $result = $this->doAPIListShouldSuccess('sekolah/kegiatan-pak');
        $this->assertEquals(5, $result['data']['total_record']);
        $data = $result['data']['result'];
        foreach ($data as $row) {
            $this->assertArrayHasKey('images', $row);
            foreach ($row['images'] as $image) {
                $this->assertArrayHasKey('attachment_id', $image);
                $this->assertArrayHasKey('file', $image);
                $this->assertArrayHasKey('uuid', $image['file']);
            }
        }
    }

    public function testListMediaKegiatanPak() {
        $result = $this->doAPIListShouldSuccess('sekolah/media-kegiatan-pak');
        $this->assertEquals(5, $result['data']['total_record']);
        $data = $result['data']['result'];
        foreach ($data as $row) {
            $this->assertArrayHasKey('images', $row);
            $this->assertArrayHasKey('link_youtube', $row);
            $this->assertNotNull($row['link_youtube']);
            $this->assertNotEquals('', $row['link_youtube']);
            foreach ($row['images'] as $image) {
                $this->assertArrayHasKey('attachment_id', $image);
                $this->assertArrayHasKey('file', $image);
                $this->assertArrayHasKey('uuid', $image['file']);
            }
        }
    }

    /**
     * metode_id: 1 => METODE_INSERSI; 2 => METODE_HABITUASI; 3 => METODE_LAINNYA
     */
    public function testListKegiatanPakByMetode() {
        $result = $this->doAPIListShouldSuccess('sekolah/kegiatan-pak/' . 1 . '?limit='.self::LIMIT);
        foreach ($result['data']['result'] as $row) {
            $this->assertEquals(1, $row['metode_id']);
        }

        $result = $this->doAPIListShouldSuccess('sekolah/kegiatan-pak/' . 2 . '?limit='.self::LIMIT);
        foreach ($result['data']['result'] as $row) {
            $this->assertEquals(2, $row['metode_id']);
        }
    }

    public function testListProvinsiWithKeywordProvinsi() {
        $keyword = 'sulawesi';
        $result = $this->doAPIListShouldSuccess('sekolah/list-kota?keyword='.$keyword);

        foreach ($result['data']['result'] as $row) {
            $this->assertStringContainsStringIgnoringCase($keyword, $row['provinsi']);
        }
    }

    public function testListKotaWithKeywordKab() {
        $keyword = 'karawang';
        $result = $this->doAPIListShouldSuccess('sekolah/list-kota?keyword='.$keyword);

        foreach ($result['data']['result'] as $row) {
            $this->assertStringContainsStringIgnoringCase($keyword, $row['kota_kab']);
        }
    }

    public function testListKotaWithKeywordProvinsi() {
        $keyword = 'jawa barat';
        $result = $this->doAPIListShouldSuccess('sekolah/list-kota?keyword='.$keyword.'&limit='.self::LIMIT);

        foreach ($result['data']['result'] as $row) {
            $this->assertStringContainsStringIgnoringCase($keyword, $row['provinsi']);
        }
    }

    public function testListKotaWithFilterProvinsi() {
        $provinsi = 'jawa barat';

        $result = $this->doAPIListShouldSuccess('sekolah/list-kota?provinsi='.$provinsi.'&limit='.self::LIMIT);

        foreach ($result['data']['result'] as $row) {
            $this->assertStringContainsStringIgnoringCase($provinsi, $row['provinsi']);
        }
    }

    public function testDashboardPAKShouldGiveRequiredResponse() {
        $this->doAPIShouldGiveRequiredResponse('GET', 'sekolah/pak-dashboard', 460, [
            'success' => false,
            'errors' => [
                [
                    'field' => 'tahun_ajaran',
                    'message' => 'Field tahun_ajaran is required'
                ]
            ]
        ], 'sekolah/pak-dashboard should give required response passed');
    }

    public function testDashboardPAKShouldSuccess() {
        $this->doAPIShouldGiveSubsetResponse('GET',
            'sekolah/pak-dashboard',
            200,
            [
                'success' => true,
                'data' => [
                    'regulasi' => [],
                    'isian_sekolah' => []
                ]
            ],
            '',
            [
                'query' => [
                    'tahun_ajaran' => '2020-2021'
                ]
            ]
        );
    }

    public function testListRegulasiPak() {
        $this->doAPIListShouldSuccess('sekolah/pak-list-regulasi');
    }

    public function testListWithDetailIsian() {
        $result = $this->doAPIListShouldSuccess('sekolah/list-with-detail-isian?limit=' . self::LIMIT);
        foreach ($result['data']['result'] as $row) {
            $this->validateSekolah($row);

            $isian = $row['isian_sekolah'];
            if (!is_null($isian)) {
                $this->validateIsianPAK($isian, $row);
                $this->validateIsianDetailPAK($isian['isian_sekolah_detail'], $isian);
            }
        }
    }

    public function testListWithDetailByMetode() {
        $metodeId = 1;
        $result = $this->doAPIListShouldSuccess('sekolah/list-with-detail-isian?limit='.self::LIMIT.'&metode_id='.$metodeId);
        foreach ($result['data']['result'] as $row) {
            $this->validateSekolah($row);

            $isian = $row['isian_sekolah'];
            $this->validateIsianPAK($isian, $row);
            $this->validateIsianDetailPAK($isian['isian_sekolah_detail'], $isian);

            $correctMetodeId = false;
            foreach ($isian['isian_sekolah_detail'] as $isiandetail) {
                $currentMetodeId = $isiandetail['metode_id'];
                if ($currentMetodeId == $metodeId) {
                    $correctMetodeId = true;
                }
            }
            $this->assertTrue($correctMetodeId);
        }
    }

    public function testListWithDetailNotNull() {
        $result = $this->doAPIListShouldSuccess('sekolah/list-with-detail-isian?limit='.self::LIMIT.'&isian_isian_not_null=1');
        foreach ($result['data']['result'] as $row) {
            $this->validateSekolah($row);
            $this->validateIsianPAK($row['isian_sekolah'], $row);
            $this->validateIsianDetailPAK($row['isian_sekolah']['isian_sekolah_detail'], $row['isian_sekolah']);
        }
    }
    #endregion

    #region PRIVATE
    private function validateSekolah($sekolah) {
        $this->assertArrayHasKey('id', $sekolah);
        $this->assertArrayHasKey('npsn', $sekolah);
        $this->assertArrayHasKey('nama', $sekolah);
        $this->assertArrayHasKey('provinsi', $sekolah);
        $this->assertArrayHasKey('kota_kab', $sekolah);
        $this->assertArrayHasKey('kecamatan', $sekolah);
        $this->assertArrayHasKey('isian_sekolah', $sekolah);
    }

    private function validateIsianPAK($isian, $sekolah) {
        $this->assertNotNull($isian);
        $this->assertArrayHasKey('id', $isian);
        $this->assertArrayHasKey('sekolah_npsn', $isian);
        $this->assertArrayHasKey('tahun_ajaran', $isian);
        $this->assertArrayHasKey('deskripsi', $isian);
        $this->assertArrayHasKey('status', $isian);
        $this->assertArrayHasKey('is_published', $isian);

        $this->assertEquals($sekolah['npsn'], $isian['sekolah_npsn']);
        $this->assertEquals('Verified', $isian['status']);
        $this->assertEquals(true, $isian['is_published']);
    }

    private function validateIsianDetailPAK($details, $isian) {
        foreach ($details as $isiandetail) {
            $this->assertEquals($isian['id'], $isiandetail['isian_id']);
            $this->assertArrayHasKey('nama_kegiatan', $isiandetail);
            $this->assertArrayHasKey('deskripsi', $isiandetail);

            $currentMetodeId = $isiandetail['metode_id'];
            if ($currentMetodeId == 1) {
                $this->assertNotNull($isiandetail['mata_pelajaran']);
                $this->assertNotNull($isiandetail['kelas']);
                $this->assertNotNull($isiandetail['tgl_penerapan']);
            } elseif ($currentMetodeId == 2) {
                $this->assertNotNull($isiandetail['nama_kegiatan']);
            }
        }
    }
    #endregion
}
