<?php

/**
 * Function dari scheduled task yang sudah tidak berjalan
 * param: function
 * rs: processRs
 * puskesmas: processDataPuskesmas
 * sipd: processDataSipd
 * job_notif_error: processJobError
 */
class UnusedTask extends ScheduledTask {
    private function processRs()
    {
        $rsClient = new RumahSakitClient($this->config["rs_prop"]);
        $rsClient->setLogger($this->logger);
        try {
            $rsClient->updateAllProfile();
            LogHelper::logInfo(
                "Process Rumah Sakit",
                $rsClient->getStartTime(),
                $rsClient->getEndTime(),
                [
                    "objects_processed" => $rsClient->getObjectsProcessed()
                ],
                self::LOG_TYPE,
                $this->logger
            );
        } catch (\Exception $e) {
            \Sentry\captureException($e);
            $this->logApiError("Rumah Sakit - Update All", "tahun=2018", $rsClient->getErrorBody());
        }
    }

    private function processDataPuskesmas()
    {
        $client = new PuskesmasClient($this->config["puskesmas_prop"]);
        $client->setLogger($this->logger);
        try {
            $client->getDataDasar1();
            LogHelper::logInfo(
                "Process Data Dasar Puskesmas 1",
                $client->getStartTime(),
                $client->getEndTime(),
                [
                    "objects_processed" => $client->getObjectsProcessed()
                ],
                self::LOG_TYPE,
                $this->logger
            );
        } catch (Exception $e) {
            \Sentry\captureException($e);
            $this->logApiError("Process Data Dasar Puskesmas 1", "", $client->getErrorBody());
        }

        try {
            $client->getDataDasar2();
            LogHelper::logInfo(
                "Process Data Dasar Puskesmas 2",
                $client->getStartTime(),
                $client->getEndTime(),
                [
                    "objects_processed" => $client->getObjectsProcessed()
                ],
                self::LOG_TYPE,
                $this->logger
            );
        } catch (Exception $e) {
            \Sentry\captureException($e);
            $this->logApiError("Process Data Dasar Puskesmas 2", "", $client->getErrorBody());
        }

        try {
            $client->getDataDasar7();
            LogHelper::logInfo(
                "Process Data Dasar Puskesmas 7",
                $client->getStartTime(),
                $client->getEndTime(),
                [
                    "objects_processed" => $client->getObjectsProcessed()
                ],
                self::LOG_TYPE,
                $this->logger
            );
        } catch (Exception $e) {
            \Sentry\captureException($e);
            $this->logApiError("Process Data Dasar Puskesmas 7", "", $client->getErrorBody());
        }

        try {
            $client->getDataDasar8();
            LogHelper::logInfo(
                "Process Data Dasar Puskesmas 8",
                $client->getStartTime(),
                $client->getEndTime(),
                [
                    "objects_processed" => $client->getObjectsProcessed()
                ],
                self::LOG_TYPE,
                $this->logger
            );
        } catch (Exception $e) {
            \Sentry\captureException($e);
            $this->logApiError("Process Data Dasar Puskesmas 8", "", $client->getErrorBody());
        }
    }

    private function processDataSipd()
    {
        $rsClient = new SipdKemendagriClient($this->config["sipd_kemendagri_config"]);
        $rsClient->setLogger($this->logger);

        $entries = SipdJobEntries::find();

        foreach ($entries as $key => $entry) {
            $additionalData = [
                'fetch_api' => 'sipd_skpd',
                'kode_pemda' => $entry->kode_pemda,
                'tahun' => $entry->tahun,
                'index' => $key
            ];

            try {
                $result = $rsClient->rkpd($entry->tahun, $entry->kode_pemda);
                foreach ($result as $key => $item) {
                    $bidangList = SipdMasterBidang::find([
                        'conditions' => 'kode=:kode:',
                        'bind' => [
                            'kode' => $item['kodebidang'],
                        ]
                    ]);
                    $bidang = null;

                    if (count($bidangList) < 1) {
                        $bidang = new SipdMasterBidang;
                        $bidang->kode = $item['kodebidang'];
                        $bidang->urai = $item['uraibidang'];
                        $bidang->save();
                    } else {
                        $bidang = $bidangList[0];
                    }

                    $skpdList = SipdSkpd::find([
                        'conditions' => 'kode=:kode: AND tahun=:tahun:',
                        'bind' => [
                            'kode' => $item['kodeskpd'],
                            'tahun' => $item['tahun']
                        ]
                    ]);
                    $skpd = null;

                    if (count($skpdList) < 1) {
                        $skpd = new SipdSkpd;
                        $skpd->kode = $item['kodeskpd'];
                        $skpd->tahun = $item['tahun'];
                    } else {
                        $skpd = $skpdList[0];
                    }

                    $skpd->urai = $item['uraiskpd'];
                    $skpd->kode_pemda = $item['kodepemda'];
                    $skpd->kode_bidang = $item['kodebidang'];
                    $skpd->urai_urusan = $item['uraiurusan'];
                    $skpd->pejabat = json_encode($item['pejabat']);
                    $skpd->pilihan_bidang = json_encode($item['pilihanbidang']);
                    $skpd->save();

                    foreach ($item['program'] as $key => $programItem) {
                        $programList = SipdMasterProgram::findByKode($programItem['kodeprogram']);
                        $program = null;

                        if (count($programList) < 1) {
                            $program = new SipdMasterProgram;
                            $program->kode = $programItem['kodeprogram'];
                        } else {
                            $program = $programList[0];
                        }
                        $program->kode_bidang = $programItem['kodebidang'];
                        $program->urai = $programItem['uraiprogram'];
                        $program->save();

                        $sipdProgramList = SipdProgram::find([
                            'conditions' => 'id_skpd=:id_skpd: AND id_program=:id_program:',
                            'bind' => [
                                'id_skpd' => $skpd->id,
                                'id_program' => $program->id
                            ]
                        ]);
                        $sipdProgram = null;

                        if (count($sipdProgramList) < 1) {
                            $sipdProgram = new SipdProgram;
                            $sipdProgram->id_skpd = $skpd->id;
                            $sipdProgram->id_program = $program->id;
                            $sipdProgram->save();
                        } else {
                            $sipdProgram = $sipdProgramList[0];
                        }

                        foreach ($programItem['kegiatan'] as $key => $kegiatanItem) {
                            $kegiatanList = SipdKegiatan::find([
                                'conditions' => 'id_sipd_program=:id_sipd_program: AND kode=:kode:',
                                'bind' => [
                                    'id_sipd_program' => $sipdProgram->id,
                                    'kode' => $kegiatanItem['kodekegiatan']
                                ]
                            ]);

                            $kegiatan = null;

                            if (count($kegiatanList) < 1) {
                                $kegiatan = new SipdKegiatan;
                                $kegiatan->id_sipd_program = $sipdProgram->id;
                                $kegiatan->kode = $kegiatanItem['kodekegiatan'];
                            } else {
                                $kegiatan = $kegiatanList[0];
                            }
                            $kegiatan->urai = $kegiatanItem['uraikegiatan'];
                            $kegiatan->pagu = $kegiatanItem['pagu'];
                            $kegiatan->sumber_dana = json_encode($kegiatanItem['sumberdana']);
                            $kegiatan->prioritas = json_encode($kegiatanItem['prioritas']);
                            $kegiatan->lokasi = json_encode($kegiatanItem['lokasi']);
                            $kegiatan->save();

                            foreach ($kegiatanItem['indikator'] as $key => $indikatorItem) {
                                $indikatorList = SipdIndikator::find([
                                    'conditions' => 'kode=:kode: AND id_kegiatan=:id_kegiatan:',
                                    'bind' => [
                                        'kode' => $indikatorItem['kodeindikator'],
                                        'id_kegiatan' => $kegiatan->id
                                    ]
                                ]);
                                $indikator = null;

                                if (count($indikatorList) < 1) {
                                    $indikator = new SipdIndikator;
                                    $indikator->id_kegiatan = $kegiatan->id;
                                    $indikator->kode = $indikatorItem['kodeindikator'];
                                } else {
                                    $indikator = $indikatorList[0];
                                }

                                $indikator->jenis = $indikatorItem['jenis'];
                                $indikator->tolok_ukur = $indikatorItem['tolokukur'];
                                $indikator->satuan = $indikatorItem['satuan'];
                                $indikator->real_p3 = $indikatorItem['real_p3'];
                                $indikator->pagu_p3 = $indikatorItem['pagu_p3'];
                                $indikator->real_p2 = $indikatorItem['real_p2'];
                                $indikator->pagu_p2 = $indikatorItem['pagu_p2'];
                                $indikator->real_p1 = $indikatorItem['real_p1'];
                                $indikator->pagu_p1 = $indikatorItem['pagu_p1'];
                                $indikator->target = $indikatorItem['target'];
                                $indikator->pagu = $indikatorItem['pagu'];
                                $indikator->pagu_p = $indikatorItem['pagu_p'];
                                $indikator->target_n1 = $indikatorItem['target_n1'];
                                $indikator->pagu_n1 = $indikatorItem['pagu_n1'];
                                $indikator->save();
                            }
                        }

                        foreach ($programItem['capaian'] as $key => $capaianItem) {
                            $capaianList = SipdProgramCapaian::find([
                                'conditions' => 'id_sipd_program=:id_sipd_program: AND kode_indikator=:kode_indikator:',
                                'bind' => [
                                    'id_sipd_program' => $sipdProgram->id,
                                    'kode_indikator' => $capaianItem['kodeindikator']
                                ]
                            ]);
                            $capaian = null;

                            if (count($capaianList) < 1) {
                                $capaian = new SipdProgramCapaian;
                                $capaian->kode_indikator = $capaianItem['kodeindikator'];
                                $capaian->id_sipd_program = $sipdProgram->id;
                            } else {
                                $capaian = $capaianList[0];
                            }

                            $capaian->tolok_ukur = $capaianItem['tolokukur'];
                            $capaian->satuan = $capaianItem['satuan'];
                            $capaian->real_p3 = $capaianItem['real_p3'];
                            $capaian->pagu_p3 = $capaianItem['pagu_p3'];
                            $capaian->real_p2 = $capaianItem['real_p2'];
                            $capaian->pagu_p2 = $capaianItem['pagu_p2'];
                            $capaian->real_p1 = $capaianItem['real_p1'];
                            $capaian->pagu_p1 = $capaianItem['pagu_p1'];
                            $capaian->target = $capaianItem['target'];
                            $capaian->pagu = $capaianItem['pagu'];
                            $capaian->pagu_p = $capaianItem['pagu_p'];
                            $capaian->target_n1 = $capaianItem['target_n1'];
                            $capaian->pagu_n1 = $capaianItem['pagu_n1'];
                            $capaian->save();
                        }
                    }
                }
                $additionalData['status_fetch'] = 1;
            } catch (Exception $e) {
                \Sentry\captureException($e);
                $additionalData['status_fetch'] = 0;
                $additionalData['error_message'] = $e->getMessage();
            }

            $additionalData["objects_processed"] = $rsClient->getObjectsProcessed();

            LogHelper::logInfo(
                "Process SIPD",
                $rsClient->getStartTime(),
                $rsClient->getEndTime(),
                $additionalData,
                self::LOG_TYPE,
                $this->logger
            );
        }
    }

    private function processJobError()
    {
        $apiLog = new ApiErrorsService($this->config);
        $apiLog->process_notif_job();
    }
}
