<?php

use Phalcon\Mvc\Model\Transaction\Failed as TxFailed;
use Carbon\Carbon;
use Phalcon\Queue\Beanstalk;

class ApiErrorsService
{
    private $config;

    public function __construct($config)
    {
        $this->config = $config;
    }

    public function log_error($api_name, $api_params, $log)
    {
        $model = new ApiErrors();
        $model->api_name = $api_name;
        $model->api_param = $api_params;

        $log = str_replace("'", "", $log);
        $log = str_replace('"', "", $log);

        $model->log = $log;
        $model->created_at = date('Y-m-d H:i:s');
        $model->save();
    }

    public function process_notif()
    {
        $recipient = $this->config['log_api_error_recipient'];
        if (!empty($recipient)) {
            $interval = $this->config["log_api_error_interval"];

            date_default_timezone_set("Asia/Jakarta");
            $formattedawal = date('d-m-Y H:i:s', strtotime("-$interval hour"));
            $formattedakhir  = date('d-m-Y H:i:s');
            $awal = gmdate('Y-m-d H:i:s', strtotime("-$interval hour"));
            $akhir  = gmdate('Y-m-d H:i:s');

            $result = ApiErrors::query()
                ->columns("ApiErrors.api_name, count(*) as cnt")
                ->where("ApiErrors.created_at >= :date_filter:")
                ->bind(['date_filter' => $awal])
                ->groupBy("ApiErrors.api_name")
                ->orderBy("ApiErrors.api_name")->execute()->toArray();

            if (count($result) > 0) {
                $message = "<html>
							<head>
							<style type='text/css'>
								table, tr, td, th {
									border:1px solid black;
									border-collapse:collapse;
								}
							</style>
							</head><body>
							<p>Daftar API Error $formattedawal - $formattedakhir</p>
							<p>Berikut adalah Summary Error Pemanggilan API:</p>";
                $message .= "<table width='100%'>";
                $message .= "<thead>";
                $message .= "<tr>";
                $message .= "<th width='50px' align='center'><strong>No</strong></th>";
                $message .= "<th align='center'><strong>API Name</strong></th>";
                $message .= "<th width='50px' align='center'><strong>Count</strong></th>";
                $message .= "</tr>";
                $message .= "</thead>";
                $message .= "<tbody>";
                $no = 1;

                foreach ($result as $res) {
                    $api_name = $res["api_name"];
                    $cnt = $res['cnt'];
                    $message .= "<tr>";
                    $message .= "<td>" . $no++ . "</td>";
                    $message .= "<td>" . $api_name . "</td>";
                    $message .= "<td>" . $cnt . "</td>";
                    $message .= "</tr>";
                }

                $message .= "</tbody>";
                $message .= "</table>
          					  </body>
								</html>";

                $recipients = explode(",", $recipient);
                $subject = $this->config['log_api_error_subject'];
                foreach ($recipients as $email) {
                    if (empty($email)) {
                        continue;
                    }

                    $mail = new MailHelper($this->config["mail_config"]);
                    $mail->queue($email, $subject, $message, true);
                }
            }
        }
    }

    public function process_notif_job()
    {
        $recipient = $this->config['log_api_error_recipient'];
        $message = '';
        if (!empty($recipient)) {
            $result = [];
            $queue = new Beanstalk($this->config["beanstalk_config"]);
            $duration = $this->config['log_job_error_duration'];
            $job = $queue->peekReady();
            $stats = $job->stats();
            if ($stats['age'] > $duration) {
                $tubeStats = $queue->statsTube($stats['tube']);
                $body = $job->getBody();

                #region Process Send Email
                date_default_timezone_set("Asia/Jakarta");
                $date  = date('d-m-Y H:i:s');
                $message = "<html>
							<head>
							<style type='text/css'>
								table, tr, td, th {
									border:1px solid black;
									border-collapse:collapse;
								}
							</style>
							</head><body>
							<p>Summary Job Error $date</p>
							<p>Berikut adalah Summary Error Proses Job:</p>";
                $message .= "<table width='100%'>";
                $message .= "<thead>";
                $message .= "<tr>";
                $message .= "<th width='50px' align='center'><strong>Properties</strong></th>";
                $message .= "<th align='center'><strong>Value</strong></th>";
                $message .= "</tr>";
                $message .= "</thead>";
                $message .= "<tbody>";
                #region Total Jobs
                $message .= "<tr>";
                $message .= "<td>Total Jobs</td>";
                $message .= "<td>" . $tubeStats['total-jobs'] . "</td>";
                $message .= "</tr>";
                #endregion
                #region Jobs Ready
                $message .= "<tr>";
                $message .= "<td>Current Jobs Ready</td>";
                $message .= "<td>" . $tubeStats['current-jobs-ready'] . "</td>";
                $message .= "</tr>";
                #endregion
                $message .= "<tr><td colspan=2></td></tr>";
                #region Blocking Jobs
                $message .= "<tr>";
                $message .= "<td colspan=2>Blocking Job Information</td>";
                $message .= "</tr>";
                #region Job ID
                $message .= "<tr>";
                $message .= "<td>Job ID</td>";
                $message .= "<td>" . $stats['id'] . "</td>";
                $message .= "</tr>";
                #endregion
                #region Job Tube
                $message .= "<tr>";
                $message .= "<td>Job Tube</td>";
                $message .= "<td>" . $stats['tube'] . "</td>";
                $message .= "</tr>";
                #endregion
                #region Job Age
                $message .= "<tr>";
                $message .= "<td>Job Age</td>";
                $message .= "<td>" . gmdate('z \H\a\r\i H \J\a\m i \M\e\n\i\t s \D\e\t\i\k', $stats['age']) . "</td>";
                $message .= "</tr>";
                #endregion
                $message .= "<tr><td colspan=2></td></tr>";
                #region Job Details
                $message .= "<tr>";
                $message .= "<td colspan=2>Job Details</td>";
                $message .= "</tr>";
                #region Class
                $message .= "<tr>";
                $message .= "<td>Class</td>";
                $message .= "<td>" . $body['class'] . "</td>";
                $message .= "</tr>";
                #endregion
                #region Method
                $message .= "<tr>";
                $message .= "<td>Method</td>";
                $message .= "<td>" . $body['method'] . "</td>";
                $message .= "</tr>";
                #endregion
                #region Method Type
                $message .= "<tr>";
                $message .= "<td>Method Type</td>";
                $message .= "<td>" . $body['method_type'] . "</td>";
                $message .= "</tr>";
                #endregion
                #endregion
                #endregion

                $message .= "</tbody>";
                $message .= "</table>
          					  </body>
								</html>";

                $recipients = explode(",", $recipient);
                $subject = $this->config['log_api_error_subject'];
                foreach ($recipients as $email) {
                    if (empty($email)) {
                        continue;
                    }

                    $mail = new MailHelper($this->config["mail_config"]);
                    $mail->sendMail($email, $subject, $message, true);
                }
                #endregion
            }
        }

        return $message;
    }
}
