<?php


use MeiliSearch\Client;
use meilisearchdetails\MeiliSearchKeywords;

class MeiliSearchService
{
    private $controller;
    protected $objectsProcessed;

    const INDEX = 'KPKJaga';

    const SECTOR_JENDELA_PENCEGAHAN = "Jendela Pencegahan";
    const SECTOR_PELAYANAN_PUBLIK = "Pelayanan Publik";
    const SECTOR_BERITA_JAGA = "Berita Jaga";
    const SECTOR_TENTANG = "Tentang";

    //Jendela Pencegahan
    const CATEGORY_RANGKUMAN_JEND_PENCEGAHAN = "Rangkuman Jendela Pencegahan";
    const CATEGORY_KOORDINASI_WILAYAH = "Koordinasi Wilayah";
    const CATEGORY_ELHKPN = "E-LHKPN";
    const CATEGORY_GRATIFIKASI = "Gratifikasi";
    const CATEGORY_SPI = "Survey Penilaian Integritas";
    const CATEGORY_STRANAS = "Stranas PK";
    //Pelayanan Publik
    const CATEGORY_COVID = "Penanganan Covid-19";
    const CATEGORY_PENDIDIKAN = "Pendidikan";
    const CATEGORY_PELABUHAN = "Pelabuhan";
    const CATEGORY_SEKOLAH = "Sekolah";
    const CATEGORY_PERGURUAN_TINGGI = "Perguruan Tinggi";
    const CATEGORY_DESA = "Desa";
    const CATEGORY_FASKES = "Fasilitas Kesehatan";
    const CATEGORY_PERIZINAN = "Perizinan";
    const CATEGORY_PPJ = "PPJ";
    const CATEGORY_ANGGARAN = "Anggaran";
    //Berita Jaga
    const CATEGORY_BERITA = "Berita";
    //Panduan
    const CATEGORY_PANDUAN = "Panduan";

    //ALL
    const SUBSTANCE_DASHBOARD = "Dashboard";
    //Pendidikan (Sekolah & PT)
    const SUBSTANCE_DETAIL_SEKOLAH = "Detail Sekolah";
    const SUBSTANCE_DETAIL_PT = "Detail Perguruan Tinggi";
    //Desa
    const SUBSTANCE_DETAIL_DESA = "Detail Desa";
    //Perizinan
    const SUBSTANCE_DETAIL_PERIZINAN = "Detail Perizinan";
    //Berita
    const SUBSTANCE_DETAIL_BERITA = "Detail Berita";
    //Panduan
    const SUBSTANCE_PANDUAN_BOS = "Panduan BOS";
    const SUBSTANCE_PANDUAN_PIP_SEKOLAH = "Panduan PIP Sekolah";
    const SUBSTANCE_PANDUAN_PIP_KAMPUS = "Panduan PIP Kampus";
    const SUBSTANCE_PANDUAN_PENANGANAN_COVID = "Panduan Penanganan Covid-19";
    const SUBSTANCE_PANDUAN_BANSOS_COVID = "Panduan Bansos Covid-19";
    const SUBSTANCE_PANDUAN_DESA = "Panduan Desa";
    const SUBSTANCE_PANDUAN_DANA_DESA = "Panduan Dana Desa";
    const SUBSTANCE_PANDUAN_JKN = "Panduan JKN";
    const SUBSTANCE_PANDUAN_PERIZINAN = "Panduan Perizinan";
    const SUBSTANCE_PANDUAN_PPJ = "Panduan PPJ";

    private const MODEL_LIST = [
        'DashboardRankumanJendelaPencegahan',
        'DashboardKoordinasiWilayah',
        'DashboardELHKPN',
        'DashboardGratifikasi',
        'DashboardSPI',
        'DashboardStranasPK',
        'DashboardCovid19',
        'DashboardPendidikan',
        'DashboardSekolah',
        'Sekolah',
        'DashboardPerguruanTinggi',
        'PerguruanTinggi',
        'DashboardDesa',
        'OmspanMasterDesa',
        'DashboardFaskes',
        'DashboardPerizinan',
        'PerizinanKontak',
        'DashboardPPJ',
        'DashboardBerita',
        'Diskusi',
        'DashboardPelabuhan',
        'DashboardAnggaran',
        'TentangPanduan',
        'Panduan'
        ];

    public function __construct($controller) {
        try {
            $meiliBaseUrl = getenv("MEILI_SEARCH_BASE_URL") ?? "http://0.0.0.0:7700";
            $masterKey = getenv('MEILI_SEARCH_MASTER_KEY') ?? "";
            $this->client = new Client($meiliBaseUrl, $masterKey);
            $this->controller = $controller;
        }
        catch (Exception $exception) {
            throw new Exception($exception);
        }
    }

    public function getObjectsProcessed()
    {
        return $this->objectsProcessed;
    }

    public function addSingleDocument($data) {
        try {
            return $this->client->index(self::INDEX)->addDocuments([$data]);
        }
        catch (Exception $e) {
            throw $e;
        }
    }

    public function addMultiDocuments($data) {
        try {
            return $this->client->index(self::INDEX)->addDocuments($data);
        }
        catch (Exception $e) {
            throw $e;
        }
    }

    public function updateSingleDocument($data) {
        try {
            return $this->client->index(self::INDEX)->updateDocuments([$data]);
        }
        catch (Exception $e) {
            throw $e;
        }
    }

    public function updateMultipleDocuments($data) {
        try {
            return $this->client->index(self::INDEX)->updateDocuments($data);
        }
        catch (Exception $e) {
            throw $e;
        }
    }

    public function search($q, $options) {
        try {
//            $res = $this->client->index(self::INDEX)->search($q, $options);
            $res = $this->client->index(self::INDEX)->rawSearch($q, $options);
            return $res;
        }
        catch (Exception $exception) {
            if($exception->errorCode == 'index_not_found') return [];
            throw new Exception($exception);
        }
    }

    public function deleteDocument($id) {
        try {
            return $this->client->index(self::INDEX)->deleteDocument($id);
        }
        catch (Exception $e) {
            throw $e;
        }
    }

    public function deleteAllDocument() {
        try {
            $res = $this->client->index(self::INDEX)->deleteAllDocuments();
            $this->controller->rawQuery("
                UPDATE jaga.meilisearch_record SET last_id = 0;
            ");
            return $res;
        }
        catch (Exception $e) {
            throw $e;
        }
    }

    public function checkStatus($id) {
        try {
            $res = $this->client->index(self::INDEX)->getUpdateStatus($id);
            return $res;
        }
        catch (Exception $e) {
            throw $e;
        }
    }

    public function checkAllStatus() {
        try {
            $res = $this->client->index(self::INDEX)->getAllUpdateStatus();
            return $res;
        }
        catch (Exception $e) {
            throw $e;
        }
    }

    public function client() {
        try {
            return $this->client;
        }
        catch (Exception $e) {
            throw $e;
        }
    }

    public function index() {
        return $this->client->index(self::INDEX);
    }

    public function getIndex() {
        return $this->client->getIndex(self::INDEX);
    }

    public function getAllIndex() {
        return $this->client->getAllIndexes();
    }

    public function setup() {
        $res = $this->client->index(self::INDEX)->updateSettings([
            'searchableAttributes' => [
                "sector",
                "category",
                "substance",
                "title",
                "content",
                "keywords",
                "FEURL",
            ],
            'stopWords' => [
                "di",
                "pada",
                "oleh",
                "diskusi",
                "per",
                "&"
            ],
            'rankingRules' => [
                'words',
                'typo',
                'proximity',
                'attribute',
                "wordsPosition",
                'exactness',
                'desc(id)'
            ],
            'distinctAttribute' => 'id'
        ]);

        return $res;
    }

    public function generateDataMeiliSearch() {
        try {
            $dataMeili = [];

            $recordMeili = MeilisearchRecord::find(['order' => 'id ASC']);

            $recordMeili = $this->checkNonExistModel($recordMeili);

            $limitGet = AppConfig::getIntValueByKodeOrDefault('MEILISEARCH_GET_LIMIT', 2000);
            $limitAdd = AppConfig::getIntValueByKodeOrDefault('MEILISEARCH_ADD_LIMIT', 10000);
            $res = 0;

            foreach ($recordMeili as $itemRecord) {
                //region Jendela Pencegahan
                if ($itemRecord->model_name == 'DashboardRankumanJendelaPencegahan' && $itemRecord->last_id == 0) {
                    try {
                        AppLog::createLog('SCHEDULED_MEILISEARCH', 'INFO', 'Start Processing DashboardRankumanJendelaPencegahan.');

                        $itemMeili = [
                            "id" => "rangkuman-jendela-pencegahan-dashboard",
                            "sector" => self::SECTOR_JENDELA_PENCEGAHAN,
                            "category" => self::CATEGORY_RANGKUMAN_JEND_PENCEGAHAN,
                            "substance" => self::SUBSTANCE_DASHBOARD,
                            "title" => "Rangkuman Jendela Pencegahan",
                            "content" => 'Memuat informasi detail seputar aksi Pencegahan korupsi di provinsi hingga kabupaten/kota yang ada di Indonesia. Dashboard Umum, Penyelamatan Keuangan',
                            "keywords" => 'profil umum, grafik, chart, Jendela daerah tingkat nasional, progress mcp, kepatuhan elhkpn, laporan gratifikasi, skor SPI, skor stranas pk, penyelamatan keuangan negara, realisasi pendapatan, pajak daerah tingkat nasional, data tanah pemerintah bersertifikasi belum jumlah penerbitan sertifikasi bidang fasos fasum pemulihan aset daerah tanah/bangunan kendaraan dinas triwulan',
                            "FEURL" => "/jendela-pencegahan/summary"
                        ];
                        array_push($dataMeili, $itemMeili);

                        $res = $this->addSingleDocument($itemMeili);

                        $itemRecord->last_id = 1;
                        $itemRecord->last_update_at = date('Y-m-d H:i:s');
                        $itemRecord->save();

                        AppLog::createLog('SCHEDULED_MEILISEARCH', 'INFO', 'SUCCESS Processing DashboardRankumanJendelaPencegahan. Total Data: 1');
                    }
                    catch (Exception $e) {
                        AppLog::createLog('SCHEDULED_MEILISEARCH', 'ERROR', 'FAILED Processing DashboardRankumanJendelaPencegahan. Err Message: ' . $e->getMessage());
                    }
                }
                else if ($itemRecord->model_name == 'DashboardKoordinasiWilayah' && $itemRecord->last_id == 0) {
                    try {
                        AppLog::createLog('SCHEDULED_MEILISEARCH', 'INFO', 'Start Processing DashboardKoordinasiWilayah.');

                        $itemMeili = [
                            "id" => "koordinasi-wilayah-dashboard",
                            "sector" => self::SECTOR_JENDELA_PENCEGAHAN,
                            "category" => self::CATEGORY_KOORDINASI_WILAYAH,
                            "substance" => self::SUBSTANCE_DASHBOARD,
                            "title" => "Koordinasi Wilayah",
                            "content" => 'Upaya pencegahan korupsi pada Pemerintah Daerah salah satunya dilakukan melalui program Pencegahan Korupsi Terintegrasi. Program ini merupakan pelaksanaan dari tugas KPK dalam koordinasi dan monitoring upaya-upaya pencegahan korupsi yang dilakukan oleh Pemerintah Daerah. Dalam melakukan upaya pencegahan korupsi di daerah, KPK berkolaborasi bersama Kementerian Dalam Negeri, Kementerian PAN dan RB, Badan Pengawasan Keuangan dan Pembangunan (BPKP), dan Kementerian/ Lembaga yang terkait lainnya.',
                            "keywords" => 'profil umum, grafik, chart, peta, sebaran capaian, progres keberhasilan, nasional, laporan, capaian mcp nasional, wilayah, instansi, indeks, peringkat, total nilai, progress keberhasilan nasional, Rencana Aksi Pemberantasan Korupsi Terintegrasi, Perencanaan dan Penganggaran APBD, Pengadaan Barang dan Jasa, Perizinan, APIP, Manajemen ASN, Optimalisasi Pajak Daerah, Manajemen Aset Daerah, Tata Kelola Dana Desa, gambaran umum, kontak',
                            "FEURL" => "/jendela-pencegahan/korwil"
                        ];
                        array_push($dataMeili, $itemMeili);

                        $res = $this->addSingleDocument($itemMeili);

                        $itemRecord->last_id = 1;
                        $itemRecord->last_update_at = date('Y-m-d H:i:s');
                        $itemRecord->save();

                        AppLog::createLog('SCHEDULED_MEILISEARCH', 'INFO', 'SUCCESS Processing DashboardKoordinasiWilayah. Total Data: 1');
                    }
                    catch (Exception $e) {
                        AppLog::createLog('SCHEDULED_MEILISEARCH', 'ERROR', 'FAILED Processing DashboardKoordinasiWilayah. Err Message: ' . $e->getMessage());
                    }
                }
                else if ($itemRecord->model_name == 'DashboardELHKPN' && $itemRecord->last_id == 0) {
                    try {
                        AppLog::createLog('SCHEDULED_MEILISEARCH', 'INFO', 'Start Processing DashboardELHKPN.');

                        $itemMeili = [
                            "id" => "elhkpn-dashboard",
                            "sector" => self::SECTOR_JENDELA_PENCEGAHAN,
                            "category" => self::CATEGORY_ELHKPN,
                            "substance" => self::SUBSTANCE_DASHBOARD,
                            "title" => "E-LHKPN",
                            "content" => 'LHKPN merupakan singkatan dari Laporan Harta Kekayaan Penyelenggara Negara, yaitu daftar seluruh harta kekayaan Penyelenggara Negara (beserta harta yang dimiliki oleh isteri/suami dan anak yang masih dalam tanggungan) yang dituangkan dalam formulir LHKPN yang ditetapkan oleh KPK. LHKPN dilaporkan oleh Penyelenggara Negara/Wajib Lapor (PN/WL) sebagaimana yang dimaksud dalam UU Nomor 28 tahun 1999 serta pejabat negara yang menjalankan fungsi eksekutif, legislatif, atau yudikatif, dan pejabat lain yang fungsi dan tugas pokoknya berkaitan dengan penyelenggaraan negara atau pejabat publik lainnya sesuai dengan ketentuan peraturan perundang-undangan yang berlaku.',
                            "keywords" => 'profil umum, grafik, chart, peta, sebaran e-lhkpn elhkpn, progres pejabat, sebaran wilayah, nasional, kepatuhan pejabat tingkat nasional dan daerah, pengumuman, kpk-a, kpk-b, tren kepatuhan per bidang, lapor harta kekayaan, transparan, bumn/bumd, eksekutif, legislatif, yudikatif, gambaran umum, dasar hukum, mekanisme pelaporan, publikasi, kontak, sejarah, manfaat PN/WL, orde lama baru reformasi',
                            "FEURL" => "/jendela-pencegahan/elhkpn"
                        ];
                        array_push($dataMeili, $itemMeili);

                        $res = $this->addSingleDocument($itemMeili);

                        $itemRecord->last_id = 1;
                        $itemRecord->last_update_at = date('Y-m-d H:i:s');
                        $itemRecord->save();

                        AppLog::createLog('SCHEDULED_MEILISEARCH', 'INFO', 'SUCCESS Processing DashboardELHKPN. Total Data: 1');
                    }
                    catch (Exception $e) {
                        AppLog::createLog('SCHEDULED_MEILISEARCH', 'ERROR', 'FAILED Processing DashboardELHKPN. Err Message: ' . $e->getMessage());
                    }
                }
                else if ($itemRecord->model_name == 'DashboardGratifikasi' && $itemRecord->last_id == 0) {
                    try {
                        AppLog::createLog('SCHEDULED_MEILISEARCH', 'INFO', 'Start Processing DashboardGratifikasi.');

                        $itemMeili = [
                            "id" => "gratifikasi-dashboard",
                            "sector" => self::SECTOR_JENDELA_PENCEGAHAN,
                            "category" => self::CATEGORY_GRATIFIKASI,
                            "substance" => self::SUBSTANCE_DASHBOARD,
                            "title" => "Gratifikasi",
                            "content" => 'Arti gratifikasi menurut pasal 12B Undang-Undang Nomor 20 Tahun 2001, yaitu pemberian dalam arti luas, yakni meliputi pemberian uang, barang, rabat (discount), komisi, pinjaman tanpa bunga, tiket perjalanan, fasilitas penginapan, perjalanan wisata, pengobatan cuma-cuma, dan fasilitas lainnya. Dari penjelasan tersebut dapat dilihat bahwa gratifikasi memiliki makna yang netral, artinya tidak terdapat makna tercela atau negatif dari arti kata gratifikasi tersebut. Maka dapat dipahami bahwa tidak semua gratifikasi itu bertentangan dengan hukum, melainkan hanya gratifikasi yang memenuhi kriteria dalam unsur pasal 12B saja.',
                            "keywords" => 'profil umum, grafik, chart, peta, sebaran gratifikasi, tren pelaporan, sebaran wilayah nasional, total status penetapan laporan gratifikasi nasional per tahun, berdasarkan instansi, milik negara, milik penerima, sebagian milik negara, proses, non sk, lainnya (file/selesai/tidak input sig/tidak proses/dikembalikan), eksekutif yudikatif legislatif bumn/bumd swasta, gambaran umum, dasar hukum, mekanisme pelaporan, publikasi, kontak, faq gratifikasi, pegawai negeri atau penyelenggara Negara, media pelaporan gratifikasi, pelaporan manual, pelaporan versi GOL',
                            "FEURL" => "/jendela-pencegahan/gratifikasi"
                        ];
                        array_push($dataMeili, $itemMeili);

                        $res = $this->addSingleDocument($itemMeili);

                        $itemRecord->last_id = 1;
                        $itemRecord->last_update_at = date('Y-m-d H:i:s');
                        $itemRecord->save();

                        AppLog::createLog('SCHEDULED_MEILISEARCH', 'INFO', 'SUCCESS Processing DashboardGratifikasi. Total Data: 1');
                    }
                    catch (Exception $e) {
                        AppLog::createLog('SCHEDULED_MEILISEARCH', 'ERROR', 'FAILED Processing DashboardGratifikasi. Err Message: ' . $e->getMessage());
                    }
                }
                else if ($itemRecord->model_name == 'DashboardSPI' && $itemRecord->last_id == 0) {
                    try {
                        AppLog::createLog('SCHEDULED_MEILISEARCH', 'INFO', 'Start Processing DashboardSPI.');

                        $itemMeili = [
                            "id" => "spi-dashboard",
                            "sector" => self::SECTOR_JENDELA_PENCEGAHAN,
                            "category" => self::CATEGORY_SPI,
                            "substance" => self::SUBSTANCE_DASHBOARD,
                            "title" => "Survey Penilaian Integritas",
                            "content" => 'Ketahui tingkat kerawanan dan upaya pencegahan korupsi daerahmu dengan melakukan pencarian wilayah dan tahun survei',
                            "keywords" => 'profil umum, grafik, chart, peta, wilayah, tahun, nasional, download, bandingkan, nilai, total, sangat rentan, rentan, waspada, terjaga, total rerata nilai nasional, Nilai rata-rata skor SPI dari seluruh Kementerian/Lembaga/Pemerintah Daerah di Indonesia.',
                            "FEURL" => "/jendela-pencegahan/spi"
                        ];
                        array_push($dataMeili, $itemMeili);

                        $res = $this->addSingleDocument($itemMeili);

                        $itemRecord->last_id = 1;
                        $itemRecord->last_update_at = date('Y-m-d H:i:s');
                        $itemRecord->save();

                        AppLog::createLog('SCHEDULED_MEILISEARCH', 'INFO', 'SUCCESS Processing DashboardSPI. Total Data: 1');
                    }
                    catch (Exception $e) {
                        AppLog::createLog('SCHEDULED_MEILISEARCH', 'ERROR', 'FAILED Processing DashboardSPI. Err Message: ' . $e->getMessage());
                    }
                }
                else if ($itemRecord->model_name == 'DashboardStranasPK' && $itemRecord->last_id == 0) {
                    try {
                        AppLog::createLog('SCHEDULED_MEILISEARCH', 'INFO', 'Start Processing DashboardStranasPK.');

                        $itemMeili = [
                            "id" => "stranaspk-dashboard",
                            "sector" => self::SECTOR_JENDELA_PENCEGAHAN,
                            "category" => self::CATEGORY_STRANAS,
                            "substance" => self::SUBSTANCE_DASHBOARD,
                            "title" => "Stranas Pencegahan Korupsi (PK)",
                            "content" => 'Stranas Pencegahan Korupsi (PK)',
                            "keywords" => 'profil umum, grafik, chart, peta, instansi, wilayah, pemda tingkat 1 provinsi, pemda tingkat 2 kota/kabupaten, kementerian lembaga, dengan tanpa logframe, total capaian, Daftar Fokus STRANAS PENCEGAHAN KORUPSI, perizinan dan tata niaga, keuangan negara, Penegakan Hukum dan Reformasi Birokrasi, INSW, default',
                            "FEURL" => "/jendela-pencegahan/spi"
                        ];
                        array_push($dataMeili, $itemMeili);

                        $res = $this->addSingleDocument($itemMeili);

                        $itemRecord->last_id = 1;
                        $itemRecord->last_update_at = date('Y-m-d H:i:s');
                        $itemRecord->save();

                        AppLog::createLog('SCHEDULED_MEILISEARCH', 'INFO', 'SUCCESS Processing DashboardStranasPK. Total Data: 1');
                    }
                    catch (Exception $e) {
                        AppLog::createLog('SCHEDULED_MEILISEARCH', 'ERROR', 'FAILED Processing DashboardStranasPK. Err Message: ' . $e->getMessage());
                    }
                }
                //endregion

                //region Pelayanan Publik
                else if ($itemRecord->model_name == 'DashboardCovid19' && $itemRecord->last_id == 0) {
                    try {
                        AppLog::createLog('SCHEDULED_MEILISEARCH', 'INFO', 'Start Processing DashboardCovid19.');

                        $itemMeili = [
                            "id" => "covid19-dashboard",
                            "sector" => self::SECTOR_PELAYANAN_PUBLIK,
                            "category" => self::CATEGORY_COVID,
                            "substance" => self::SUBSTANCE_DASHBOARD,
                            "title" => "Penanganan Covid-19",
                            "content" => 'Penanganan Covid-19',
                            "keywords" => 'dashboard umum, cari wilayah, panduan penanganan covid 19, panduan bansos covid 19, wilayah, provinsi, keluhan, cari, Pantau Anggaran Bansos, Informasi Umum Panduan, Tentang COVID-19, Alur Penanganan COVID-19, Biaya Pelayanan Pasien COVID-19, Insentif dan Santunan bagi Tenaga Kesehatan, Klaim RS atas Biaya Pasien, Vaksin COVID-19, penjelasan, Informasi Umum Panduan, Pengertian Bansos, Bansos Reguler, Bansos pada Masa COVID-19, Anggaran Bansos dan JPS, DTKS secara umum, Penerimaan Bansos, Cek Status Kepesertaan Bansos, Peran serta masyarakat dalam pengawasan, daftar istilah',
                            "FEURL" => "/pelayanan-publik/bansos"
                        ];
                        array_push($dataMeili, $itemMeili);

                        $res = $this->addSingleDocument($itemMeili);

                        $itemRecord->last_id = 1;
                        $itemRecord->last_update_at = date('Y-m-d H:i:s');
                        $itemRecord->save();

                        AppLog::createLog('SCHEDULED_MEILISEARCH', 'INFO', 'SUCCESS Processing DashboardCovid19. Total Data: 1');
                    }
                    catch (Exception $e) {
                        AppLog::createLog('SCHEDULED_MEILISEARCH', 'ERROR', 'FAILED Processing DashboardCovid19. Err Message: ' . $e->getMessage());

                    }
                }
                else if ($itemRecord->model_name == 'DashboardPendidikan' && $itemRecord->last_id == 0) {
                    try {
                        AppLog::createLog('SCHEDULED_MEILISEARCH', 'INFO', 'Start Processing DashboardPendidikan.');

                        $itemMeili = [
                            "id" => "pendidikan-dashboard",
                            "sector" => self::SECTOR_PELAYANAN_PUBLIK,
                            "category" => self::CATEGORY_PENDIDIKAN,
                            "substance" => self::SUBSTANCE_DASHBOARD,
                            "title" => "Pendidikan",
                            "content" => 'Pilih Sekolah untuk melihat profil TK, SD, SMP, SMA, sederajat. Pilih Kampus untuk melihat profil Perguruan Tinggi.',
                            "keywords" => 'dashboard umum, cari pendidikan, Tatacara cek KIP PIP di JAGA, sekolah, kampus, Pendidikan Tingkat TK, SD, SMP dan SMA, Pendidikan tingkat tinggi, lihat PIP Dikdasmen, Lihat PIP Dikti',
                            "FEURL" => "/pelayanan-publik/pendidikan"
                        ];
                        array_push($dataMeili, $itemMeili);

                        $res = $this->addSingleDocument($itemMeili);

                        $itemRecord->last_id = 1;
                        $itemRecord->last_update_at = date('Y-m-d H:i:s');
                        $itemRecord->save();

                        AppLog::createLog('SCHEDULED_MEILISEARCH', 'INFO', 'SUCCESS Processing DashboardPendidikan. Total Data: 1');
                    }
                    catch (Exception $e) {
                        AppLog::createLog('SCHEDULED_MEILISEARCH', 'ERROR', 'FAILED Processing DashboardPendidikan. Err Message: ' . $e->getMessage());
                    }
                }
                else if ($itemRecord->model_name == 'DashboardSekolah' && $itemRecord->last_id == 0) {
                    try {
                        AppLog::createLog('SCHEDULED_MEILISEARCH', 'INFO', 'Start Processing DashboardSekolah.');

                        $itemMeili = [
                            "id" => "sekolah-dashboard",
                            "sector" => self::SECTOR_PELAYANAN_PUBLIK,
                            "category" => self::CATEGORY_SEKOLAH,
                            "substance" => self::SUBSTANCE_DASHBOARD,
                            "title" => "Sekolah",
                            "content" => 'Pilih Sekolah untuk melihat profil TK, SD, SMP, SMA, sederajat.',
                            "keywords" => 'grafik, chart, dashboard sekolah, tracking pip pintar, cari sekolah, Perbandingan Dana BOS Salur dan Dana BOS Dicairkan, Komponen Penggunaan Dana BOS, JDC Dashboard, Program Indonesia Pintar PIP, SMK, NISN, cari sekolah, jenjang, wilayah provinsi/kabupaten/kota, nama sekolah panduan bos bantuan operasional sekolah panduan pip',
                            "FEURL" => "/pelayanan-publik/sekolah"
                        ];
                        array_push($dataMeili, $itemMeili);

                        $res = $this->addSingleDocument($itemMeili);

                        $itemRecord->last_id = 1;
                        $itemRecord->last_update_at = date('Y-m-d H:i:s');
                        $itemRecord->save();

                        AppLog::createLog('SCHEDULED_MEILISEARCH', 'INFO', 'SUCCESS Processing DashboardSekolah. Total Data: 1');
                    }
                    catch (Exception $e) {
                        AppLog::createLog('SCHEDULED_MEILISEARCH', 'ERROR', 'FAILED Processing DashboardSekolah. Err Message: ' . $e->getMessage());
                    }
                }
                else if ($itemRecord->model_name == Sekolah::class) {
                    try {
                        $dataSekolah = Sekolah::query()
                            ->columns("Sekolah.*, Jenjang.nama_jenjang")
                            ->leftJoin("Jenjang", "Jenjang.id = Sekolah.jenjang_id")
                            ->where("Sekolah.no_urut_internal > :id_sekolah:")
                            ->bind([
                                "id_sekolah" => $itemRecord->last_id
                            ])
                            ->limit($limitGet, 0)
                            ->orderBy("Sekolah.no_urut_internal ASC")
                            ->execute()->toArray();
                        if (count($dataSekolah) > 0) {
                            AppLog::createLog('SCHEDULED_MEILISEARCH', 'INFO', 'Start Processing Data Sekolah. Start ID After ' . $itemRecord->last_id . ' and total data: ' . count($dataSekolah) . ' Rows');

                            $lastId = $itemRecord->last_id;
                            $partialDataMeili = [];
                            foreach ($dataSekolah as $itemSekolah) {
                                $itemMeili = [
                                    "id" => "sekolah-" . $itemSekolah['sekolah']->no_urut_internal,
                                    "sector" => self::SECTOR_PELAYANAN_PUBLIK,
                                    "category" => self::CATEGORY_SEKOLAH,
                                    "substance" => self::SUBSTANCE_DETAIL_SEKOLAH,
                                    "title" => $itemSekolah['sekolah']->nama,
                                    "content" => "Nama Sekolah: " . $itemSekolah['sekolah']->nama . ", Provinsi: " . $itemSekolah['sekolah']->provinsi . ", Kota/Kabupaten: " . $itemSekolah['sekolah']->kota_kab . ", Kecamatan: " . $itemSekolah['sekolah']->kecamatan . ", Alamat: " . $itemSekolah['sekolah']->alamat,
                                    "keywords" => 'NPSN ' . $itemSekolah['sekolah']->npsn . " no telepon " . $itemSekolah['sekolah']->no_telp . " email " . $itemSekolah['sekolah']->email . " Kepala Sekolah kepsek " . $itemSekolah['sekolah']->kepsek . " akreditasi " . $itemSekolah['sekolah']->akreditasi . " nsm " . $itemSekolah['sekolah']->nsm . " kode pos " . $itemSekolah['sekolah']->kode_pos . " bentuk pendidikan " . $itemSekolah['sekolah']->bentuk_pendidikan . " kurikulum " . $itemSekolah['sekolah']->kurikulum . " Jenjang " . $itemSekolah['nama_jenjang'] . " informasi umum, map, nomor pokok sekolah nasional, jumlah guru tenaga pendidikan jumlah murid rasio guru dan murid rekapitulasi status profesi guru cari tenaga pendidikan fasilitas sekolah anggaran dan bantuan operasional sekolah bos triwulan tahun anggaran penerapan pak pendidikan anti korupsi",
                                    "FEURL" => "/pelayanan-publik/sekolah/" . $itemSekolah['sekolah']->npsn . "/" . $itemSekolah['sekolah']->nama
                                ];
                                array_push($dataMeili, $itemMeili);
                                array_push($partialDataMeili, $itemMeili);
                                if ($itemSekolah['sekolah']->no_urut_internal > $lastId) $lastId = $itemSekolah['sekolah']->no_urut_internal;
                            }

                            $res = $this->addMultiDocuments($partialDataMeili);

                            $itemRecord->last_id = $lastId;
                            $itemRecord->last_update_at = date('Y-m-d H:i:s');
                            $itemRecord->save();

                            AppLog::createLog('SCHEDULED_MEILISEARCH', 'INFO', 'SUCCESS Processing Data Sekolah. Last ID : ' . $lastId . ' and total data: ' . count($dataSekolah) . ' Rows');
                        }
                    }
                    catch (Exception $e) {
                        AppLog::createLog('SCHEDULED_MEILISEARCH', 'ERROR', 'FAILED Processing Data Sekolah. Err Message: ' . $e->getMessage());
                    }
                }
                else if ($itemRecord->model_name == 'DashboardPerguruanTinggi' && $itemRecord->last_id == 0) {
                    try {
                        AppLog::createLog('SCHEDULED_MEILISEARCH', 'INFO', 'Start Processing DashboardPerguruanTinggi.');

                        $itemMeili = [
                            "id" => "perguruan-tinggi-dashboard",
                            "sector" => self::SECTOR_PELAYANAN_PUBLIK,
                            "category" => self::CATEGORY_PERGURUAN_TINGGI,
                            "substance" => self::SUBSTANCE_DASHBOARD,
                            "title" => "Perguruan Tinggi/Kampus",
                            "content" => 'Pilih Kampus untuk melihat profil Perguruan Tinggi.',
                            "keywords" => 'grafik, chart, dashboard kampus, tracking pip pintar, cari kampus, perbandingan jumlah kampus di indonesia berdasarkankategori kampus institut politeknik sekolah tinggi akademi komunitas universitas akademi jumlah kampus tiap provinsi program indonesia pintar kampus tahun nomor induk mahasiswa nim cari kampus wilayah provinsi kabupaten kota nama kampus panduan pip',
                            "FEURL" => "/pelayanan-publik/universitas"
                        ];
                        array_push($dataMeili, $itemMeili);

                        $res = $this->addSingleDocument($itemMeili);

                        $itemRecord->last_id = 1;
                        $itemRecord->last_update_at = date('Y-m-d H:i:s');
                        $itemRecord->save();

                        AppLog::createLog('SCHEDULED_MEILISEARCH', 'INFO', 'SUCCESS Processing DashboardPerguruanTinggi. Total Data: 1');
                    }
                    catch (Exception $e) {
                        AppLog::createLog('SCHEDULED_MEILISEARCH', 'ERROR', 'FAILED Processing DashboardPerguruanTinggi. Err Message: ' . $e->getMessage());
                    }
                }
                else if ($itemRecord->model_name == PerguruanTinggi::class) {
                    try {
                        $dataPT = PerguruanTinggi::query()
                            ->where("id_pt > :id_pt: AND deleted_at IS NULL")
                            ->bind([
                                "id_pt" => $itemRecord->last_id
                            ])
                            ->limit($limitGet, 0)
                            ->orderBy("id_pt ASC")
                            ->execute()->toArray();
                        if (count($dataPT) > 0) {
                            AppLog::createLog('SCHEDULED_MEILISEARCH', 'INFO', 'Start Processing Data Perguruan Tinggi. Start ID After ' . $itemRecord->last_id . ' and total data: ' . count($dataPT) . ' Rows');

                            $lastId = $itemRecord->last_id;
                            $partialDataMeili = [];
                            foreach ($dataPT as $itemPT) {
                                $itemMeili = [
                                    "id" => "perguruan-tinggi-" . $itemPT['id_pt'],
                                    "sector" => self::SECTOR_PELAYANAN_PUBLIK,
                                    "category" => self::CATEGORY_PERGURUAN_TINGGI,
                                    "substance" => self::SUBSTANCE_DETAIL_PT,
                                    "title" => $itemPT['nama'],
                                    "content" => $itemPT['nama'] . " " . $itemPT['nama_singkat'] . ", Provinsi " . $itemPT['provinsi'] . " Kota/Kabupaten " . $itemPT['kota_kab'],
                                    "keywords" => "Nama " . $itemPT['nama'] . " Nama Singkat " . $itemPT['nama_singkat'] . "  keterangan" . $itemPT['keterangan'] . " status badan hukum badanhukum " . $itemPT['status_badanhukum'] . " akreditasi " . $itemPT['status'] . " no telepon tlp " . $itemPT['telepon'] . " bentuk pendidikan " . $itemPT['bentuk_pendidikan'],
                                    "FEURL" => "/pelayanan-publik/universitas/" . $itemPT['id_pt'] . "/" . $itemPT['kode'] . "/" . $itemPT['nama']
                                ];
                                array_push($dataMeili, $itemMeili);
                                array_push($partialDataMeili, $itemMeili);
                                if ($itemPT['id_pt'] > $lastId) $lastId = $itemPT['id_pt'];
                            }

                            $res = $this->addMultiDocuments($partialDataMeili);

                            $itemRecord->last_id = $lastId;
                            $itemRecord->last_update_at = date('Y-m-d H:i:s');
                            $itemRecord->save();

                            AppLog::createLog('SCHEDULED_MEILISEARCH', 'INFO', 'SUCCESS Processing Data Perguruan Tinggi. Last ID : ' . $lastId . ' and total data: ' . count($dataPT) . ' Rows');
                        }
                    }
                    catch (Exception $e) {
                        AppLog::createLog('SCHEDULED_MEILISEARCH', 'ERROR', 'FAILED Processing Data Perguruan Tinggi. Err Message: ' . $e->getMessage());
                    }
                }
                else if ($itemRecord->model_name == 'DashboardPelabuhan' && $itemRecord->last_id == 0) {
                    try {
                        AppLog::createLog('SCHEDULED_MEILISEARCH', 'INFO', 'Start Processing DashboardPelabuhan.');

                        $itemMeili = [
                            "id" => "pelabuhan-dashboard",
                            "sector" => self::SECTOR_PELAYANAN_PUBLIK,
                            "category" => self::CATEGORY_PELABUHAN,
                            "substance" => self::SUBSTANCE_DASHBOARD,
                            "title" => "Pelabuhan",
                            "content" => 'Cari tahu dan diskusikan informasi tentang Pelabuhan di sekitarmu. Pelajari aksi pencegahan korupsi di pelabuhan dan sampaikan keluhanmu disini',
                            "keywords" => 'dashboard umum, pelabuhan, penanganan keluhan, aksi pencegahan korupsi pelabuhan, Buat keluhan dan simak status penyelesaiannya di 14 pelabuhan pilihan, instansi, Pelabuhan Belawan, Pelabuhan Dumai, Pelabuhan Batu Ampar, Pelabuhan Boom Baru, Pelabuhan Panjang, Pelabuhan Cilegon Mandiri, Pelabuhan Tanjung Priok, Pelabuhan Tanjung Emas, Pelabuhan Tanjung Perak, Pelabuhan Dwikora, Pelabuhan Balikpapan, Pelabuhan Samarinda, Pelabuhan Soekarno-Hatta, Pelabuhan Nusantara Kendari, Pelajari aksi pemangkasan birokrasi dan peningkatan layanan di kawasan pelabuhan oleh kementerian terkait, tahun, Status Penyelesaian Keluhan, Rapor Pelabuhan',
                            "FEURL" => "/pelayanan-publik/pelabuhan"
                        ];
                        array_push($dataMeili, $itemMeili);

                        $res = $this->addSingleDocument($itemMeili);

                        $itemRecord->last_id = 1;
                        $itemRecord->last_update_at = date('Y-m-d H:i:s');
                        $itemRecord->save();

                        AppLog::createLog('SCHEDULED_MEILISEARCH', 'INFO', 'SUCCESS Processing DashboardPelabuhan. Total Data: 1');
                    }
                    catch (Exception $e) {
                        AppLog::createLog('SCHEDULED_MEILISEARCH', 'ERROR', 'FAILED Processing DashboardPelabuhan. Err Message: ' . $e->getMessage());
                    }
                }
                else if ($itemRecord->model_name == 'DashboardDesa' && $itemRecord->last_id == 0) {
                    try {
                        AppLog::createLog('SCHEDULED_MEILISEARCH', 'INFO', 'Start Processing DashboardDesa.');

                        $itemMeili = [
                            "id" => "desa-dashboard",
                            "sector" => self::SECTOR_PELAYANAN_PUBLIK,
                            "category" => self::CATEGORY_DESA,
                            "substance" => self::SUBSTANCE_DASHBOARD,
                            "title" => "Dashboard Umum Desa",
                            "content" => 'Cari tahu dan diskusikan informasi tentang Desa di sekitarmu',
                            "keywords" => 'Dashboard umum Desa, cari desa, Sarana dan Prasarana Pertanian, Hortikultura, Perkebunan, Tanaman Pangan, Peternakan Dan Kesehatan Hewan. alsintan prapanen jumlah alsintan tersalurkan kelompok penerima desa penerima alsintan pascapanen sebaran alsintan prapanen dan pascapanen per provinsi Alsintan Prapanen dan Pascapanen untuk Sarana dan Prasarana merupakan bentuk bantuan pemerintah untuk membantu usaha tani sebaran desa di seluruh Indonesia sebaran jenis alsintan, Gambaran jenis-jenis ALSINTAN PRAPANEN yang disalurkan pemerintah sepanjang tahun. cari desa kabupaten nama desa Bantuan Hortikultura Detail Penerima Manfaat Sarana Pengelolahan Per Komuditas tahun PENERIMA PASCAPANEN MOTOR RODA TIGA BERDASARKAN PROVINSI PENGOLAHAN Sebaran Provinsi Bantuan Direktorat Tanaman Pangan PROGRAM 1000 DESA SAPI PPHNAK panduan desa panduan dana desa tentang desa kewenangan desa penyelenggaraan pemerintah desa badan permusyawaratan desa hak dan kewajiban masyarakat desa peraturan desa keuangan dan aset desa pembangunan desa badan usaha milik desa bumd kerjasama desa pembinaan dan pengawaasn modus korupsi dana desa peran masyarakat pendamping penyusunan rpjm rkp pemerintah desa',
                            "FEURL" => "/pelayanan-publik/desa"
                        ];
                        array_push($dataMeili, $itemMeili);

                        $res = $this->addSingleDocument($itemMeili);

                        $itemRecord->last_id = 1;
                        $itemRecord->last_update_at = date('Y-m-d H:i:s');
                        $itemRecord->save();

                        AppLog::createLog('SCHEDULED_MEILISEARCH', 'INFO', 'SUCCESS Processing DashboardDesa. Total Data: 1');
                    }
                    catch(Exception $e) {
                        AppLog::createLog('SCHEDULED_MEILISEARCH', 'ERROR', 'FAILED Processing DashboardDesa. Err Message: ' . $e->getMessage());
                    }
                }
                else if ($itemRecord->model_name == OmspanMasterDesa::class) {
                    try {

                        $dataDesa = OmspanMasterDesa::query()
                            ->columns('
                        OmspanMasterDesa.id, 
                        OmspanMasterDesa.kode_pemda, 
                        OmspanMasterDesa.kode_lokasi, 
                        OmspanMasterDesa.kode_area, 
                        OmspanMasterDesa.nama_area, 
                        OmspanMasterDesa.kode_provinsi, 
                        OmspanMasterDesa.nama_provinsi, 
                        OmspanMasterDesa.nama_pemda, 
                        OmspanMasterDesa.kode_kecamatan, 
                        OmspanMasterDesa.nama_kecamatan, 
                        OmspanMasterDesa.kode_desa, 
                        OmspanMasterDesa.nama_desa, 
                        MasterKotaKabupaten.kota_kabupaten_name')
                            ->leftjoin("MasterKotaKabupaten", 'OmspanMasterDesa.kode_pemda = MasterKotaKabupaten.kota_kabupaten_code')
                            ->where("OmspanMasterDesa.id > :id_desa:")
                            ->bind([
                                "id_desa" => $itemRecord->last_id
                            ])
                            ->limit($limitGet, 0)
                            ->orderBy("OmspanMasterDesa.id ASC")
                            ->execute()->toArray();
                        if (count($dataDesa) > 0) {
                            AppLog::createLog('SCHEDULED_MEILISEARCH', 'INFO', 'Start Processing Data Desa. Start ID After ' . $itemRecord->last_id . ' and total data: ' . count($dataDesa) . ' Rows');

                            $lastId = $itemRecord->last_id;
                            $partialDataMeili = [];
                            foreach ($dataDesa as $itemDesa) {
                                $itemMeili = [
                                    "id" => "desa-" . $itemDesa['id'],
                                    "sector" => self::SECTOR_PELAYANAN_PUBLIK,
                                    "category" => self::CATEGORY_DESA,
                                    "substance" => self::SUBSTANCE_DETAIL_DESA,
                                    "title" => $itemDesa['nama_desa'],
                                    "content" => 'desa ' . $itemDesa['nama_desa'] . ', kabupaten ' . $itemDesa['kota_kabupaten_name'] . ', kecamatan ' . $itemDesa['nama_kecamatan'] . ', provisi ' . $itemDesa['nama_provinsi'] . ", area/wilayah " . $itemDesa['nama_area'],
                                    "keywords" => "di kabupaten desa kecamatan provinsi area instansi wilayah pelayanan publik sektor tani",
                                    "FEURL" => "/pelayanan-publik/desa/" . $itemDesa['kode_desa'] . "/" . $itemDesa['nama_desa']
                                ];
                                array_push($dataMeili, $itemMeili);
                                array_push($partialDataMeili, $itemMeili);
                                if ($itemDesa['id'] > $lastId) $lastId = $itemDesa['id'];
                            }

                            $res = $this->addMultiDocuments($partialDataMeili);

                            $itemRecord->last_id = $lastId;
                            $itemRecord->last_update_at = date('Y-m-d H:i:s');
                            $itemRecord->save();

                            AppLog::createLog('SCHEDULED_MEILISEARCH', 'INFO', 'SUCCESS Processing Data Desa. Last ID : ' . $lastId . ' and total data: ' . count($dataDesa) . ' Rows');
                        }
                    }
                    catch (Exception $e) {
                        AppLog::createLog('SCHEDULED_MEILISEARCH', 'ERROR', 'FAILED Processing Data Desa. Err Message: ' . $e->getMessage());
                    }
                }
                else if ($itemRecord->model_name == 'DashboardFaskes' && $itemRecord->last_id == 0) {
                    try {
                        AppLog::createLog('SCHEDULED_MEILISEARCH', 'INFO', 'Start Processing DashboardFaskes.');

                        $itemMeili = [
                            "id" => "faskes-dashboard",
                            "sector" => self::SECTOR_PELAYANAN_PUBLIK,
                            "category" => self::CATEGORY_FASKES,
                            "substance" => self::SUBSTANCE_DASHBOARD,
                            "title" => "Dashboard Umum Fasilitas Kesehatan",
                            "content" => 'Cari tahu dan diskusikan informasi tentang Fasilitas Kesehatan di sekitarmu',
                            "keywords" => 'Dashboard umum Fasilitas Kesehatan, Cek kepesertaan JKN, Cari Fasilitas Kesehatan, Puskesmas, rumah sakit, wilayah kabupaten kota faskes nama berdasarkan NIK anda panduan bpjs kesehatan apa itu bpjs kesehatan hak yang yg didapatkan panduan jkn informasi umum kamus istilah dalam pengertian tentang kepesertaan iuran manfaat yang dijamin pelayanan pengaduan penyelesaian sengketa penanganan kecurangan dukungan',
                            "FEURL" => "/pelayanan-publik/fasilitas-kesehatan"
                        ];
                        array_push($dataMeili, $itemMeili);

                        $res = $this->addSingleDocument($itemMeili);

                        $itemRecord->last_id = 1;
                        $itemRecord->last_update_at = date('Y-m-d H:i:s');
                        $itemRecord->save();

                        AppLog::createLog('SCHEDULED_MEILISEARCH', 'INFO', 'SUCCESS Processing DashboardFaskes. Total Data: 1');
                    }
                    catch (Exception $e) {
                        AppLog::createLog('SCHEDULED_MEILISEARCH', 'ERROR', 'FAILED Processing DashboardFaskes. Err Message: ' . $e->getMessage());
                    }
                }
                else if ($itemRecord->model_name == 'DashboardPerizinan' && $itemRecord->last_id == 0) {
                    try {
                        AppLog::createLog('SCHEDULED_MEILISEARCH', 'INFO', 'Start Processing DashboardPerizinan.');

                        $itemMeili = [
                            "id" => "perizinan-dashboard",
                            "sector" => self::SECTOR_PELAYANAN_PUBLIK,
                            "category" => self::CATEGORY_PERIZINAN,
                            "substance" => self::SUBSTANCE_DASHBOARD,
                            "title" => "Perizinan",
                            "content" => 'Cari tahu dan diskusikan informasi tentang Perizinan di wilayahmu',
                            "keywords" => 'Dashboard umum Perizinan, Cari Perizinan, panduan perizinan faq jaga perizinan pelayanan peraturan publik penanam modal PTSP Pelayanan Terpadu Satu Pintu perizinan berusaha nomor induk berusaha nib izin usaha komersial opersaional komitmen cari wilayah provinsi kabupaten kota pemerintah daerah kementerian ',
                            "FEURL" => "/pelayanan-publik/perizinan"
                        ];
                        array_push($dataMeili, $itemMeili);

                        $res = $this->addSingleDocument($itemMeili);

                        $itemRecord->last_id = 1;
                        $itemRecord->last_update_at = date('Y-m-d H:i:s');
                        $itemRecord->save();

                        AppLog::createLog('SCHEDULED_MEILISEARCH', 'INFO', 'SUCCESS Processing DashboardPerizinan. Total Data: 1');
                    }
                    catch(Exception $e) {
                        AppLog::createLog('SCHEDULED_MEILISEARCH', 'ERROR', 'FAILED Processing DashboardPerizinan. Err Message: ' . $e->getMessage());
                    }
                }
                else if ($itemRecord->model_name == PerizinanKontak::class) {
                    try {
                        $dataPerizinan = PerizinanKontak::query()
                            ->where("id > :id:")
                            ->bind([
                                "id" => $itemRecord->last_id
                            ])
                            ->limit($limitGet, 0)
                            ->orderBy("id ASC")
                            ->execute()->toArray();
                        if (count($dataPerizinan) > 0) {
                            AppLog::createLog('SCHEDULED_MEILISEARCH', 'INFO', 'Start Processing Data Perizinan. Start ID After ' . $itemRecord->last_id . ' and total data: ' . count($dataPerizinan) . ' Rows');
                            
                            $lastId = $itemRecord->last_id;
                            $partialDataMeili = [];
                            foreach ($dataPerizinan as $item) {
                                $itemMeili = [
                                    "id" => "perizinan-" . $item['id'],
                                    "sector" => self::SECTOR_PELAYANAN_PUBLIK,
                                    "category" => self::CATEGORY_PERIZINAN,
                                    "substance" => self::SUBSTANCE_DETAIL_PERIZINAN,
                                    "title" => "Perizinan Wilayah " . $item['nama_daerah'],
                                    "content" => 'Detail Perizinan Wilayah ' . $item['nama_daerah'],
                                    "keywords" => 'di wilayah nama daerah perizinan kontak kepala dinas situs telepon nomor fax alamat kantor provinsi kabupaten kementerian kota pemerintah daerah daftar izin dasar usaha komitmen sarana prasaran operasional komersial'
                                        . ' ' . $item['nama_daerah']
                                        . ' ' . $item['kepala_dinas']
                                        . ' ' . $item['alamat_kantor']
                                        . ' ' . $item['provinsi']
                                    ,
                                    "FEURL" => "/pelayanan-publik/perizinan/" . $item['id']
                                ];
                                array_push($dataMeili, $itemMeili);
                                array_push($partialDataMeili, $itemMeili);
                                if ($item['id'] > $lastId) $lastId = $item['id'];
                            }

                            $res = $this->addMultiDocuments($partialDataMeili);
                        
                            $itemRecord->last_id = $lastId;
                            $itemRecord->last_update_at = date('Y-m-d H:i:s');
                            $itemRecord->save();
                            
                            AppLog::createLog('SCHEDULED_MEILISEARCH', 'INFO', 'SUCCESS Processing Data Perizinan. Last ID : ' . $lastId . ' and total data: ' . count($dataPerizinan) . ' Rows');
                        }
                    }
                    catch (Exception $e) {
                        AppLog::createLog('SCHEDULED_MEILISEARCH', 'ERROR', 'FAILED Processing Data Perizinan. Err Message: ' . $e->getMessage());
                    }
                }
                else if ($itemRecord->model_name == 'DashboardPPJ' && $itemRecord->last_id == 0) {
                    try {
                        AppLog::createLog('SCHEDULED_MEILISEARCH', 'INFO', 'Start Processing DashboardPPJ.');

                        $itemMeili = [
                            "id" => "ppj-dashboard",
                            "sector" => self::SECTOR_PELAYANAN_PUBLIK,
                            "category" => self::CATEGORY_PPJ,
                            "substance" => self::SUBSTANCE_DASHBOARD,
                            "title" => "PPJ",
                            "content" => 'Cari tahu dan diskusikan informasi tentang PPJ di wilayahmu',
                            "keywords" => 'Dashboard umum PPJ, Panduan PPJ FAQ Pajak Penerangan Jalan istilah kamus singkat PLN cari kota pemerintah indonesia kota kabupaten rekening tercetak penerimaan pajak penerangan jalan tagihan listrik tunggakan berjalan baru rek rincian tagihan listrik pemerintah daerah kwh ptl angsuran ts',
                            "FEURL" => "/pelayanan-publik/perizinan"
                        ];
                        array_push($dataMeili, $itemMeili);

                        $res = $this->addSingleDocument($itemMeili);

                        $itemRecord->last_id = 1;
                        $itemRecord->last_update_at = date('Y-m-d H:i:s');
                        $itemRecord->save();

                        AppLog::createLog('SCHEDULED_MEILISEARCH', 'INFO', 'SUCCESS Processing DashboardPPJ. Total Data: 1');
                    }
                    catch(Exception $e) {
                        AppLog::createLog('SCHEDULED_MEILISEARCH', 'ERROR', 'FAILED Processing DashboardPPJ. Err Message: ' . $e->getMessage());
                    }
                }
                else if ($itemRecord->model_name == 'DashboardAnggaran' && $itemRecord->last_id == 0) {
                    try {
                        AppLog::createLog('SCHEDULED_MEILISEARCH', 'INFO', 'Start Processing DashboardAnggaran.');

                        $itemMeili = [
                            "id" => "ppj-dashboard",
                            "sector" => self::SECTOR_PELAYANAN_PUBLIK,
                            "category" => self::CATEGORY_ANGGARAN,
                            "substance" => self::SUBSTANCE_DASHBOARD,
                            "title" => "Anggaran",
                            "content" => 'Cari tahu dan diskusikan informasi tentang Anggaran APBD dan TKDD di wilayahmu. Berapa sih Anggaran Pendapatan dan Belanja di daerah? Cari tahu disini!',
                            "keywords" => 'Dashboard umum Anggaran, Panduan PPJ FAQ Pajak Penerangan Jalan istilah kamus singkat PLN cari kota pemerintah indonesia kota kabupaten rekening tercetak penerimaan pajak penerangan jalan tagihan listrik tunggakan berjalan baru rek rincian tagihan listrik pemerintah daerah kwh ptl angsuran ts',
                            "FEURL" => "/pelayanan-publik/apbd"
                        ];
                        array_push($dataMeili, $itemMeili);

                        $res = $this->addSingleDocument($itemMeili);

                        $itemRecord->last_id = 1;
                        $itemRecord->last_update_at = date('Y-m-d H:i:s');
                        $itemRecord->save();

                        AppLog::createLog('SCHEDULED_MEILISEARCH', 'INFO', 'SUCCESS Processing DashboardAnggaran. Total Data: 1');
                    }
                    catch (Exception $e) {
                        AppLog::createLog('SCHEDULED_MEILISEARCH', 'ERROR', 'FAILED Processing DashboardAnggaran. Err Message: ' . $e->getMessage());
                    }
                }
                //endregion

                //region Berita Jaga
                else if ($itemRecord->model_name == 'DashboardBerita' && $itemRecord->last_id == 0) {
                    try {
                        AppLog::createLog('SCHEDULED_MEILISEARCH', 'INFO', 'Start Processing DashboardBerita.');

                        $itemMeili = [
                            "id" => "berita-dashboard",
                            "sector" => self::SECTOR_BERITA_JAGA,
                            "category" => self::CATEGORY_BERITA,
                            "substance" => self::SUBSTANCE_DASHBOARD,
                            "title" => "Berita Jaga",
                            "content" => 'Cari tahu informasi dan berita di aplikasi JAGA',
                            "keywords" => 'kategori berita jaga semua umum pendidikan kesehatan perizinan desa keluhan jendela daerah koordinasi wilayah e-lhkpn gratifikasi spi jejak kasus pendidikan universitas stranas mascot design challenge jaga data challenge berita hangat hot terbaru',
                            "FEURL" => "/berita"
                        ];
                        array_push($dataMeili, $itemMeili);

                        $res = $this->addSingleDocument($itemMeili);

                        $itemRecord->last_id = 1;
                        $itemRecord->last_update_at = date('Y-m-d H:i:s');
                        $itemRecord->save();

                        AppLog::createLog('SCHEDULED_MEILISEARCH', 'INFO', 'SUCCESS Processing DashboardBerita. Total Data: 1');
                    }
                    catch (Exception $e) {
                        AppLog::createLog('SCHEDULED_MEILISEARCH', 'ERROR', 'FAILED Processing DashboardBerita. Err Message: ' . $e->getMessage());
                    }
                }
                else if ($itemRecord->model_name == Diskusi::class) {
                    try {
                        $dataBerita = Diskusi::query()
                            ->columns("Diskusi.*, KategoriDiskusi.title as title_kategori_diskusi, string_agg(Tags.label, ', ') AS tags")
                            ->leftJoin("KategoriDiskusi", "Diskusi.kategori_diskusi_id = KategoriDiskusi.id")
                            ->leftJoin("BeritaTags", "BeritaTags.id_diskusi = Diskusi.id")
                            ->leftJoin("Tags", "BeritaTags.id_tags = Tags.id")
                            ->where("
                            Diskusi.id > :id:
                            AND Diskusi.type = :type:
                            AND Diskusi.is_deleted = :is_deleted:
                        ")
                            ->bind([
                                "id" => $itemRecord->last_id,
                                "type" => 1,
                                "is_deleted" => 0
                            ])
                            ->groupBy("Diskusi.id, KategoriDiskusi.title")
                            ->limit($limitGet, 0)
                            ->orderBy("Diskusi.id ASC")
                            ->execute()->toArray();
                        if (count($dataBerita) > 0) {
                            AppLog::createLog('SCHEDULED_MEILISEARCH', 'INFO', 'Start Processing Data Berita. Start ID After ' . $itemRecord->last_id . ' and total data: ' . count($dataBerita) . ' Rows');

                            $lastId = $itemRecord->last_id;
                            $partialDataMeili = [];
                            foreach ($dataBerita as $itemBerita) {
                                $content = strip_tags($itemBerita['diskusi']->content);
                                $content = preg_replace('/[^A-Za-z0-9]/', ' ', $content);
                                if (strlen($content) > 255) $content = substr($content, 0, 255) . "...";

                                $itemMeili = [
                                    "id" => "berita-" . $itemBerita['diskusi']->id,
                                    "sector" => self::SECTOR_BERITA_JAGA,
                                    "category" => self::CATEGORY_BERITA,
                                    "substance" => self::SUBSTANCE_DETAIL_BERITA,
                                    "title" => "[" . $itemBerita['title_kategori_diskusi'] . "] " . $itemBerita['diskusi']->title,
                                    "content" => $content,
                                    "keywords" => 'kabar berita tentang mengenai ' . $content . ". Tags: " . $itemBerita['tags'],
                                    "FEURL" => "/berita/" . $itemBerita['diskusi']->uuid
                                ];
                                array_push($dataMeili, $itemMeili);
                                array_push($partialDataMeili, $itemMeili);
                                if ($itemBerita['diskusi']->id > $lastId) $lastId = $itemBerita['diskusi']->id;
                            }

                            $res = $this->addMultiDocuments($partialDataMeili);

                            $itemRecord->last_id = $lastId;
                            $itemRecord->last_update_at = date('Y-m-d H:i:s');
                            $itemRecord->save();

                            AppLog::createLog('SCHEDULED_MEILISEARCH', 'INFO', 'SUCCESS Processing Data Berita. Last ID : ' . $lastId . ' and total data: ' . count($dataBerita) . ' Rows');
                        }
                    }
                    catch (Exception $e) {
                        AppLog::createLog('SCHEDULED_MEILISEARCH', 'ERROR', 'FAILED Processing Data Berita. Err Message: ' . $e->getMessage());
                    }
                }
                //endregion

                //region Panduan
                else if ($itemRecord->model_name == 'TentangPanduan' && $itemRecord->last_id == 0) {
                    try {
                        AppLog::createLog('SCHEDULED_MEILISEARCH', 'INFO', 'Start Processing TentangPanduan.');

                        $itemMeili = [
                            "id" => "panduan-tentang",
                            "sector" => self::SECTOR_TENTANG,
                            "category" => self::CATEGORY_PANDUAN,
                            "substance" => self::SUBSTANCE_DASHBOARD,
                            "title" => "Panduan",
                            "content" => 'Beberapa Panduan tentang Aplikasi JAGA',
                            "keywords" => 'tentang, panduan, jaga, bagaimana, cara',
                            "FEURL" => "/tentang/panduan"
                        ];
                        array_push($dataMeili, $itemMeili);

                        $res = $this->addSingleDocument($itemMeili);

                        $itemRecord->last_id = 1;
                        $itemRecord->last_update_at = date('Y-m-d H:i:s');
                        $itemRecord->save();

                        AppLog::createLog('SCHEDULED_MEILISEARCH', 'INFO', 'SUCCESS Processing TentangPanduan. Total Data: 1');
                    }
                    catch (Exception $e) {
                        AppLog::createLog('SCHEDULED_MEILISEARCH', 'ERROR', 'FAILED Processing TentangPanduan. Err Message: ' . $e->getMessage());
                    }
                }
                else if ($itemRecord->model_name == 'Panduan' && $itemRecord->last_id == 0) {
                    try {
                        AppLog::createLog('SCHEDULED_MEILISEARCH', 'INFO', 'Start Processing Panduan.');
                        $partialDataMeili = [];

                        $itemMeili = [
                            "id" => "panduan-bos",
                            "sector" => self::SECTOR_TENTANG,
                            "category" => self::CATEGORY_PANDUAN,
                            "substance" => self::SUBSTANCE_PANDUAN_BOS,
                            "title" => "Panduan BOS",
                            "content" => 'Bantuan Operasional Satuan Pendidikan (BOSP) adalah bantuan keuangan dari pemerintah yang diberikan ke sekolah untuk membiayai kegiatan operasional rutin Satuan Pendidikan.',
                            "keywords" => MeiliSearchKeywords::PANDUAN_BOS,
                            "FEURL" => "/tentang/panduan/bos"
                        ];
                        array_push($dataMeili, $itemMeili);
                        array_push($partialDataMeili, $itemMeili);

                        $itemMeili = [
                            "id" => "panduan-pip-sekolah",
                            "sector" => self::SECTOR_TENTANG,
                            "category" => self::CATEGORY_PANDUAN,
                            "substance" => self::SUBSTANCE_PANDUAN_PIP_SEKOLAH,
                            "title" => "Panduan PIP Sekolah",
                            "content" => 'Program Indonesia Pintar (PIP) melalui Kartu Indonesia Pintar (KIP) adalah pemberian bantuan tunai pendidikan kepada anak usia sekolah (usia 6 - 21 tahun) dari keluarga miskin/rentan miskin.',
                            "keywords" => MeiliSearchKeywords::PANDUAN_PIP_SEKOLAH,
                            "FEURL" => "/tentang/panduan/pip-sekolah"
                        ];
                        array_push($dataMeili, $itemMeili);
                        array_push($partialDataMeili, $itemMeili);

                        $itemMeili = [
                            "id" => "panduan-pip-kampus",
                            "sector" => self::SECTOR_TENTANG,
                            "category" => self::CATEGORY_PANDUAN,
                            "substance" => self::SUBSTANCE_PANDUAN_PIP_KAMPUS,
                            "title" => "Panduan PIP Kampus",
                            "content" => 'Program Indonesia Pintar adalah bantuan berupa uang tunai, perluasan akses, dan kesempatan belajar dari pemerintah yang diberikan kepada peserta didik dan mahasiswa yang berasal dari keluarga miskin atau rentan miskin untuk membiayai pendidikan. (Sumber: Permendikbud No 10 th 2020)',
                            "keywords" => MeiliSearchKeywords::PANDUAN_PIP_KAMPUS,
                            "FEURL" => "/tentang/panduan/pip-kampus"
                        ];
                        array_push($dataMeili, $itemMeili);
                        array_push($partialDataMeili, $itemMeili);

                        $itemMeili = [
                            "id" => "panduan-penanganan-covid",
                            "sector" => self::SECTOR_TENTANG,
                            "category" => self::CATEGORY_PANDUAN,
                            "substance" => self::SUBSTANCE_PANDUAN_PENANGANAN_COVID,
                            "title" => "Panduan Penanganan Covid-19",
                            "content" => 'Panduan Penanganan Covid-19',
                            "keywords" => MeiliSearchKeywords::PANDUAN_PENANGANAN_COVID,
                            "FEURL" => "/tentang/panduan/penanganan-covid19"
                        ];
                        array_push($dataMeili, $itemMeili);
                        array_push($partialDataMeili, $itemMeili);

                        $itemMeili = [
                            "id" => "panduan-bansos-covid",
                            "sector" => self::SECTOR_TENTANG,
                            "category" => self::CATEGORY_PANDUAN,
                            "substance" => self::SUBSTANCE_PANDUAN_BANSOS_COVID,
                            "title" => "Panduan Bansos Covid-19",
                            "content" => 'Bantuan Sosial - berupa uang, barang, atau jasa kepada seseorang, keluarga, kelompok atau masyarakat miskin, tidak mampu, dan/atau rentan terhadap risiko sosial (Perpres 63 Tahun 2017)',
                            "keywords" => MeiliSearchKeywords::PANDUAN_BANSOS_COVID,
                            "FEURL" => "/tentang/panduan/bansos-covid19"
                        ];
                        array_push($dataMeili, $itemMeili);
                        array_push($partialDataMeili, $itemMeili);

                        $itemMeili = [
                            "id" => "panduan-desa",
                            "sector" => self::SECTOR_TENTANG,
                            "category" => self::CATEGORY_PANDUAN,
                            "substance" => self::SUBSTANCE_PANDUAN_DESA,
                            "title" => "Panduan Desa",
                            "content" => 'Desa adalah kesatuan masyarakat hukum yang memiliki batas wilayah yang berwenang untuk mengatur dan mengurus urusan pemerintahan, kepentingan masyarakat setempat berdasarkan prakarsa masyarakat, hak asal usul, dan/atau hak tradisional yang diakui dan dihormati dalam sistem pemerintahan NKRI.',
                            "keywords" => MeiliSearchKeywords::PANDUAN_DESA,
                            "FEURL" => "/tentang/panduan/desa"
                        ];
                        array_push($dataMeili, $itemMeili);
                        array_push($partialDataMeili, $itemMeili);

                        $itemMeili = [
                            "id" => "panduan-dana-desa",
                            "sector" => self::SECTOR_TENTANG,
                            "category" => self::CATEGORY_PANDUAN,
                            "substance" => self::SUBSTANCE_PANDUAN_DANA_DESA,
                            "title" => "Panduan Dana Desa",
                            "content" => 'Panduan Dana Desa',
                            "keywords" => MeiliSearchKeywords::PANDUAN_DANA_DESA,
                            "FEURL" => "/tentang/panduan/dana-desa"
                        ];
                        array_push($dataMeili, $itemMeili);
                        array_push($partialDataMeili, $itemMeili);

                        $itemMeili = [
                            "id" => "panduan-jkn",
                            "sector" => self::SECTOR_TENTANG,
                            "category" => self::CATEGORY_PANDUAN,
                            "substance" => self::SUBSTANCE_PANDUAN_JKN,
                            "title" => "Panduan JKN",
                            "content" => 'Jaminan Kesehatan Nasional (JKN) merupakan jaminan berupa perlindungan kesehatan agar peserta memperoleh manfaat pemeliharaan kesehatan dan perlindungan dalam memenuhi kebutuhan dasar kesehatan yang diberikan kepada setiap orang yang telah membayar Iuran Jaminan Kesehatan, atau Iuran Jaminan Kesehatannya dibayar oleh Pemerintah Pusat maupun Pemerintah Daerah.',
                            "keywords" => MeiliSearchKeywords::PANDUAN_JKN,
                            "FEURL" => "/tentang/panduan/jkn"
                        ];
                        array_push($dataMeili, $itemMeili);
                        array_push($partialDataMeili, $itemMeili);

                        $itemMeili = [
                            "id" => "panduan-perizinan",
                            "sector" => self::SECTOR_TENTANG,
                            "category" => self::CATEGORY_PANDUAN,
                            "substance" => self::SUBSTANCE_PANDUAN_PERIZINAN,
                            "title" => "Panduan Perizinan",
                            "content" => 'Perizinan dapat diartikan sebagai suatu persetujuan dari penguasa berdasarkan peraturan perundang - undangan untuk memperbolehkan melakukan suatu tindakan atau perbuatan tertentu. Intinya, Pemerintah menggunakan izin sebagai sarana yuridis untuk mengemudikan tingkah laku para warga. Nah, perizinan yang ada di JAGA ini khusus untuk Perizinan Berusaha.',
                            "keywords" => MeiliSearchKeywords::PANDUAN_PERIZINAN,
                            "FEURL" => "/tentang/panduan/perizinan"
                        ];
                        array_push($dataMeili, $itemMeili);
                        array_push($partialDataMeili, $itemMeili);

                        $itemMeili = [
                            "id" => "panduan-ppj",
                            "sector" => self::SECTOR_TENTANG,
                            "category" => self::CATEGORY_PANDUAN,
                            "substance" => self::SUBSTANCE_PANDUAN_PPJ,
                            "title" => "Panduan PPJ",
                            "content" => 'Merujuk Pasal 1 angka 28 UU PDRD, pajak penerangan jalan adalah pajak atas penggunaan tenaga listrik, baik yang dihasilkan sendiri maupun diperoleh dari sumber lain. PPJ digunakan untuk menyediakan dan memelihara penerangan jalan oleh pemerintah daerah',
                            "keywords" => MeiliSearchKeywords::PANDUAN_PPJ,
                            "FEURL" => "/tentang/panduan/ppj"
                        ];
                        array_push($dataMeili, $itemMeili);
                        array_push($partialDataMeili, $itemMeili);

                        $res = $this->addMultiDocuments($partialDataMeili);

                        $itemRecord->last_id = 1;
                        $itemRecord->last_update_at = date('Y-m-d H:i:s');
                        $itemRecord->save();
                        AppLog::createLog('SCHEDULED_MEILISEARCH', 'INFO', 'SUCCESS Processing Panduan. Total Data: ' . count($partialDataMeili));
                    }
                    catch (Exception $e) {
                        AppLog::createLog('SCHEDULED_MEILISEARCH', 'ERROR', 'FAILED Processing Panduan. Err Message: ' . $e->getMessage());
                    }
                }
                //endregion
            }

            $res = 0;
            $this->objectsProcessed = count($dataMeili);
            AppLog::createLog('SCHEDULED_MEILISEARCH', 'INFO', 'FINISHED Processing Meilisearch. Total Data: ' . count($dataMeili));

//            if (count($dataMeili) > 0) {
//                $this->createLogInfo("Add Documents To Meilisearch", count($dataMeili));
//                //NOTE: Comment salah satu method
//                //region add multiple documents method
//                if (count($dataMeili) > $limitAdd) {
//                    $totalData = count($dataMeili);
//                    for ($i = 0; $i <= $totalData; $i = $i + $limitAdd) {
//                        if ($i + $limitAdd > $totalData)
//                            $res = $this->addMultiDocuments(array_slice($dataMeili, $i, $totalData % $limitAdd));
//                        else
//                            $res = $this->addMultiDocuments(array_slice($dataMeili, $i, $limitAdd));
//                    }
//                } else {
//                    $res = $this->addMultiDocuments($dataMeili);
//                }
//                //endregion
//
//                //region add single documents method
//                /*foreach ($dataMeili as $itemMeili) {
//                    $res = $this->addSingleDocument($itemMeili);
//                }*/
//                //endregion
//            }

            return $res;
        }
        catch (Exception $ex) {
            throw $ex;
        }
    }

    private function checkNonExistModel($recordMeili)
    {
        $recordMeiliArr = array_column($recordMeili->toArray(), 'model_name');

        $missingValues = [];

        foreach (self::MODEL_LIST as $item) {
            if (!in_array($item, $recordMeiliArr)) {
                $missingValues[] = $item;
            }
        }

        $latestRecord = $recordMeili;

        if(count($missingValues) > 0) {
            foreach ($missingValues as $missingItem) {
                $newItem = new MeilisearchRecord();
                $newItem->model_name = $missingItem;
                $newItem->last_id = 0;
                $newItem->save();
            }

            $latestRecord = MeilisearchRecord::find(['order' => 'id ASC']);
        }

        return $latestRecord;
    }

    private function createLogInfo($logDesc, $objectProcessed) {
        LogHelper::logInfo(
            "Process MeiliSearch - " . $logDesc,
            microtime(true),
            microtime(true),
            [
                ":objects_processed" => $objectProcessed
            ],
            "scheduled_job_log",
            $this->controller->logger
        );
    }
}