<?php
class Webhook_model extends CI_Model
{

    public function __construct()
    {
        parent::__construct();
        $this->load->database();
    }

    public function buscarMessageIdNoBanco($messageId)
    {
        $this->load->database();

        if (empty($messageId)) {
            return array(
                'success' => false,
                'exists' => false,
                'qtdPend' => 0,
                'qtdNota' => 0,
                'messageId' => $messageId,
                'error' => 'messageId vazio'
            );
        }

        $sql = "
            SELECT
                (SELECT COUNT(1) FROM dbo.PEND_NOTIFICACAO WHERE MESSAGEID = ?) AS qtdPend,
                (SELECT COUNT(1) FROM dbo.NOTA_NOTIFICACAO WHERE MESSAGEID = ?) AS qtdNota
        ";

        $query = $this->db->query($sql, array($messageId, $messageId));
        if (!$query) {
            $dbError = $this->db->error();
            return array(
                'success' => false,
                'exists' => false,
                'qtdPend' => 0,
                'qtdNota' => 0,
                'messageId' => $messageId,
                'error' => isset($dbError['message']) ? $dbError['message'] : 'erro_ao_consultar_messageid'
            );
        }

        $row = $query->row_array();
        $values = is_array($row) ? array_values($row) : array();
        $qtdPend = isset($values[0]) ? intval($values[0]) : 0;
        $qtdNota = isset($values[1]) ? intval($values[1]) : 0;
        $total = $qtdPend + $qtdNota;

        return array(
            'success' => true,
            'exists' => ($total > 0),
            'qtdPend' => $qtdPend,
            'qtdNota' => $qtdNota,
            'messageId' => $messageId
        );
    }

    public function inserirDadosWebhookTable($data)
    {
        // Insira os dados recebidos do webhook no banco de dados
        $insertData = [
            'id' => $data['messageId'],
            'JSON' => json_encode($data)
        ];

        return $this->db->insert('RODRIGO_NAO_APAGAR.dbo.webhook_messages', $insertData);
    }

    public function inserirDadosWebhook($data)
    {

        $inserirDadosWebhookTable = $this->inserirDadosWebhookTable($data);

        $messageId = $data['messageId'];
        $dataHoraAtual = date('Y-m-d H:i:s');

        $dadosPendencia = $this->getPendenciaByWbId($messageId);

        if (sizeof($dadosPendencia) <= 0) {
            return [
                'success' => false,
                'error' => true,
                'msg' => '0 pendencias'
            ];
        }



        if (isset($data['messageStatus'])) {

            $messageStatus = $data['messageStatus'];

            if (isset($messageStatus['code'])) {

                $messageStatusCode = $messageStatus['code'];
                /*
                SENT: A mensagem foi enviada com sucesso para o sistema do WhatsApp, mas ainda não foi entregue ao destinatário.
                DELIVERED: A mensagem foi entregue com sucesso ao destinatário final.
                READ: A mensagem foi lida pelo destinatário.
                NOT_DELIVERED: A mensagem não foi entregue ao destinatário.
                FAILED: O envio da mensagem falhou.
                */

                if ($messageStatusCode == 'DELIVERED' || $messageStatusCode == 'READ') {
                    $this->updatePendencia($messageId, $dataHoraAtual, $messageStatusCode);
                }

                return [
                    'success' => true,
                    'dataHoraAtual' => $dataHoraAtual,
                    'messageStatusCode' => $messageStatusCode
                ];
            }
        }

        return [
            'success' => false,
            'error' => true,
            'msg' => $data
        ];
    }

    public function updatePendencia($wbId, $recTo, $status)
    {
        $this->load->database();
        $cashwin = CASHWIN_ZENVIA;

        // Use o Active Record para a consulta
        $this->db->set('ZENVIA_RECTO', $recTo);
        $this->db->set('ZENVIA_STATUS', $status);
        $this->db->where('ZENVIA_ID', $wbId);

        // Execute o update
        $this->db->update($cashwin . '.dbo.CAD_PECR');

        // Retorna verdadeiro se a consulta afetou alguma linha
        return ($this->db->affected_rows() > 0);
    }


    public function getPendenciaByWbId($wbId)
    {
        $this->load->database();

        $cashwin = CASHWIN_ZENVIA;

        $query = $this->db->query("select 
                                        * 
                                    from 
                                        $cashwin.dbo.CAD_PECR cp 
                                    where cp.ZENVIA_ID = ?", array($wbId));

        return $query->result_array();
    }

    // Marca a notificação pelo MESSAGEID como RESPONDIDO = 'S' e RECEBIDO = 'S'
    public function marcarRespondidoPorMessageId($messageId)
    {
        $this->load->database();

        if (empty($messageId)) {
            return array(
                'success' => false,
                'affected' => 0,
                'error' => 'messageId vazio'
            );
        }

        $sqlUpdatePend = "
            UPDATE dbo.PEND_NOTIFICACAO
            SET RESPONDIDO = 'S',
                RECEBIDO = CASE WHEN RECEBIDO = 'S' THEN RECEBIDO ELSE 'S' END
            WHERE MESSAGEID = ?
        ";

        $okPend = $this->db->query($sqlUpdatePend, array($messageId));
        $affectedPend = $this->db->affected_rows();

        $sqlUpdateNota = "
            UPDATE dbo.NOTA_NOTIFICACAO
            SET RESPONDIDO = 'S',
                RECEBIDO = CASE WHEN RECEBIDO = 'S' THEN RECEBIDO ELSE 'S' END
            WHERE MESSAGEID = ?
        ";

        $okNota = $this->db->query($sqlUpdateNota, array($messageId));
        $affectedNota = $this->db->affected_rows();

        return array(
            'success' => ((bool)$okPend) || ((bool)$okNota),
            'affected' => $affectedPend + $affectedNota,
            'messageId' => $messageId,
            'details' => array(
                'pend_notificacao' => array(
                    'success' => (bool)$okPend,
                    'affected' => $affectedPend
                ),
                'nota_notificacao' => array(
                    'success' => (bool)$okNota,
                    'affected' => $affectedNota
                )
            )
        );
    }

    // Marca a notificação pelo MESSAGEID como RECEBIDO = 'S'
    public function marcarRecebidoPorMessageId($messageId)
    {
        $this->load->database();

        if (empty($messageId)) {
            return array(
                'success' => false,
                'affected' => 0,
                'error' => 'messageId vazio'
            );
        }

        $sqlUpdatePend = "
            UPDATE dbo.PEND_NOTIFICACAO
            SET RECEBIDO = 'S'
            WHERE MESSAGEID = '" . $this->db->escape_str($messageId) . "'
        ";

        $okPend = $this->db->query($sqlUpdatePend);
        $affectedPend = $this->db->affected_rows();

        $sqlUpdateNota = "
            UPDATE dbo.NOTA_NOTIFICACAO
            SET RECEBIDO = 'S'
            WHERE MESSAGEID = '" . $this->db->escape_str($messageId) . "'
        ";

        $okNota = $this->db->query($sqlUpdateNota);
        $affectedNota = $this->db->affected_rows();

        return array(
            'success' => ((bool)$okPend) || ((bool)$okNota),
            'affected' => $affectedPend + $affectedNota,
            'messageId' => $messageId,
            'sqlUpdatePend' => $sqlUpdatePend,
            'sqlUpdateNota' => $sqlUpdateNota,
            'details' => array(
                'pend_notificacao' => array(
                    'success' => (bool)$okPend,
                    'affected' => $affectedPend
                ),
                'nota_notificacao' => array(
                    'success' => (bool)$okNota,
                    'affected' => $affectedNota
                )
            )
        );
    }

    // Marca a notificação pelo MESSAGEID como LIDO = 'S'
    public function marcarLidoPorMessageId($messageId)
    {
        $this->load->database();

        if (empty($messageId)) {
            return array(
                'success' => false,
                'affected' => 0,
                'error' => 'messageId vazio'
            );
        }

        $sqlUpdatePend = "
            UPDATE dbo.PEND_NOTIFICACAO
            SET LIDO = 'S'
            WHERE MESSAGEID = ?
        ";

        $okPend = $this->db->query($sqlUpdatePend, array($messageId));
        $affectedPend = $this->db->affected_rows();

        $sqlUpdateNota = "
            UPDATE dbo.NOTA_NOTIFICACAO
            SET LIDO = 'S'
            WHERE MESSAGEID = ?
        ";

        $okNota = $this->db->query($sqlUpdateNota, array($messageId));
        $affectedNota = $this->db->affected_rows();

        return array(
            'success' => ((bool)$okPend) || ((bool)$okNota),
            'affected' => $affectedPend + $affectedNota,
            'messageId' => $messageId,
            'details' => array(
                'pend_notificacao' => array(
                    'success' => (bool)$okPend,
                    'affected' => $affectedPend
                ),
                'nota_notificacao' => array(
                    'success' => (bool)$okNota,
                    'affected' => $affectedNota
                )
            )
        );
    }
}
