<?php

class LogEmailController extends BaseController
{
    public function index()
    {
        $this->checkScopes(['admin.view']);
        $rawParams = $this->request->get();
        $rawParams['limit'] = $this->getDefaultLimit($rawParams);
        $rawParams['offset'] = array_key_exists('offset', $rawParams) ? $rawParams['offset'] : 0;
        $rawParams['order_by'] = array_key_exists('order_by', $rawParams) ? $rawParams['order_by'] : 'created_at';
        $rawParams['order_direction'] = array_key_exists('order_direction', $rawParams) ? $rawParams['order_direction'] : 'desc';

        $validatedParams = $this->validate($rawParams, [
            'limit' => ['validators' => [
                'required', 'digit', ['name' => 'max', 'params' => 1000]
            ]],
            'offset' => ['validators' => [
                'required', 'digit'
            ]],
            'status' => ['validators' => [
                [
                    'name' => 'inclusion_in',
                    'params' => array_merge([NULL], LogEmail::STATUSES),
                ]
            ]],
            'mail_to' => ['validators' => [
                [
                    'name' => 'max_string',
                    'params' => 30
                ]
            ]],
            'created_at_from' => ['validators' => [
                'date'
            ]],
            'created_at_to' => ['validators' => [
                'date'
            ]],
            'last_sent_from' => ['validators' => [
                'date'
            ]],
            'last_sent_to' => ['validators' => [
                'date'
            ]],
            'order_by' => ['validators' => [
                [
                    'name' => 'inclusion_in',
                    'params' => ['created_at', 'last_sent', 'status']
                ]
            ]],
            'order_direction' => ['validators' => [
                [
                    'name' => 'inclusion_in',
                    'params' => ['asc', 'desc']
                ]
            ]]
        ]);

        $query = [
            'conditions' => 'status ILIKE :status: AND mail_to ILIKE :mail_to:',
            'bind' => [
                'status' => '%' . $validatedParams['status'] . '%',
                'mail_to' => '%' . $validatedParams['mail_to'] . '%',
            ]
        ];
        $conditions = "status ILIKE :status AND mail_to ILIKE :mail_to";

        if (!is_null($validatedParams['created_at_from'])) {
            $query['conditions'] .= " AND cast(created_at as date) >= :created_at_from:";
            $conditions .= " AND cast(created_at as date) >= :created_at_from";
            $query['bind']['created_at_from'] = $validatedParams['created_at_from'];
        }

        if (!is_null($validatedParams['created_at_to'])) {
            $query['conditions'] .= " AND cast(created_at as date) <= :created_at_to:";
            $conditions .= " AND cast(created_at as date) <= :created_at_to";
            $query['bind']['created_at_to'] = $validatedParams['created_at_to'];
        }

        if (!is_null($validatedParams['last_sent_from'])) {
            $query['conditions'] .= " AND cast(last_sent as date) >= :last_sent_from:";
            $conditions .= " AND cast(last_sent as date) >= :last_sent_from";
            $query['bind']['last_sent_from'] = $validatedParams['last_sent_from'];
        }

        if (!is_null($validatedParams['last_sent_to'])) {
            $query['conditions'] .= " AND cast(last_sent as date) <= :last_sent_to:";
            $conditions .= " AND cast(last_sent as date) <= :last_sent_to";
            $query['bind']['last_sent_to'] = $validatedParams['last_sent_to'];
        }

        $total = LogEmail::count($query);
        $query['bind']['limit'] = $validatedParams['limit'];
        $query['bind']['offset'] = $validatedParams['offset'];
        $rows = $this->rawQuery("
            SELECT
                log_email.id, log_email.mail_to, log_email.mail_subject, log_email.created_at, log_email.last_sent, log_email.status,
                u1.um_user_name as creator
            FROM
                jaga.log_email
            LEFT JOIN
                jaga.um_user u1 ON u1.um_id = log_email.created_by
            WHERE " . $conditions . "
            ORDER BY " . $validatedParams['order_by'] . " " . $validatedParams['order_direction'] . "
            LIMIT :limit OFFSET :offset
                ;
        ", $query['bind']);

        return new PaginatedResponse($rows, $total, $query['bind']['limit'], $query['bind']['offset']);
    }

    public function detail($id)
    {
        $this->checkScopes(['admin.view']);
        /** @var LogEmail $row */
        $row = LogEmail::findFirst($id);
        if (!$row) {
            throw new CustomErrorException(BaseResponse::DATA_NOT_FOUND, "Data tidak ditemukan");
        }
        return new SimpleResponse($row);
    }

    public function statusReference()
    {
        $this->checkScopes(['admin.view']);

        return new SimpleResponse(LogEmail::STATUSES);
    }

    public function batchResent(){
        $this->checkScopes(['admin.view']);

        $params = $this->request->getJsonRawBody(true);
        $emails = LogEmail::find([
            'conditions' => 'id IN ({params:array})',
            'bind' => [
                'params' => $params
            ]
        ]);

        foreach ($emails as $email) {
            /** @var $email LogEmail */
            if ($email->status != LogEmail::STATUS_SUCCESS) {
                $email->status = LogEmail::STATUS_NEW;
                $email->save();
            }
        }
        return new SimpleResponse([]);
    }

    public function batchSend() {
        $this->checkScopes(['admin.view']);

        $params = $this->request->getJsonRawBody(true);
        $emails = LogEmail::find([
            'conditions' => 'id IN ({params:array})',
            'bind' => [
                'params' => $params
            ]
        ]);
        $mailHelper = new MailHelper($this->config["mail_config"]);
        $result = ['success' => 0, 'failed' => 0];
        foreach ($emails as $email) {
            /** @var $email LogEmail */
            if ($email->status != LogEmail::STATUS_SUCCESS) {
                $email->send($mailHelper);
                if ($email->status == LogEmail::STATUS_SUCCESS) {
                    $result['success']++;
                } else {
                    $result['failed']++;
                }
            }
        }
        return new SimpleResponse($result);
    }
}
