<?php
require_once __DIR__ . '/../../../vendor/autoload.php';
require_once 'Zend/Loader/Autoloader.php';

$loader = Zend_Loader_Autoloader::getInstance();

use PhpAmqpLib\Connection\AMQPStreamConnection;

class Agro_RabbitMQ_RpcServerBase {
    protected $connection;
    public $pdo;
    protected $channel;
    protected $settings;
    protected $env;
    public $func;
    protected $nomeFila;
    protected $mailSettings;

    /**
     * @params $func string - A função que irá ser chamada pelo serviço
     * @params $env string - Ambiente em qual o script deve consultar as configs
     */
    public function __construct(string $func, string $env) {
        try {
            $this->settings = parse_ini_file( __DIR__ . '/../../../application/config/application.ini', true);

            if (!array_key_exists($env, $this->settings)) {
                throw new Exception('Ambiente informado não existe.');
            }

            $port = (
                array_key_exists(
                    'resources.db.params.port',$this->settings[$env]
                )?
                $this->settings[$env]['resources.db.params.port']
                :'5432'
            );

            $dns = 'pgsql:host='.$this->settings[$env]['resources.db.params.host'].';'.
                'port='.$port.';'.
                'dbname='.$this->settings[$env]['resources.db.params.dbname'].';'.
                'user='.$this->settings[$env]['resources.db.params.username'].';'.
                'password='.$this->settings[$env]['resources.db.params.password'];
        
            $this->pdo = new PDO($dns);
            $this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

            $this->env = $env;
            $this->func = $func;
    
            $this->connection = new AMQPStreamConnection(
                $this->settings[$env]['rabbitmq.params.host'],
                $this->settings[$env]['rabbitmq.params.port'],
                $this->settings[$env]['rabbitmq.params.username'],
                $this->settings[$env]['rabbitmq.params.password']
            );

            $this->channel = $this->connection->channel();

            $this->mailSettings = [
                'ssl' => $this->settings[$env]['constants.MAIL_SSL'],
                'port' => $this->settings[$env]['constants.MAIL_PORT'],
                'auth' => $this->settings[$env]['constants.MAIL_AUTH'],
                'username' => $this->settings[$env]['constants.MAIL_USERNAME'],
                'password' => $this->settings[$env]['constants.MAIL_PASSWORD']
            ];

        } catch (PDOException|Exception $e) {
            die($e->getMessage());
        }
    }

    public function execute()
    {
        echo "[SERVER] - execute: begin\n";
        $this->channel->queue_declare(
            $this->nomeFila,
            false,
            true,
            false,
            false
        );

        $this->channel->basic_qos(
            null,
            1,
            null
        );

        $this->channel->basic_consume(
            $this->nomeFila,
            '',
            false,
            false,
            false,
            false,
            [$this, 'process']
        );

        while(count($this->channel->callbacks)) {
            $this->channel->wait();
        }

        $this->channel->close();
        $this->connection->close();
        echo "[SERVER] - execute: end\n";
    }
}
