<?php

declare(strict_types=1);

use PhpAmqpLib\Message\AMQPMessage;

require_once __DIR__ . '/../../../../vendor/autoload.php';
require_once 'Zend/Loader/Autoloader.php';
$loader = Zend_Loader_Autoloader::getInstance();

require_once __DIR__ . '/../RpcServerBase.php';
require_once __DIR__ . '/RpcClient.php';
require_once __DIR__ . '/../Curl.php';
require_once __DIR__ . "../../../APIs/Log.php";

class Agro_RabbitMQ_TransmitirProposta_RpcServer extends Agro_Rabbitmq_RpcServerBase
{
    public $db;
    public $client = null;
    public $header = null;
    public $response = null;
    public $result = null;

    public function __construct(string $func, string $env, string $nomeFila)
    {
        parent::__construct($func, $env);
        $this->nomeFila = $nomeFila;

        $porta = (
            array_key_exists(
                'resources.db.params.port',$this->settings[$this->env]
            )?
            $this->settings[$this->env]['resources.db.params.port']
            :'5432'
        );
        $conexao = [
            'host' => $this->settings[$this->env]['resources.db.params.host'],
            'port' => $porta,
            'dbname' => $this->settings[$this->env]['resources.db.params.dbname'],
            'username' => $this->settings[$this->env]['resources.db.params.username'],
            'password' => $this->settings[$this->env]['resources.db.params.password'],
        ];

        $adapter = Zend_Db::factory('PDO_PGSQL', $conexao);
        Zend_Db_Table_Abstract::setDefaultAdapter($adapter);

        $this->db = Zend_Db_Table::getDefaultAdapter();
    }

    public function process(AMQPMessage $msg): void
    {
        echo "[SERVER] - process: begin\n";

        $payload = json_decode($msg->getBody(), true);
        
        $this->{$this->func}($payload);

        $this->channel->basic_ack($msg->get('delivery_tag'), 1);
        
        echo "[SERVER] - process: end\n";
    }

    public function run(array $params): void
    {
        echo "[SERVER] - run: begin\n";
        try {
            $curl = new Agro_RabbitMQ_Curl();
            $curl->execute(
                '/seguro/propostaajax/transmitir',
                $this->env,
                [
                    'id' => $params['id_proposta'],
                    'id_usuario' => $params['id_usuario'],
                    'fl_api_corretores' => true
                ]
            );

            $resultado = $curl->getResult();

            if (!$resultado->isSuccessful()) {
                throw new Exception('Erro ao transmitir a proposta.');
            }

            $resultadoBody = json_decode($resultado->getBody());

            if (!$resultadoBody->status) {
                throw new Exception($resultadoBody->message);
            }

            echo "[SERVER] - run: end\n";
        } catch (\Throwable $th) {
            echo "[SERVER] - run: error\n";
            echo "[SERVER] - {$th->getMessage()}\n";

            $env = strpos($this->env, 'docker') !== false ? 'docker' : 'production'; 

            $agroLog = new Agro_Log(Agro_Log::API_CORRETORES, false, $env);
            $agroLog->setParams($params);
            $agroLog->setRota('transmitir_proposta');
            $agroLog->setTitulo("[API CORRETORES] Erro ao transmitir a proposta {$params['id_proposta']}");
            $agroLog->addDestinatario("karina.silva@agrobrasilseguros.com.br");
            $agroLog->addDestinatario("luana.beck@agrobrasilseguros.com.br");
            $agroLog->addDestinatario("tais.silveira@agrobrasilseguros.com.br");
            $agroLog->setSalvaTxt(false);
            $agroLog->setEnviaEmail(true);
            $agroLog->setSalvaDB(true);
            $agroLog->logError("Erro: " . $th->getMessage() . "\n\n");
        }
    }
}
