<?php

use DetailTask\BpjsPuskesmasTask;
use DetailTask\EmisKemenagTask;
use DetailTask\KemdikbudBosTask;
use DetailTask\KemendesaTask;
use DetailTask\KemenkeuTask;
use DetailTask\KemkesTask;
use DetailTask\LocalTask;
use DetailTask\OmspanDesaTask;
use DetailTask\PipMadrasahTask;
use DetailTask\PpjTask;
use DetailTask\RumahSakitOnlineTask;
use DetailTask\SekolahTask;
use DetailTask\WordCloudDiskusiPendidikanTask;
use Phalcon\Cli\Task;

/**
 * @property BaseKvLogger $logger
 */
class ScheduledTask extends Task
{
    const LOG_TYPE = "scheduled_job_log";

    public function mainAction(array $params)
    {
        try {
            if ((getenv("SENTRY_ENABLED") ?: 'FALSE') == 'TRUE') {
                Sentry\init([
                    'dsn' => getenv("SENTRY_DSN"),
                    'environment' => (getenv("SENTRY_ENVIRONMENT") ?: 'test'),
                ]);
            }

            if ($params[0] === "sekolah") {
                #region sekolah
                $task = new SekolahTask();
                $debug = isset($params[2]) ?? null;
                $task->processSekolah($params[1], $debug);
                #endregion
            } elseif ($params[0] === "rs") {
                #region rs
                $task = new RumahSakitOnlineTask();
                $task->processRumahSakit();
                $task->processKetersediaanTt();
                #endregion
            } elseif ($params[0] === "omspan_desa") {
                #region omspan_desa
                $type = (int) $params[1];
                $task = new OmspanDesaTask();
                $task->processDanaDesa($type);
                #endregion
            } elseif ($params[0] === "log_email") {
                #region log_email
                $task = new LocalTask();
                $task->processLogEmail();
                #endregion
            } elseif ($params[0] === "log_notification") {
                #region log_notification
                $task = new LocalTask();
                $task->processLogNotification();
                #endregion
            } elseif ($params[0] === "notif_quota") {
                #region notif_quota
                $task = new LocalTask();
                $task->processNotifQuota();
                #endregion
            } elseif ($params[0] === "process_recommendation") {
                #region process_recommendation
                $task = new LocalTask();
                $task->processRecommendation();
                #endregion
            } elseif ($params[0] === "log_api_error") {
                #region log_api_error
                $task = new LocalTask();
                $task->processLogApiError();
                #endregion
            } elseif ($params[0] === "elhkpn_mart") {
                #region elhkpn_mart
                $year = $params[1] ?? null;
                $task = new LocalTask();
                $task->processElhkpnMart($year);
                #endregion
            } elseif ($params[0] === "meilisearch") {
                #region meilisearch
                $task = new LocalTask();
                $task->processMeilisearch();
                #endregion
            } elseif ($params[0] === "bpjs_puskesmas") {
                #region bpjs_puskesmas
                $task = new BpjsPuskesmasTask();
                $task->processBpjsPuskesmas();
                #endregion
            } elseif ($params[0] === "bpjs_puskesmas_kapitasi") {
                #region bpjs_puskesmas_kapitasi
                $task = new BpjsPuskesmasTask();
                $task->processBpjsPuskesmasKapitasi();
                #endregion
            } elseif ($params[0] === "rs2") {
                #region rs2
                $task = new KemkesTask();
                $task->processRumahSakit();
                #endregion
            } elseif ($params[0] === "ppj") {
                #region ppj
                $type = $params[1] ?? null;
                $task = new PpjTask();
                $task->processPpj($type);
                #endregion
            } elseif ($params[0] === "emis_kemenag") {
                #region emis_kemenag
                $task = new EmisKemenagTask();
                $task->processMadrasah();
                #endregion
            } elseif ($params[0] === "kemendesa_idm") {
                #region kemendesa_idm
                $task = new KemendesaTask();
                $task->processIdm();
                #endregion
            } elseif ($params[0] === "kemendesa_bumdes") {
                #region kemendesa_idm
                $task = new KemendesaTask();
                $task->processBumdes();
                #endregion
            } elseif ($params[0] === "kemenkeu") {
                #region kemenkeu
                $type = $params[1] ?? 'daily';
                $task = new KemenkeuTask();
                $task->process($type);
                #endregion
            } elseif ($params[0] === "penerima_bos") {
                #region penerima_bos
                $tahun = $params[1] ?? null;
                $task = new KemdikbudBosTask();
                $task->processPenerimaBos($tahun);
                #endregion
            } elseif ($params[0] === "token_pip_madrasah") {
                #region token_pip_madrasah
                $task = new PipMadrasahTask();
                $task->processToken();
                #endregion
            } elseif ($params[0] === "word_cloud") {
                #region word_cloud
                $task = new WordCloudDiskusiPendidikanTask();
                $task->processDiskusiPendidikanWordCloud();
                #endregion
            }
        } catch (\Exception $e) {
            \Sentry\captureException($e);
            $this->logger->addItem("type_of_log", "scheduled_job_exception");
            $this->logger->addItem("error_message", $e->getMessage());
            $this->logger->error();
        }
    }

    protected function logApiError($api_name, $api_param, $message)
    {
        $apiLog = new ApiErrorsService($this->config);
        $apiLog->log_error($api_name, $api_param, $message);
    }

    protected function rawQuery($query, $params = [], $connectionName = "db")
    {
        $q = $this->$connectionName->query($query, $params);
        $q->setFetchMode(\Phalcon\Db::FETCH_ASSOC);
        $pdo = $q->getInternalResult();
        $rows = $q->fetchAll();
        $float_cols = [
            'float', 'float4', 'float8', 'double', 'numeric', // for postgresql
            'LONGLONG', 'NEWDECIMAL' // for mysql
        ];
        $int_cols = ['int8'];
        $ncol = $pdo->columnCount();
        for ($i = 0; $i < $ncol; $i++) {
            $col = $pdo->getColumnMeta($i);
            $cname = $col['name'];
            $type = isset($col['native_type']) ? $col['native_type'] : null;
            if (in_array($type, $float_cols)) {
                foreach ($rows as &$row) {
                    $row[$cname] = floatval($row[$cname]);
                }
            }
            if (in_array($type, $int_cols)) {
                foreach ($rows as &$row) {
                    $row[$cname] = intval($row[$cname]);
                }
            }
        }
        return $rows;
    }
}
