<?php
class SekolahClient extends BackgroundBaseClient
{
    private $token;
    private $jenjangLookup;

    public function filterResponse($body, $result)
    {
        parent::filterResponse($body, $result);
        if ($this->logger != null) {
            if($result != null) {
                if(!is_array($result)) {
                    $this->logger->addItem("api_result_code", -1);
                    $this->logger->addItem("api_result_message", $result);
                }
                else if(array_key_exists('Message', $result)) {
                    $this->logger->addItem("api_result_code", -1);
                    $this->logger->addItem("api_result_message", $result['Message']);
                }
            }
        }
    }

    public function gtk($npsn)
    {
        $this->getToken();
        $method = "GET";
        $path = "/api/kpk/gtk";
        $params = [
            "query" => [
                "npsn" => $npsn
            ],
            "headers" => [
                "Authorization" => "bearer " . $this->token
            ]
        ];

        //region LOG Definition
        $this->setApiName("sekolah-gtk");
        //endregion

        return $this->execute($method, $path, $params);
    }

    public function getToken()
    {
        $method = "POST";
        $path = "/token";
        $params = [
            "headers" => [
                "Content-Type" => "application/x-www-form-urlencoded"
            ],
            "form_params" => [
                "username" => $this->prop["username"],
                "password" => $this->prop["password"],
                "grant_type" => $this->prop["grant_type"]
            ]
        ];

        //region LOG Definition
        $this->setApiName("sekolah-get_token");
        $this->setLogParams($params['form_params']);
        //endregion

        $res = $this->execute($method, $path, $params);
        $this->token = $res["access_token"];
    }

    public function initializeJenjangLookup()
    {
        $lookup = [];
        $jenjang_list = Jenjang::find()->toArray();

        foreach ($jenjang_list as $key => $jenjang) {
            $lookup[strtolower($jenjang['nama_jenjang'])] = $jenjang['id'];
        }

        $this->jenjangLookup = $lookup;
    }

    public function getAndRegisterJenjangId($input)
    {
        $bentuk = trim($input);
        if (empty($bentuk)) {
            return null;
        }

        $key = strtolower($bentuk);

        $result = array_key_exists($key, $this->jenjangLookup) ? $this->jenjangLookup[$key] : null;

        if (empty($result)) {
            $newJenjang = new Jenjang();
            $newJenjang->nama_jenjang = $bentuk;
            $newJenjang->save();

            $result = (int)$newJenjang->id;
            $this->jenjangLookup[$key] = $newJenjang->id;
        }

        return $result;
    }

    public function getSekolah($npsn)
    {
        // return [
        //     "sekolah_id" => "6bc9b0a8-40cb-413c-a4ff-a15de08fec3d",
        //     "sekolah" => "SMA NEGERI 09",
        //     "alamat_jalan" => "Jl. Cemara Raya",
        //     "propinsi" => "Prov. Jawa Tengah",
        //     "kabupaten_kota" => "Kota Semarang",
        //     "kecamatan" => "Kec. Banyumanik",
        //     "kepala_sekolah" => "Siswanto",
        //     "akreditasi" => "A",
        //     "telp_sekolah" => "7472812",
        //     "email_sekolah" => "smu092001@yahoo.com",
        //     "guru_l" => 24,
        //     "guru_p" => 40,
        //     "pd_l" => 470,
        //     "pd_p" => 643,
        //     "rombel" => 31,
        //     "kurikulum" => "K-13",
        //     "waktu_penyelenggaraan" => 6,
        //     "periode_aktif" => "20182",
        //     "internet" => "Yes",
        //     "luas_tanah" => 14740,
        //     "ruang_kelas" => 31,
        //     "laboratorium" => 4,
        //     "perpus" => 1,
        //     "sanitasi_siswa" => 32,
        //     "koordinat_lintang" => -7.1044,
        //     "koordinat_bujur" => 110.4108,
        //     "tanggal_update_sekolah" => "2019-05-20T20:41:12.65",
        //     "guru_pns" => 38,
        //     "guru_gtt" => 0,
        //     "guru_gty" => 0,
        //     "guru_honor" => 0,
        //     "guru_gol_1" => 0,
        //     "guru_gol_2" => 1,
        //     "guru_gol_3" => 15,
        //     "guru_gol_4" => 22,
        //     "guru_sertifikasi" => 0,
        //     "guru_belum_sertifikasi" => 0,
        //     "guru_kurang_s1" => 0,
        //     "guru_s1_lebih" => 48,
        //     "data_kosong" => 0,
        //     "guru_kurang_30_th" => 5,
        //     "guru_31_35_th" => 3,
        //     "guru_36_40_th" => 3,
        //     "guru_41_45_th" => 1,
        //     "guru_46_50_th" => 10,
        //     "guru_51_55_th" => 10,
        //     "guru_lebih_55_th" => 16,
        //     "ruang_kelas_baik" => 30,
        //     "ruang_kelas_rsk_ringan" => 1,
        //     "ruang_kelas_rsk_sedang" => 0,
        //     "ruang_kelas_rsk_berat" => 0,
        //     "lab_ipa" => 0,
        //     "lab_biologi" => 1,
        //     "lab_kimia" => 1,
        //     "lab_fisika" => 1,
        //     "lab_bahasa" => 1,
        //     "lab_ips" => 0,
        //     "ruang_perpus_baik" => 1,
        //     "ruang_perpus_rsk_ringan" => 0,
        //     "ruang_perpus_rsk_sedang" => 0,
        //     "ruang_perpus_rsk_berat" => 0,
        //     "sanitasi_guru_baik" => 6,
        //     "sanitasi_guru_rusak_ringan" => 0,
        //     "sanitasi_guru_rusak_berat" => 0,
        //     "sanitasi_siswa_baik" => 32,
        //     "sanitasi_siswa_rusak_sedang" => 0,
        //     "sanitasi_siswa_rusak_berat" => 0,
        //     "npsn" => "20328939",
        //     "bentuk" => "SMA"
        // ];

        $method = 'GET';
        $path = '/api/kpk/sekolah';
        $params = [
            "query" => [
                "npsn" => $npsn
            ],
            "headers" => [
                "Authorization" => "bearer " . $this->token
            ]
        ];

        //region LOG Definition
        $this->setApiName("sekolah-get_sekolah");
        //endregion

        $res = $this->execute($method, $path, $params);
        return $res;
    }

    private function requestSekolah($params)
    {
        $this->startTime = microtime(true);
        $this->initializeJenjangLookup();
        print_r($this->jenjangLookup);
        $this->getToken();

        $method = 'GET';
        $path = '/api/kpk/update';
        $params["headers"] = [
            "Authorization" => "bearer " . $this->token
        ];

        //region LOG Definition
        $this->setApiName("sekolah-request_sekolah");
        //endregion

        $res = $this->execute($method, $path, $params);
        $this->objectsProcessed = count($res);
        echo "total data dari kemdikbud: " . count($res) . "\n";
        echo "================================================================\n";
        foreach ($res as $update) {
            try {
                $sekolah = $this->getSekolah($update["npsn"]);
                $sekolahModel = Sekolah::findFirst(
                    [
                        "npsn = :npsn:",
                        "bind" => [
                            "npsn" => $update["npsn"]
                        ]
                    ]
                );

                if (!$sekolahModel) {
                    echo "sekolah baru " . $sekolah["sekolah"] . "\n";
                    $sekolahModel = new Sekolah();
                } else {
                    if ($sekolahModel->tanggal_update_sekolah == $sekolah["tanggal_update_sekolah"]) {
                        echo "data sekolah " . $sekolah["sekolah"] . " sudah up to date\n";
                        continue;
                    }
                    echo "update sekolah " . $sekolah["sekolah"] . "\n";
                }
                $this->updateSekolah($sekolahModel, $sekolah);
            } catch (\Exception $e) {
                echo $e->getMessage();
            }
        }
        $this->endTime = microtime(true);
    }
    public function updateDaily()
    {
        $params = [
            "query" => [
                "startdate" => date('Ymd', strtotime('-1 day')),
                "enddate" => date('Ymd')
            ]
        ];
        $this->requestSekolah($params);
    }

    public function init()
    {
        $sdate = strtotime('01-01-2018');
        $now = strtotime('today');

        while ($sdate < $now) {
            $edate = strtotime('1 day', $sdate);
            $startdate = date('Ymd', $sdate);
            $enddate = date('Ymd', $edate);
            $params = [
                "query" => [
                    "startdate" => $startdate,
                    "enddate" => $enddate
                ]
            ];
            echo "================================================================\n";
            echo "update sekolah dari tanggal " . date('Y-m-d', $sdate) . " sampai tanggal " . date('Y-m-d', $edate) . "\n";
            $this->requestSekolah($params);
            $sdate = $edate;
        }
    }

    private function updateSekolah($des, $src)
    {
        $des->npsn = $src["npsn"];
        $des->nama = $src["sekolah"];
        $des->alamat = $src["alamat_jalan"];
        $des->no_telp = $src["telp_sekolah"];
        $des->email = trim($src["email_sekolah"]);
        $des->kepsek = $src["kepala_sekolah"];
        $des->provinsi = $src["propinsi"];
        $des->kota_kab = $src["kabupaten_kota"];
        $des->kecamatan = $src["kecamatan"];
        $des->akreditasi = $src["akreditasi"];
        $des->latitude = $src["koordinat_lintang"];
        $des->longitude = $src["koordinat_bujur"];
        $des->produk_id = "0fd356ad-5b4e-4f77-b7b4-f964be3731a3";
        $des->sekolah_id = $src["sekolah_id"];
        $des->bentuk_pendidikan = $src["bentuk"];
        $des->kurikulum = $src["kurikulum"];
        $des->luas_tanah_milik = $src["luas_tanah"];
        $des->lab_bahasa = $src["lab_bahasa"];
        $des->lab_biologi = $src["lab_biologi"];
        $des->lab_fisika = $src["lab_fisika"];
        $des->lab_ipa = $src["lab_ipa"];
        $des->lab_ips = $src["lab_ips"];
        $des->lab_kimia = $src["lab_kimia"];
        $des->pd_laki = $src["pd_l"];
        $des->pd_perempuan = $src["pd_p"];
        $des->perpus_baik = $src["ruang_perpus_baik"];
        $des->perpus_rusak_berat = $src["ruang_perpus_rsk_berat"];
        $des->perpus_rusak_ringan = $src["ruang_perpus_rsk_ringan"];
        $des->perpus_rusak_sedang = $src["ruang_perpus_rsk_sedang"];
        $des->rk_baik = $src["ruang_kelas_baik"];
        $des->rk_rusak_ringan = $src["ruang_kelas_rsk_berat"];
        $des->rk_rusak_sedang = $src["ruang_kelas_rsk_sedang"];
        $des->rk_rusak_berat = $src["ruang_kelas_rsk_berat"];
        $des->rombel = $src["rombel"];
        $des->sanitasi_siswa = $src["sanitasi_siswa"];
        $des->guru_belums1 = $src["guru_kurang_s1"];
        $des->guru_belumsertifikasi = $src["guru_belum_sertifikasi"];
        $des->guru_gol1 = $src["guru_gol_1"];
        $des->guru_gol2 = $src["guru_gol_2"];
        $des->guru_gol3 = $src["guru_gol_3"];
        $des->guru_gol4 = $src["guru_gol_4"];
        $des->guru_gtt = $src["guru_gtt"];
        $des->jml_lab = $src["laboratorium"];
        $des->guru_gty = $src["guru_gty"];
        $des->guru_laki = $src["guru_l"];
        $des->guru_perempuan = $src["guru_p"];
        $des->guru_pns = $src["guru_pns"];
        $des->guru_s1lebih = $src["guru_s1_lebih"];
        $des->guru_sertifikasi = $src["guru_sertifikasi"];
        $des->jml_perpus = $src["perpus"];
        $des->jml_rk = $src["ruang_kelas"];
        $des->waktu_penyelenggaraan = $src["waktu_penyelenggaraan"];
        $des->akses_internet = $src["internet"];
        $des->periode_aktif = $src["periode_aktif"];
        $des->laboratorium = $src["laboratorium"];
        $des->tanggal_update_sekolah = $src["tanggal_update_sekolah"];
        $des->guru_honor = $src["guru_honor"];
        $des->data_kosong = $src["data_kosong"];
        $des->guru_kurang_30_th = $src["guru_kurang_30_th"];
        $des->guru_31_35_th = $src["guru_31_35_th"];
        $des->guru_36_40_th = $src["guru_36_40_th"];
        $des->guru_41_45_th = $src["guru_41_45_th"];
        $des->guru_46_50_th = $src["guru_46_50_th"];
        $des->guru_51_55_th = $src["guru_51_55_th"];
        $des->guru_lebih_55_th = $src["guru_lebih_55_th"];
        $des->sanitasi_guru_baik = $src["sanitasi_guru_baik"];
        $des->sanitasi_guru_rusak_ringan = $src["sanitasi_guru_rusak_ringan"];
        $des->sanitasi_guru_rusak_berat = $src["sanitasi_guru_rusak_berat"];
        $des->sanitasi_siswa_baik = $src["sanitasi_siswa_baik"];
        $des->sanitasi_siswa_rusak_sedang = $src["sanitasi_siswa_rusak_sedang"];
        $des->sanitasi_siswa_rusak_berat = $src["sanitasi_siswa_rusak_berat"];
        $des->bentuk = $src["bentuk"];
        $des->jenjang_id = $this->getAndRegisterJenjangId($src["bentuk"]);

        if (empty($des->kecamatan_kode)) {
            $kecamatanKodeRes = Sekolah::find(
                [
                    "columns" => "kecamatan_code",
                    "provinsi = :provinsi: and kota_kab = :kota_kab: and kecamatan = :kecamatan:",
                    "bind" => [
                        "provinsi" => $src["propinsi"],
                        "kota_kab" => $src["kabupaten_kota"],
                        "kecamatan" => $src["kecamatan"]
                    ],
                    "limit" => 1
                ]
            )
                ->toArray();
            if (count($kecamatanKodeRes) > 0) {
                $des->kecamatan_code = $kecamatanKodeRes[0]["kecamatan_code"];
            }
        }
        $res = $des->save();
        if (!$res) {
            if ($des->getMessages()[0]->getField() == "email") {
                $des->email = '';
                $res = $des->save();
            }
            print_r($des->getMessages());
        }
    }
}
