<?php

namespace DetailTask;

use LogHelper;
use RumahSakit;
use RumahSakit2Client;

/**
 * @property RumahSakit2Client $client
 */
class KemkesTask extends AbstractTask {
    #region Attributes
    private $processedRumahSakit;
    #endregion

    #region Main
    public function init()
    {
        $this->client = new RumahSakit2Client($this->config["rumahsakit2_config"]);
        $this->client->setLogger($this->logger);
        $this->processName = "Process Kemkes Rumah Sakit Task";
        $this->processedRumahSakit = 0;
    }

    /**
     * @return void
     * Log disimpan ke file log & table api_errors
     */
    public function processRumahSakit() {
        try {
            $this->init();
            $startTime = microtime(true);
            $result = $this->client->getDataRS();
            $data = $result['Data RS'];
            foreach ($data as $item) {
                $this->saveDataRumahSakit($item);
            }
            LogHelper::logInfo(
                $this->processName,
                $startTime,
                microtime(true),
                [
                    ":processed_rumah_sakit" => $this->processedRumahSakit
                ],
                self::LOG_TYPE,
                $this->logger
            );
        } catch (\Exception $e) {
            // skip
        }
    }
    #endregion

    #region Helper
    private function saveDataRumahSakit($data) {
        if($data['koders'] != null) {
            try {
                $rumahSakit = RumahSakit::findFirst([
                    'conditions' => 'kode_rs = :koders:',
                    'bind' => [
                        'koders' => $data['koders']
                    ]
                ]);
                if (empty($rumahSakit)) $rumahSakit = new RumahSakit();
                $rumahSakit->kode_rs = $data['koders']; //varchar
                $rumahSakit->nama = $data['namars']; //varchar
                $rumahSakit->jenis_rs = $data['jenis']; //varchar
                $rumahSakit->direktur_rs = $data['direktur_rs']; //varchar
                $rumahSakit->alamat_rs = $data['alamat_rs']; //varchar
                $rumahSakit->provinsi = $data['propinsi']; //varchard
                $rumahSakit->kab_kota = $data['kabupaten']; //varchar
                $rumahSakit->telepon = $data['telp_rs']; //varchar
                if(!empty($data['email']) && $data['email'] != '-') { //varchar
                    if(strpos($data['email'], '/') !== false) {
                        $emails = explode('/', $data['email']);
                        $rumahSakit->email = trim($emails[0]);
                    }
                    elseif(filter_var($data['email'], FILTER_VALIDATE_EMAIL)) {
                        $rumahSakit->email = trim($data['email']);
                    }
                }
                $rumahSakit->website = $data['web']; //varchar

                //luas_tanah sama luas_bangunan, responsenya masih aneh dari kemenkesnya
                //handling: jika numeric, nilai di parse ke integer, sesuai tipe field di database
                if(is_numeric($data['luas_tanah'])) //numeric
                    $rumahSakit->luas_tanah = intval($data['luas_tanah']);
                if (array_key_exists('luas_bangungan', $data)) { //numeric
                    if(is_numeric($data['luas_bangungan']))
                        $rumahSakit->luas_bangunan = intval($data['luas_bangungan']);
                } elseif (array_key_exists('luas_bangunan', $data)) { //numeric
                    if(is_numeric($data['luas_bangunan']))
                        $rumahSakit->luas_bangunan = intval($data['luas_bangunan']);
                }
                $rumahSakit->no_surat_ijin = $data['no_surat_ijin']; //varchar
                $rumahSakit->layanan_unggulan = $data['layanan_unggulan']; //varchar

                $rumahSakit->kls_rs = empty($data['kls_rs']) ? null : (filter_var($data['kls_rs'], FILTER_VALIDATE_INT) ? $data['kls_rs'] : null); //int2, dari API lama, kelas berupa alfabet (B, C, D), data saat ini berupa angka (3)
                $rumahSakit->kode_prop = empty($data['kode_prop']) ? null : (filter_var($data['kode_prop'], FILTER_VALIDATE_INT) ? $data['kode_prop'] : null); //int2, belum ada field kode prop di DB
                $rumahSakit->kode_kab = empty($data['kode_kab']) ? null : (filter_var($data['kode_kab'], FILTER_VALIDATE_INT) ? $data['kode_kab'] : null); //int2, belum ada field kode kab di DB
                $rumahSakit->kodepos = $data['kodepos']; //varchar, field belum ada
                $rumahSakit->penyelenggara = $data['penyelenggara']; //varchar, field belum ada
                $rumahSakit->blu = $data['blu']; //varchar, field belum ada & ini field untuk apa?
                $rumahSakit->fax_rs = $data['fax_rs']; //varchar, field belum ada
                $rumahSakit->telp_humas = $data['telp_humas']; //varchar, field belum ada
                if($data['tgl_surat_ijin'] != '0000-00-00') //date
                    $rumahSakit->tgl_surat_ijin = $data['tgl_surat_ijin']; //field belum ada
                $rumahSakit->sifat_surat_ijin = $data['sifat_surat_ijin']; //varchar, field belum ada
                $rumahSakit->masa_berlaku_surat_ijin = date('Y-m-d', strtotime(str_replace('/', '-', $rumahSakit->masa_berlaku_surat_ijin))); //date, field belum ada
                $rumahSakit->tahap_akreditasi = $data['tahap_akreditasi']; //varchar, field belum ada
                $rumahSakit->ambulan = $data['ambulan']; //varchar, field belum ada
                $rumahSakit->simrs = $data['simrs']; //varchar, field belum ada
                $rumahSakit->bank_darah = $data['bank_darah']; //varchar, field belum ada
                if($data['masa_berlaku_akreditasi'] != '0000-00-00') //date
                    $rumahSakit->masa_berlaku_akreditasi = $data['masa_berlaku_akreditasi']; //field belum ada
                $rumahSakit->tahun_berdiri = $data['tahun_berdiri']; //varchar
                if($data['tgl_update'] != '0000-00-00') //date
                    $rumahSakit->tgl_update = $data['tgl_update'];

                $rumahSakit->last_update = 'now()';

                $status = $rumahSakit->save();
                if (!$status) {
                    $errors = $rumahSakit->getMessages();
                    $error_messages = [];

                    foreach ($errors as $key => $err) {
                        $error_messages[] = ["field" => $err->getField(), "message" => $err->getMessage()];
                    }

                    throw new \ValidationException($error_messages);
                }
                $this->processedRumahSakit++;
            }
            catch (\Exception $e) {
                print_r($e->getMessage());
            }
        }
    }
    #endregion
}
