<?php

if (file_exists('conexao/conexao.php')) {
    include('conexao/conexao_com_licenca.php');
    include('conexao/conexao.php');
}

class FilialOrcamento
{
    private $firebirdConnection;
    private $mysqlConnection;

    public function __construct($firebirdConnection, $mysqlConnection)
    {
        $this->firebirdConnection = $firebirdConnection;
        $this->mysqlConnection = $mysqlConnection;
    }

    public function consultaOrcamentoIndex($filial = '', $cliente = '', $dataInicial = '', $dataFinal = '', $n_orcamento = '', $cod_vendedor = '')
    {
        // ✅ Validação obrigatória das datas
        if (empty($dataInicial) || empty($dataFinal)) {
            return []; // ou: throw new Exception("Datas obrigatórias não informadas.");
        }

        $params = [];

        $sql = "
        SELECT
            A1.codigo_empresa_padrao AS codigo_filial,
            A1.codigo as orcamento,
            CAST(A1.CADASTRO_DT as date) as data_cadastro,
            IIF(AG.AG1_OP = 1, A1.CODIGO_FUNCIONARIO_COMISSAO, A1.AVIADA_CF) as codigo_vendedor,
            FU.NOMEFUNCIONARIO,
            C.nomecliente,
            CAST(COALESCE(A1.valorvenda_desc, 0) AS NUMERIC(18,2)) AS valor_orcamento
        FROM ATENDIMENTO_A1 A1
        LEFT JOIN UTIL_REL_AG1(1) AG ON AG.AG1_OP > 0
        INNER JOIN FUNCIONARIO FU ON FU.CODIGO = A1.CADASTRO_CF
        INNER JOIN CLIENTE C ON A1.CODIGO_CLIENTE = C.CODIGO
        WHERE A1.TIPO_ATENDIMENTO = 1
        AND A1.PAGAR_COMISSAO_FUNCIONARIO = '-1'
        AND CAST(A1.CADASTRO_DT AS DATE) BETWEEN ? AND ?
      ";

        $params[] = $dataInicial;
        $params[] = $dataFinal;

        if (!empty($filial) && is_numeric($filial)) {
            $sql .= " AND A1.codigo_empresa_padrao = ?";
            $params[] = $filial;
        }

        if (!empty($cliente)) {
            $sql .= " AND UPPER(C.nomecliente) LIKE ?";
            $params[] = '%' . strtoupper($cliente) . '%';
        }

        if (!empty($cod_vendedor)) {
            $sql .= " AND UPPER(IIF(AG.AG1_OP = 1, A1.CODIGO_FUNCIONARIO_COMISSAO, A1.AVIADA_CF)) LIKE ?";
            $params[] = '%' . strtoupper($cod_vendedor) . '%';
        }

        if (!empty($n_orcamento)) {
            $sql .= " AND A1.codigo LIKE ?";
            $params[] = '%' . $n_orcamento . '%';
        }

        $stmt = ibase_prepare($this->firebirdConnection, $sql);
        if (!$stmt) {
            die('Erro na preparação da consulta Firebird: ' . ibase_errmsg());
        }

        $result = call_user_func_array('ibase_execute', array_merge([$stmt], $params));
        if (!$result) {
            die('Erro na execução da consulta Firebird: ' . ibase_errmsg());
        }

        $orcamentos = [];
        while ($row = ibase_fetch_assoc($result)) {
            if ($row === false) continue;
            $orcamentos[] = $row;
        }

        return $orcamentos;
    }

    public function consultaOrcamentoPorFormula($filial = '', $cliente = '', $dataEntrega = '', $n_orcamento = '')
    {
        $params = [];

        // ⚠️ Não permitir consulta sem filtro básico
        if (empty($n_orcamento) && empty($dataEntrega)) {
            return [];
        }

        $sql = "SELECT
        A1.codigo_empresa_padrao AS codigo_filial,
        A1.codigo as orcamento,
        A2.numeroformula,
        CAST(A1.CADASTRO_DT as date) as data_cadastro,
        FF.nomeformafarmaceutica,
        A2.MULTIPLO,
        A2.QVD,
        A2.posologia,
        EG.nomeproduto,
        A3.quantidade,
        A3.unidade,
        C.nomecliente,
        CAST(COALESCE(A2.valorformula_venda_desc, 0) AS NUMERIC(18,2)) AS valor_orcamento
        FROM ATENDIMENTO_A1 A1
        LEFT JOIN UTIL_REL_AG1(1) AG ON AG.AG1_OP > 0
        INNER JOIN ATENDIMENTO_A2 A2 ON A1.codigo = A2.codigo_atend_a1
        INNER JOIN CLIENTE C ON A1.CODIGO_CLIENTE = C.CODIGO
        INNER JOIN ATENDIMENTO_A3 A3 ON A2.CODIGO_ATEND_A1 = A3.CODIGO_ATEND_A1
        AND A2.NUMEROFORMULA = A3.NUMEROFORMULA
        AND A2.CONCLUIDOFORMULA = -1
        INNER JOIN ESTOQUE_GERAL EG ON EG.CODIGO = A3.CODIGO_PRODUTO
        INNER JOIN FORMAFARMACEUTICA FF ON A2.CODIGO_FORMAFARMACEUTICA = FF.CODIGO
        INNER JOIN FORMAFARMACEUTICA_LABORATORIO FFL ON FF.CODIGO_LABORATORIO = FFL.CODIGO
        WHERE A1.TIPO_ATENDIMENTO = 1
        AND A1.PAGAR_COMISSAO_FUNCIONARIO = '-1'";

        if (!empty($filial)) {
            $sql .= " AND A1.codigo_empresa_padrao = ?";
            $params[] = $filial;
        }

        if (!empty($cliente)) {
            $sql .= " AND UPPER(C.nomecliente) LIKE ?";
            $params[] = '%' . strtoupper($cliente) . '%';
        }

        if (!empty($dataEntrega)) {
            $sql .= " AND CAST(A1.CADASTRO_DT as DATE) = ?";
            $params[] = $dataEntrega;
        }

        if (!empty($n_orcamento)) {
            $sql .= " AND A1.codigo = ?";
            $params[] = $n_orcamento;
        }

        // Limite de segurança no Firebird (offset + limit)
        $sql .= " ROWS 1 TO 1000";

        // DEBUG: Você pode descomentar para verificar a query e os parâmetros
        // var_dump($sql, $params);

        $stmt = ibase_prepare($this->firebirdConnection, $sql);
        if (!$stmt) {
            die('Erro na preparação da consulta Firebird: ' . ibase_errmsg());
        }

        $result = call_user_func_array('ibase_execute', array_merge([$stmt], $params));
        if (!$result) {
            die('Erro na execução da consulta Firebird: ' . ibase_errmsg());
        }

        $orcamentos = [];
        while ($row = ibase_fetch_assoc($result)) {
            if ($row) $orcamentos[] = $row;
        }

        return $orcamentos;
    }
}
