<?php

use Mpdf\Mpdf;

class Sinistro2_Service_LaudoFinalPdf003 {

    protected $chaveLaudo = "LF003";
    protected $idLaudoFinal = null;
    protected $flLaudoParaSegurado = false;
    protected $dados = [];
    protected $labelsLinhas = [
            'vl_espacamento_entre_linhas' => 'Espaçamento entre linhas (metros)',
            'ds_latitude' => 'Coordenadas da amostra',
            'vl_metros_linhas_colhidos' => 'Metros de linha colhidos (metros)',
            'vl_producao_colhida_amostra' => 'Produção colhida na amostra (kg)',
            'vl_perdas_colheita' => 'Perdas de Colheita ( % ) ',
            'vl_umidade_graos' => 'Umidade dos Grãos ( % )',
            'vl_desconto_umidade_graos' => 'Desconto de Umidade ( % )',
            'vl_producao_liquida' => 'Produção Líquida em Kg/Hectare',
    ];

    /**
     * Busca todos os dados necessários para a impressão do laudo
     *
     * @return array
     */
    protected function getDados(): array
    {
        if (empty($this->dados)) {
            $this->dados['laudoFinal'] = $this->getDadosLaudoFinal();
            $this->dados['itensSegurados'] = $this->getDadosItensSegurados();
            $this->dados['assinaturas'] = $this->getAssinaturas();
        }

        $this->getValorAreaNaoDeclarada();
        return $this->dados;
    }

    /**
     * Retornam todas as assinaturas que o laudo possui (Responsável, Perito Principal, Perito Secundário e Agronomos)
     *
     * @return array
     */
    protected function getAssinaturas(): array
    {
        $sqlAssinaturasResponsavelperito = "
            SELECT lf.ds_responsavel
                  ,lf.cpf_responsavel
                  ,lfa.svg_assinatura_responsavel
                  ,lfa.svg_assinatura_perito_principal
                  ,lfa.svg_assinatura_perito_secundario
                  ,perito_principal.ds_nome_funcionario AS ds_nome_perito_principal
                  ,perito_principal.ds_crea AS ds_crea_perito_principal
                  ,perito_secundario.ds_nome_funcionario AS ds_nome_perito_secundario
                  ,perito_secundario.ds_crea AS ds_crea_perito_secundario
              FROM sinistro.laudos_finais lf
              JOIN sinistro.laudos_finais_assinaturas lfa ON lfa.id_laudo_final = lf.id
              JOIN sistema.vistorias_laudos_finais vlf ON vlf.id_laudo_final = lf.id
              JOIN sistema.vistorias_agendamentos va ON va.id_vistoria = vlf.id_vistoria
              JOIN sistema.agendamentos_funcionarios saf_principal ON saf_principal.id_agendamento = va.id_agendamento AND saf_principal.fl_principal is true
              JOIN sistema.funcionarios perito_principal ON perito_principal.id = saf_principal.id_funcionario
              LEFT JOIN sistema.agendamentos_funcionarios saf_secundario ON saf_secundario.id_agendamento = va.id_agendamento AND saf_secundario.fl_principal is false
              LEFT JOIN sistema.funcionarios perito_secundario ON perito_secundario.id = saf_secundario.id_funcionario
             WHERE vlf.id_laudo_final = {$this->idLaudoFinal}
        ";

        $rs = Agro_Db_Table_Abstract::getDefaultAdapter()->fetchRow($sqlAssinaturasResponsavelperito);

        $dados = [
            'responsavel' => [
                'nome' => trim(mb_strtoupper($rs['ds_responsavel'])),
                'identificador' => $rs['cpf_responsavel'],
                'path' => $this->gerarImagemAssinatura('responsavel', $rs['svg_assinatura_responsavel'])
            ],
            'perito_principal' => [
                'nome' => trim(mb_strtoupper($rs['ds_nome_perito_principal'])),
                'identificador' => $rs['ds_crea_perito_principal'],
                'path' => $this->gerarImagemAssinatura('perito_principal',$rs['svg_assinatura_perito_principal'])
            ],
            'perito_secundario' => [
                'nome' => !empty($rs['svg_assinatura_perito_secundario']) ? trim(mb_strtoupper($rs['ds_nome_perito_secundario'])) : '',
                'identificador' => $rs['ds_crea_perito_secundario'],
                'path' => $this->gerarImagemAssinatura('perito_secundario', $rs['svg_assinatura_perito_secundario'])
            ]
        ];
        
        $sqlAssinaturasAgronomos = "
            SELECT f.ds_nome_funcionario
                  ,lfaa.svg_assinatura
              FROM sinistro.laudos_finais_agronomos_agro lfaa
              JOIN sistema.funcionarios f ON f.id = lfaa.id_funcionario
             WHERE lfaa.id_laudo_final = {$this->idLaudoFinal}
             ORDER BY lfaa.dt_criacao
             LIMIT 5
        ";

        $rsAgronomos = Agro_Db_Table_Abstract::getDefaultAdapter()->fetchAll($sqlAssinaturasAgronomos);
        
        for ($i=0; $i < 5; $i++) {
            $indexLabel = $i + 1;
            $svg = "";
            $nome = "";

            if (array_key_exists($i, $rsAgronomos)) {
                $nome = trim(mb_strtoupper($rsAgronomos[$i]['ds_nome_funcionario']));
                $svg = $rsAgronomos[$i]['svg_assinatura'];
            }

            $dados["agronomo_{$indexLabel}"] = [
                'nome' => $nome,
                'identificador' => '',
                'path' => $this->gerarImagemAssinatura("agronomo_{$indexLabel}", $svg)
            ];
        }

        return $dados;
    }

    /**
     * Busca os dados referentes ao laudo final
     *
     * @return array
     */
    protected function getDadosLaudoFinal(): array
    {
        $sqlTempAvisos = "
            CREATE TEMP TABLE avisos_temp AS (
                SELECT vlf.id_laudo_final
                      ,string_agg(av.id::text, ', ') as avisos
                      ,string_agg(to_char(av.dt_sinistro,'DD/MM/YYYY'), ', ') as dt_sinistro
                 FROM sistema.vistorias_laudos_finais vlf
                 JOIN sinistro.vistorias_avisos va ON va.id_vistoria = vlf.id_vistoria
                 JOIN sinistro.avisos av ON av.id = va.id_aviso
                WHERE vlf.id_laudo_final = {$this->idLaudoFinal}
                GROUP BY vlf.id_laudo_final
            );
        ";

        Agro_Db_Table_Abstract::getDefaultAdapter()->query($sqlTempAvisos);

        $sqlLaudo = "
            SELECT pd.ds_nome_produto
                  ,c.ds_nome_cultura
                  ,e.ds_nome_fantasia
                  ,pp.ds_nome_proponente
                  ,pp.cpf_cnpj
                  ,seguro.id_proposta_mae_completo(pr.id) AS id_proposta_completo
                  ,lf.id_processo
                  ,av_temp.avisos
                  ,av_temp.dt_sinistro
                  ,CONCAT(propriedade.ds_endereco, ', '
                         ,propriedade.ds_endereco_nro, CASE WHEN propriedade.ds_endereco_complemento IS NOT NULL AND propriedade.ds_endereco_complemento <> '' THEN ' ' || propriedade.ds_endereco_complemento || ', 'ELSE ', 'END
                         ,propriedade.ds_endereco_bairro, ', '
                         ,m.ds_nome_municipio, ' - '
                         ,estados.ds_sigla, ', '
                         ,propriedade.ds_endereco_cep
                   ) AS endereco_completo
                  ,COALESCE(lf_motivos.ds_motivo, 'Não') AS fechar_processo
                  ,lf.ds_observacao
                  ,CASE WHEN lf.fl_area_declarada_representa_area_cultivada IS true THEN 'Sim' ELSE 'Não' END AS fl_area_declarada_representa_area_cultivada
                  ,CASE WHEN lf.ds_responsavel IS NOT NULL AND lf.cpf_responsavel IS NOT NULL THEN 'Sim' ELSE 'Não' END as fl_acompanhante_compareceu
                  ,vlf.id_vistoria
                  ,pr.id_proposta_mae
              FROM sinistro.laudos_finais lf
              JOIN sinistro.processos proc ON proc.id = lf.id_processo
              JOIN seguro.propostas pr ON pr.id = proc.id_proposta
              JOIN produto.produtos pd ON pd.id = pr.id_produto
              JOIN produto.produtos_geral pg ON pg.id = pd.id_produto_geral
              JOIN produto.culturas c ON c.id = pg.id_cultura
              JOIN sistema.vistorias_laudos_finais vlf ON vlf.id_laudo_final = lf.id
              JOIN sistema.vistorias_empresas ve ON ve.id_vistoria = vlf.id_vistoria
              JOIN sistema.empresas e ON e.id = ve.id_empresa
              JOIN seguro.propostas_proponentes pp ON pp.id_proposta = pr.id
              JOIN avisos_temp av_temp ON av_temp.id_laudo_final = lf.id
              JOIN seguro.propostas_propriedades propriedade ON propriedade.id_proposta = pr.id
              JOIN sistema.municipios m ON m.id = propriedade.id_municipio
              JOIN sistema.estados ON estados.id = m.id_estado
              LEFT JOIN sinistro.motivos_quadra_nao_vistoriada lf_motivos ON lf_motivos.id = lf.id_motivo_vistoria_nao_vistoriada
              LEFT JOIN sinistro.laudos_finais_assinaturas lfa ON lfa.id_laudo_final = lf.id
             WHERE lf.id = {$this->idLaudoFinal};
        ";
        
        $rs = Agro_Db_Table_Abstract::getDefaultAdapter()->fetchRow($sqlLaudo);
        return !empty($rs) ? $rs : [];
    }

    /**
     * Busca os dados referentes aos itens do laudo final
     *
     * @return array
     */
    protected function getDadosItensSegurados(): array
    {
        $where[] = "lfis.id_laudo_final = {$this->idLaudoFinal}";
        if ($this->flLaudoParaSegurado) {
            $where[] = "lfis.fl_assinado is true";
        }
        $where = implode(" AND ", $where);

        $tabelaRegulacaoItensSegurados = "regulacao." . mb_strtolower($this->chaveLaudo) . "_itens_segurados";
        $sqlItens = "
                SELECT lfis.id as id_laudo_final_item_segurado
                      ,lfis.id_item_segurado
                      ,lfis.ds_tipo_amostragem
                      ,CASE WHEN EXISTS(SELECT 1 FROM sinistro.motivos_quadra_nao_vistoriada_tipos WHERE id_motivo_quadra_nao_vistoriada = mqnv.id AND id_tipo_motivo_quadra_nao_vistoriada = 2)
                            THEN mqnv.ds_motivo
                            ELSE 'Não'
                       END AS ds_motivo_dispensa
                      ,CASE WHEN EXISTS(SELECT 1 FROM sinistro.motivos_quadra_nao_vistoriada_tipos WHERE id_motivo_quadra_nao_vistoriada = mqnv.id AND id_tipo_motivo_quadra_nao_vistoriada = 3)
                            THEN mqnv.ds_motivo
                            ELSE 'Não'
                       END AS ds_motivo_postergacao
                      ,CASE WHEN sis_unificado_origem.ds_item_segurado IS NOT NULL THEN 'Sim, com a quadra/talhão ' || sis_unificado_origem.ds_item_segurado ELSE 'Não' END AS is_unificado
                      ,CASE WHEN lfis.fl_vistoria_parcial IS true THEN 'Sim - ' || lfis.vl_area_vistoriada || ' ha'  ELSE 'Não' END AS is_parcial
                      ,lfis.vl_area_declarada
                      ,CASE WHEN lfis.fl_zoneamento_valido IS true THEN 'Sim' ELSE 'Não' END AS is_zoneamento_valido
                      ,TRIM(split_part(NULLIF(lfis.ds_coordenadas_geograficas, ''), ',', 1)) AS ds_latitude
                      ,TRIM(split_part(NULLIF(lfis.ds_coordenadas_geograficas, ''), ',', 2)) AS ds_longitude
                      ,sis.nr_item_segurado
                      ,sis.ds_item_segurado
                      ,v.ds_nome_variedade
                      ,sis.vl_area AS vl_area_segurada
                      ,lfis.vl_percent_colhido AS vl_percentual_colhido_antes_vistoria
                      ,lfis.fl_assinado
                      ,lis.vl_graos_podres
                      ,lis.vl_graos_brotados
                      ,lis.vl_pragas_doencas_outros
                      ,lfis.dt_vistoria
                      ,lfis.vl_rendimento_final_lavoura
                      ,to_char(lfis.dt_vistoria,'DD/MM/YYYY') as dt_vistoria
                      ,to_char(lfis.dt_vistoria,'HH24:MI') as hora_vistoria
                      ,lfis.ds_nome_laudo_fisico
                      ,lfis.id_motivo_quadra_nao_vistoriada as id_motivo
                  FROM sinistro.laudos_finais_itens_segurados lfis
                  JOIN seguro.itens_segurados sis ON sis.id = lfis.id_item_segurado
                  JOIN produto.variedades v ON v.id = sis.id_variedade
                  LEFT JOIN sinistro.motivos_quadra_nao_vistoriada mqnv ON mqnv.id = lfis.id_motivo_quadra_nao_vistoriada
                  LEFT JOIN {$tabelaRegulacaoItensSegurados} lis ON lis.id_laudo_final_item_segurado = lfis.id
                  LEFT JOIN seguro.itens_segurados sis_unificado_origem ON sis_unificado_origem.id = id_item_segurado_origem
                 WHERE {$where}
                 ORDER BY lfis.id_item_segurado;
        ";

        $rs = Agro_Db_Table_Abstract::getDefaultAdapter()->fetchAll($sqlItens);

        if ($this->flLaudoParaSegurado && empty($rs)) {
            throw new Exception("Nenhum item assinado para o envio de laudo solicitado.");
        }

        foreach ($rs as &$item) {
            $item['amostras'] = $this->getDadosAmostras($item['id_laudo_final_item_segurado']);
            $item['vl_area_cultivada'] = $this->getAreaCulivada($item['ds_item_segurado'], $item['nr_item_segurado']);
        }

        return !empty($rs) ? $rs : [];
    }

    /**
     * Busca a resposta para a pergunta 13, referente a área cultivada.
     * Caso tenha uma observação para o item informado com 'A área correta do',
     * pegamos o valor informado para retornar junto.
     *
     * @param string $dsItemSegurado
     * @return string
     */
    protected function getAreaCulivada(string $dsItemSegurado, int $nrItemSegurado): string
    {
        $difereAreaCultivada = 'Não';
        $padrao = '/Talhão ' . $dsItemSegurado . ':\s*A área correta do item ' . $nrItemSegurado . ' é\s*([\d.,]+)/i';
        preg_match($padrao, $this->dados['laudoFinal']['ds_observacao'], $matches);

        if (isset($matches[1])) {
            $valor = Agro_Util::formatDbCurrency($matches[1]);
            $difereAreaCultivada = "Sim - {$valor} ha";
        }

        return $difereAreaCultivada;
    }

    /**
     * Busca a resposta para a pergunta 9, referente a área não declarada.
     * Caso o campo fl_area_declarada_representa_area_cultivada retorne 'Não', buscamos da observação
     * a informação da área que não foi declarada.
     */
    protected function getValorAreaNaoDeclarada(): void
    {
        if ($this->dados['laudoFinal']['fl_area_declarada_representa_area_cultivada'] == 'Não') {
            preg_match('/Área não declarada:\s*([\d.,]+)/', $this->dados['laudoFinal']['ds_observacao'], $matches);
            
            if (isset($matches[1])) {
                $valor = Agro_Util::formatDbCurrency($matches[1]);
                $this->dados['laudoFinal']['fl_area_declarada_representa_area_cultivada'] .= " - {$valor} ha";
            }
        }
    }

    /**
     * Busca os dados das amostras do item
     *
     * @param int idLaudoFinalItemSegurado
     * @return array
     */
    protected function getDadosAmostras(int $idLaudoFinalItemSegurado): array
    {
        $tabelaAmostras = "regulacao." . mb_strtolower($this->chaveLaudo) . "_itens_segurados_amostras";
        $sql = "
            SELECT lisa.vl_espacamento_entre_linhas
                  ,(lisa.ds_coordenadas::json ->> 'latitude') AS ds_latitude
                  ,(lisa.ds_coordenadas::json ->> 'longitude') AS ds_longitude
                  ,lisa.vl_metros_linhas_colhidos
                  ,lisa.vl_producao_colhida_amostra
                  ,lisa.vl_umidade_graos
                  ,lisa.vl_desconto_umidade_graos
                  ,lisa.vl_producao_liquida
                  ,lisa.vl_largura_plataforma
                  ,lisa.vl_distancia_percorrida
                  ,lisa.vl_area_colhida
                  ,lisa.vl_impurezas
                  ,lisa.vl_perda_colheita
              FROM {$tabelaAmostras} lisa
              JOIN sinistro.laudos_finais_itens_segurados lfis ON lfis.id = lisa.id_laudo_final_item_segurado
             WHERE lisa.id_laudo_final_item_segurado = {$idLaudoFinalItemSegurado}
             ORDER BY lisa.nr_amostra
        ";

        $rs = Agro_Db_Table_Abstract::getDefaultAdapter()->fetchAll($sql);
        return !empty($rs) ? $rs : [];
    }

    /**
     * Gera o PDF do laudo final, salva na pasta do laudo e retorna o nome do arquivo
     *
     * @param int $idLaudoFinal
     * @param bool $flLaudoParaSegurado
     * @return string
     */
    public function gerarPDF(int $idLaudoFinal, bool $flLaudoParaSegurado = false): string
    {
        $this->idLaudoFinal = $idLaudoFinal;
        $this->flLaudoParaSegurado = $flLaudoParaSegurado;
        $this->getDados();

		$mpdf = new Mpdf([
            'tempDir' => APPLICATION_PATH . '/upload_files/temp',
            'margin_top' => 10,
            'margin_bottom' => 10,
            'margin_right' => 5,
            'margin_left' => 5,
            'shrink_tables_to_fit' => false,
            'autoScriptToLang' => false,
            'autoLangToFont' => false,
            'useSubstitutions' => false,
        ]);

        if ($this->flLaudoParaSegurado) {
            $senha = substr(preg_replace('/\D/', '', $this->dados['laudoFinal']['cpf_cnpj']), 0, 4);
            $mpdf->SetProtection(['print'], $senha);
            $nome = $this->dados['laudoFinal']['id_proposta_mae'] . "_VF_{$idLaudoFinal}_SEGURADO.pdf";
        }

        $css = $this->montarCSS();
        $mpdf->WriteHTML($css, \Mpdf\HTMLParserMode::HEADER_CSS);

        $html = $this->montarHTML();
        $mpdf->WriteHTML($html, \Mpdf\HTMLParserMode::HTML_BODY);

        $nome = empty($nome) ? $this->getNomeLaudo() : $nome;
        $mpdf->Output(PATH_LAUDOS .'/'. $nome, \Mpdf\Output\Destination::FILE);
        return $nome;
    }

    /**
     * Retorna o CSS que será utilizado no PDF
     *
     * @return string
     */
    protected function montarCSS(): string
    {
        return "
            table {
                border-collapse: collapse;
                font-family: Arial, sans-serif;
                font-size: 7.5px;
                width: 100%;
            }

            td {
                border: 1px solid black;
                vertical-align: top;
                padding: 0.5px;
            }

            .centered {
                text-align: center;
                vertical-align: middle;
            }

            .vertical-midle {
                vertical-align: middle;
            }

            .bold {
                font-weight: bold;
            }

            .inner-header {
                background-color: rgb(217, 217, 217);
                font-weight: bold;
                border-bottom: 1px solid black;
                text-align: center;
            }

            .inner-content {
                height: 40px;
            }

            .no-border {
                border: none;
            }

            .no-border td {
                border: none;
            }

            .no-border-right {
                border-right: none;
            }

            .no-border-left {
                border-left: none;
            }

            .no-border-sides {
                border-left: none;
                border-right: none;
            }

            .no-border-top-bottom td {
                border-top: none;
                border-bottom: none;
            }
            
            .no-border-top td {
                border-top: none;
            }
            
            .no-border-bottom td {
                border-bottom: none;
            }

            .padding-4 {
                padding: 4px;
            }

            .logo-cell {
                height: 40px;
                text-align: center;
            }

            .logo-img {
                max-height: 40px;
                height: auto;
                vertical-align: middle;
            }

            .questions-header {
                background-color: rgb(235, 241, 222);
            }

            .questions-header td {
                border-top: none;
            }

            .inner-questions-content td {
                height: 25px;
            }

            .table-questions tr td {
                height: 15px;
                vertical-align: middle;
            }

            .bg-white {
                background-color: white;
            }
            
            .bg-gray {
                background-color: rgb(217, 217, 217);
            }
            
            .croqui-padding {
                padding-left: 7.93%;
                padding-right: 7.93%;
            }
            
            .index-amostragem {
                width: 3.10%;
                font-weight: bold;
            }

            .label-amostragem {
                width: 20.34%;
            }
            
            .inner-tables {
                width: 100%;
                font-size: 8.5px;
            }
        ";
    }


    /**
     * Retorna o HTML que será impresso no PDF
     *
     * @return string
     */
    protected function montarHTML(): string
    {
        $html = '';
        if (!empty($this->dados['itensSegurados'])) {

            foreach ($this->dados['itensSegurados'] as $index => $item) {

                $this->tratarDadosDispensados($item);
                $html .= $this->montarPrimeiraPagina($item);

                if ($index + 1 < count($this->dados['itensSegurados'])) {
                    $html .= '<pagebreak />';
                }
            }
        } else {
            $html .= $this->montarPrimeiraPagina([]);
        }

        return $html;
    }

    /**
     * Retorna o nome do arquivo de laudo, dependendo se a vistoria possui itens ou não
     *
     * @return string
     */
    protected function getNomeLaudo(): string
    {
        $nome = '';
        $dadosNomeArquivo['row'] = null;
        $dadosNomeArquivo['params'] = [
            'id_vistoria' =>  $this->dados['laudoFinal']['id_vistoria'],
            'id_processo' => $this->dados['laudoFinal']['id_processo'],
        ];

        $modelLaudosFinaisItensSegurados = new Sinistro2_Model_LaudosFinaisItensSegurados();
        
        if (!empty($this->dados['itensSegurados'])) {
            $dadosNomeArquivo['row'] = (object)[
                'ds_nome_laudo_fisico' => $this->dados['itensSegurados'][0]['ds_nome_laudo_fisico'],
                'id_item_segurado' => $this->dados['itensSegurados'][0]['id_item_segurado'],
            ];
            $nome = $modelLaudosFinaisItensSegurados->geraNomeArquivoFisico($dadosNomeArquivo['row'], 'lf.pdf', $dadosNomeArquivo['params']);
        } else {
            $nome = $modelLaudosFinaisItensSegurados->geraNomeArquivoFisicoEventoNaoConstatado($dadosNomeArquivo['row'], 'lf.pdf', $dadosNomeArquivo['params']);
        }

        return $nome;
    }

    /**
     * Monta os dados da primeira página do laudo
     *
     * @param array $dadosItem
     * @return string
     */
    protected function montarPrimeiraPagina(array $dadosItem): string
    {
        $html = $this->montarCabecalhoLaudo();
        $html .= $this->montarCorpoPrimeiraPagina($dadosItem);
        return $html;
    }

    /**
     * Monta os dados da segunda página do laudo
     * (no momento não utilizado por falta de regra do que deve ser apresentado)
     *
     * @return string
     */
    protected function montarSegundaPagina(): string
    {
        $html = $this->montarCabecalhoLaudo();
        $html .= $this->montarCorpoSegundaPagina();
        return $html;
    }


    /**
     * Retorna o HTML do corpo da primeira página do laudo
     *
     * @param $dadosItem
     * @return string
     */
    protected function montarCorpoPrimeiraPagina(array $dadosItem): string
    {
        $dadosAmostragemManual = $dadosItem['ds_tipo_amostragem'] == 'MANUAL' ? $dadosItem['amostras'] : [];
        $dadosAmostragemMecanizada = $dadosItem['ds_tipo_amostragem'] == 'MECANIZADA' ? $dadosItem['amostras'] : [];

        $corpo = "<table border='1' class='inner-tables'>";
        $corpo .= $this->montarBlocoInformacaoInicial();
        $corpo .= $this->montarBlocoInformacoesSobreQuadra($dadosItem);
        $corpo .= $this->montarBlocoAmostragemManual($dadosAmostragemManual);
        $corpo .= $this->montarBlocoAmostagemMecanizada($dadosAmostragemMecanizada, $dadosItem['vl_rendimento_final_lavoura']);
        $corpo .= $this->montarBlocoAtencaoItens($dadosItem);
        $corpo .= $this->montarBlocoObservacoesGerais();
        $corpo .= $this->montarBlocoDataHora($dadosItem);
        $corpo .= $this->montarBlocoAssinaturas($dadosItem['fl_assinado'] == true);
        $corpo .="</table>";
        return $corpo;
    }

    /**
     * Retorna HTML do bloco "Informação Inicial"
     *
     * @return string
     */
    protected function montarBlocoInformacaoInicial(): string
    {
        return "
                <tr>
                    <td class='inner-header'>Informação Inicial</td>
                </tr>

                <tr>
                    <td>
                        <table class='inner-tables'>
                            <tr class='questions-header'>
                                <td class='no-border-left'><b>1.</b>Segurado:</td>
                                <td><b>2.</b>Proposta:</td>
                                <td><b>3.</b>Processo de Sinistro:</td>
                                <td><b>4.</b>Aviso(s):</td>
                                <td class='no-border-right'><b>5.</b>Data do Sinistro(s):</td>
                            </tr>
                            <tr class='inner-questions-content no-border-bottom'>
                                <td style='width: 36.71%' class='centered no-border-left'>{$this->dados['laudoFinal']['ds_nome_proponente']}</td>
                                <td style='width: 10.31%' class='centered'>{$this->dados['laudoFinal']['id_proposta_completo']}</td>
                                <td style='width: 10.72%' class='centered'>{$this->dados['laudoFinal']['id_processo']}</td>
                                <td style='width: 22.44%' class='centered'>{$this->dados['laudoFinal']['avisos']}</td>
                                <td style='width: 19.82%' class='centered no-border-right'>{$this->dados['laudoFinal']['dt_sinistro']}</td>
                            </tr>
                        </table>
                    </td>
                </tr>
                <tr>
                    <td>
                        <table class='inner-tables'>
                            <tr class='questions-header'>
                                <td class='no-border-left'><b>6.</b>Endereço da Propriedade:</td>
                                <td><b>7.</b>O Acompanhante para a vistoria estava presente? Sim ou Não?</td>
                                <td><b>8.</b>Fechar processo de vistoria em todas as quadras seguradas sem coleta de amostras? Sim ou Não? Se Sim, qual o motivo</td>
                                <td class='no-border-right'><b>9.</b>As áreas seguradas representam toda a área cultivada na propriedade? Sim ou Não? Se não, informe o tamanho da área não declarada na proposta:</td>
                            </tr>
                            <tr class='inner-questions-content no-border-bottom'>
                                <td style='width: 47%' class='centered no-border-left'>{$this->dados['laudoFinal']['endereco_completo']}</td>
                                <td style='width: 10.85%' class='centered'>{$this->dados['laudoFinal']['fl_acompanhante_compareceu']}</td>
                                <td style='width: 22.28%' class='centered'>{$this->dados['laudoFinal']['fechar_processo']}</td>
                                <td class='centered no-border-right'>{$this->dados['laudoFinal']['fl_area_declarada_representa_area_cultivada']}</td>
                            </tr>
                        </table>
                    </td>
                </tr>
        ";
    }

    /**
     * Retorna o HTML do bloco 'Informações sobre a Quadra/Talhão Inspecionado'
     *
     * @return string
     */
    protected function montarBlocoInformacoesSobreQuadra(array $dadosItem): string
    {
        $vlAreaSegurada = Agro_Util::formatDbCurrency($dadosItem['vl_area_segurada']);
        return "
                <tr>
                    <td class='inner-header'>Informações sobre a Quadra/Talhão Inspecionado</td>
                </tr>

                <tr>
                    <td>
                        <table class='inner-tables'>
                            <tr class='questions-header'>
                                <td class='no-border-left'><b>10.</b>Item (Nº):</td>
                                <td><b>11.</b>Nome Quadra/Talhão:</td>
                                <td><b>12.</b>Variedade/Cultivar/Híbrido da Quadra/Talhão:</td>
                                <td><b>13.</b>Área segurada Quadra/Talhão (ha):</td>
                                <td><b>14.</b>% Colhido antes da vistoria da Quadra/Talhão:</td>
                                <td><b>15.</b>A área cultivada da Quadra/Talhão difere com a declarada na proposta? Se Sim, informe o tamanho real (ha):</td>
                                <td class='no-border-right'><b>16.</b>Plantio dentro do zoneamento agrícola ou de acordo com as restrições técnicas da seguradora? Sim ou Não?</td>
                            </tr>
                            <tr class='inner-questions-content no-border-bottom'>
                                <td style='width: 6.5%'  class='centered no-border-left'>{$dadosItem['nr_item_segurado']}</td>
                                <td style='width: 15.19%' class='centered'>{$dadosItem['ds_item_segurado']}</td>
                                <td style='width: 16.55%' class='centered'>{$dadosItem['ds_nome_variedade']}</td>
                                <td style='width: 8.78%' class='centered'>{$vlAreaSegurada}</td>
                                <td style='width: 10.85%' class='centered'>{$dadosItem['vl_percentual_colhido_antes_vistoria']}</td>
                                <td style='width: 17.93%' class='centered'>{$dadosItem['vl_area_cultivada']}</td>
                                <td style='width: 24.20%' class='centered no-border-right'>{$dadosItem['is_zoneamento_valido']}</td>
                            </tr>
                        </table>
                    </td>
                </tr>

                <tr>
                    <td>
                        <table class='inner-tables'>
                            <tr class='questions-header no-border-bottom'>
                                <td class='no-border-left'><b>17.</b>Há unificação da vistoria nesta Quadra/Talhão? Sim ou Não?</td>
                                <td><b>18.</b>Foi realizada vistoria parcial nesta Quadra/Talhão? Sim ou Não? Se sim, quantos hectares foram vistoriados?</td>
                                <td><b>19.</b>A vistoria nesta Quadra/Talhão foi dispensada a coleta de amostras? Sim ou Não? Se sim, qual o motivo da dispensa?</td>
                                <td><b>20.</b>A vistoria nesta Quadra/Talhão foi postergada? Sim ou Não? Se sim, qual o motivo da postergação?</td>
                                <td rowspan='2' class='centered'><b>21.</b>Coordenadas Geográficas Quadra/Talhão:</td>
                                <td class='bg-white centered'>S:</td>
                                <td class='bg-white centered no-border-right'>{$dadosItem['ds_latitude']}</td>
                            </tr>
                            <tr class='inner-questions-content no-border-bottom'>
                                <td style='width: 21.70%'  class='centered no-border-left'>{$dadosItem['is_unificado']}</td>
                                <td style='width: 16.55%' class='centered'>{$dadosItem['is_parcial']}</td>
                                <td style='width: 23.68%' class='centered'>{$dadosItem['ds_motivo_dispensa']}</td>
                                <td style='width: 22.70%' class='centered'>{$dadosItem['ds_motivo_postergacao']}</td>
                                <td style='width: 2.11%;' class='centered'>W:</td>
                                <td style='width: 5.58%'  class='centered no-border-right'>{$dadosItem['ds_longitude']}</td>
                            </tr>
                        </table>
                    </td>
                </tr>
        ";
    }

    /**
     * Prepara as colunas da amostragem manual, já que elas devem ser apresentadas por colunas e não por linhas
     *
     * @param array|null $dadosAmostragem
     */
    protected function prepararColunasAmostragemManual(?array $dadosAmostragem): array
    {
        $tdsAmostras = [];
        for ($i=0; $i < 10; $i++) {

            $espacamentoEntreLinhas = Agro_Util::formatDbCurrency($dadosAmostragem[$i]['vl_espacamento_entre_linhas']) ?? '';
            $coordenadasS = $dadosAmostragem[$i]['ds_latitude'] ?? '';
            $coordenadasW = $dadosAmostragem[$i]['ds_longitude'] ?? '';
            $metrosLinhaColhidos = Agro_Util::formatDbCurrency($dadosAmostragem[$i]['vl_metros_linhas_colhidos']) ?? '';
            $producaoColhidaAmostra = Agro_Util::formatDbCurrency($dadosAmostragem[$i]['vl_producao_colhida_amostra'], 3) ?? '';
            $umidadeGraos = Agro_Util::formatDbCurrency($dadosAmostragem[$i]['vl_umidade_graos']) ?? '';
            $descontoUmidade = Agro_Util::formatDbCurrency($dadosAmostragem[$i]['vl_desconto_umidade_graos']) ?? '';
            $producaoLiquida = Agro_Util::formatDbCurrency($dadosAmostragem[$i]['vl_producao_liquida']) ?? '';

            $classTd = $i == 9 ? "centered no-border-right" : "centered";

            $htmlAmostras = [
                'vl_espacamento_entre_linhas' => "<td class='{$classTd}'>{$espacamentoEntreLinhas}</td>",
                'ds_latitude' => "<td class='{$classTd}'>{$coordenadasS}</td>",
                'ds_longitude' => "<td class='{$classTd}'>{$coordenadasW}</td>",
                'vl_metros_linhas_colhidos' => "<td class='{$classTd}'>{$metrosLinhaColhidos}</td>",
                'vl_producao_colhida_amostra' => "<td class='{$classTd}'>{$producaoColhidaAmostra}</td>",
                'vl_perdas_colheita' => "<td class='centered bold questions-header {$classTd}'>2%</td>",
                'vl_umidade_graos' => "<td class='{$classTd}'>{$umidadeGraos}</td>",
                'vl_desconto_umidade_graos' => "<td class='{$classTd}'>{$descontoUmidade}</td>",
                'vl_producao_liquida' => "<td class='{$classTd}'>{$producaoLiquida}</td>",
            ];
            $tdsAmostras[] = $htmlAmostras;
        }
        return $tdsAmostras;
    }

    /**
     * Retorna o HTML do bloco 'Amostragem Manual'
     *
     * @return string
     */
    protected function montarBlocoAmostragemManual(?array $dadosAmostragem): string
    {
        $tdsAmostras = $this->prepararColunasAmostragemManual($dadosAmostragem);

        $blocoAmostragemManual = "
            <tr>
                <td class='inner-header'>Amostragem Manual</td>
            </tr>
            <tr>
                <td>
                    <table class='table-questions inner-tables'>
                            <tr class='questions-header no-border-top'>
                                <td class='index-amostragem bg-white no-border-left'>22.</td>
                                <td colspan='2' class='label-amostragem'>Amostras</td>
                                <td class='centered'><b>1</b></td>
                                <td class='centered'><b>2</b></td>
                                <td class='centered'><b>3</b></td>
                                <td class='centered'><b>4</b></td>
                                <td class='centered'><b>5</b></td>
                                <td class='centered'><b>6</b></td>
                                <td class='centered'><b>7</b></td>
                                <td class='centered'><b>8</b></td>
                                <td class='centered'><b>9</b></td>
                                <td class='centered no-border-right'><b>10</b></td>
                            </tr>
        ";

        //Monta as amostras por colunas
        $contadorQuestionario = 0;
        foreach ($this->labelsLinhas as $labelIndex => $label) {

            $numeroQuestionario = 23 + $contadorQuestionario;
            $classTr = ($numeroQuestionario == 30) ? "class='no-border-bottom'" : '';

            $blocoAmostragemManual .= "<tr {$classTr}>";

            if ($numeroQuestionario == 24) {
                $blocoAmostragemManual .= "     <td rowspan='2' class='index-amostragem no-border-left'>24.</td>";
                $blocoAmostragemManual .= "     <td rowspan='2' class='questions-header' style='width: 17.34%'>Coordenadas da amostra</td>";
                $blocoAmostragemManual .= "     <td class='questions-header centered' style='width: 3%'>S</td>";
            } else {
                $blocoAmostragemManual .= "     <td class='index-amostragem no-border-left'>{$numeroQuestionario}.</td>";
                $blocoAmostragemManual .= "     <td colspan='2' class='questions-header'>{$label}</td>";
            }

            foreach ($tdsAmostras as $td) {
                $blocoAmostragemManual .= $td[$labelIndex];
            }
            $blocoAmostragemManual .= "</tr>";


            if ($numeroQuestionario == 24) {
                $blocoAmostragemManual .= "    <tr> ";
                $blocoAmostragemManual .= "        <td class='questions-header centered' style='width: 3%'>W</td> ";
                foreach ($tdsAmostras as $td) {
                    $blocoAmostragemManual .= $td['ds_longitude'];
                }
                $blocoAmostragemManual .= "    </tr> ";
            }

            $contadorQuestionario++;
        }

        $blocoAmostragemManual .= "
                    </table>
                </td>
            </tr>
        ";

        return $blocoAmostragemManual;
    }

    /**
     * Retorna o HTML do bloco 'Amostragem Mecanizada'
     *
     * @param array|null $dadosAmostragem
     * @param float|null $rendimentoFinalLavoura
     * @return string
     */
    protected function montarBlocoAmostagemMecanizada(?array $dadosAmostragem, ?float $rendimentoFinalLavoura): string
    {
        $larguraPlataforma = Agro_Util::formatDbCurrency($dadosAmostragem[0]['vl_largura_plataforma']) ?? '';
        $perdaColheita = Agro_Util::formatDbCurrency($dadosAmostragem[0]['vl_perda_colheita']) ?? '';
        $descontoUmidade = Agro_Util::formatDbCurrency($dadosAmostragem[0]['vl_desconto_umidade_graos']) ?? '';
        $distanciaPercorrida = Agro_Util::formatDbCurrency($dadosAmostragem[0]['vl_distancia_percorrida']) ?? '';
        $areaColhida = Agro_Util::formatDbCurrency($dadosAmostragem[0]['vl_area_colhida'], 3) ?? '';
        $producaoColhidaAmostra = Agro_Util::formatDbCurrency($dadosAmostragem[0]['vl_producao_colhida_amostra'], 3) ?? '';
        $umidadeGraos = Agro_Util::formatDbCurrency($dadosAmostragem[0]['vl_umidade_graos']) ?? '';
        $impurezas = Agro_Util::formatDbCurrency($dadosAmostragem[0]['vl_impurezas']) ?? '';
        $rendimentoFinalLavoura = Agro_Util::formatDbCurrency($rendimentoFinalLavoura, 3) ?? '-';

        return "
                <tr>
                    <td class='inner-header'>Amostragem Mecanizada</td>
                </tr>
                <tr>
                    <td>
                        <table class='table-questions inner-tables'>
                            <tr class='no-border-top'>
                                <td class='index-amostragem no-border-left'>31.</td>
                                <td class='questions-header label-amostragem'>Largura da Plataforma (m)</td>
                                <td class='centered'>{$larguraPlataforma}</td>
                                <td class='index-amostragem no-border-left'>34.</td>
                                <td class='questions-header label-amostragem'>Produção Colhida na Amostra (kg)</td>
                                <td class='centered'>{$producaoColhidaAmostra}</td>
                                <td class='index-amostragem'>37.</td>
                                <td class='questions-header label-amostragem'>Desconto de Umidade ( % )</td>
                                <td class='centered no-border-right'>{$descontoUmidade}</td>
                            </tr>
                            <tr>
                                <td class='index-amostragem no-border-left'>32.</td>
                                <td class='questions-header label-amostragem'>Distância Percorrida (m)</td>
                                <td class='centered'>{$distanciaPercorrida}</td>
                                <td class='index-amostragem'>35.</td>
                                <td class='questions-header label-amostragem'>Perda de colheita (%)</td>
                                <td class='centered'>{$perdaColheita}</td>
                                <td rowspan='2' class='index-amostragem'>38.</td>
                                <td rowspan='2' class='questions-header label-amostragem'>Impureza (%)</td>
                                <td rowspan='2' class='centered no-border-right'>{$impurezas}</td>
                            </tr>
                            <tr>
                                <td class='index-amostragem no-border-left'>33.</td>
                                <td class='questions-header label-amostragem'>Área Colhida ( ha )</td>
                                <td class='centered'>{$areaColhida}</td>
                                <td class='index-amostragem'>36.</td>
                                <td class='questions-header label-amostragem'>Umidade de Grãos (%)</td>
                                <td class='centered'>{$umidadeGraos}</td>
                            </tr>
                            <tr class='no-border-bottom'>
                                <td colspan='8' class='bold no-border-left' style='text-align: right; background-color: #F2F2F2;'>39.Rendimento Final da Lavoura (Ton/ha)</td>
                                <td class='centered no-border-right bold'>{$rendimentoFinalLavoura}</td>
                            </tr>
                        </table>
                    </td>
                </tr>
        ";
    }

    /**
     * Retorna o HTML do bloco 'ATENÇÃO: Os itens abaixo, caso informados, serão analisados pela Seguradora conforme cobertura contratada.'
     *
     * @param array @dadosItem
     * @return string
     */
    protected function montarBlocoAtencaoItens(array $dadosItem): string
    {
        $graosPodres = Agro_Util::formatDbCurrency($dadosItem['vl_graos_podres']) ?? '';
        $graosBrotados = Agro_Util::formatDbCurrency($dadosItem['vl_graos_brotados']) ?? '';
        $pragasDoencas = Agro_Util::formatDbCurrency($dadosItem['vl_pragas_doencas_outros']) ?? '';

        return "
                <tr>
                    <td class='inner-header'>ATENÇÃO: Os itens abaixo, caso informados, serão analisados pela Seguradora conforme cobertura contratada.</td>
                </tr>
                <tr>
                    <td>
                        <table class='inner-tables'>
                            <tr class='inner-questions-content no-border-top-bottom'>
                                <td style='width: 11%;' class='questions-header no-border-left'><b>40.</b>Grãos podres (%):</td>
                                <td class='centered'>{$graosPodres}</td>
                                <td style='width: 11%;' class='questions-header no-border-left'><b>41.</b>Grãos brotados (%):</td>
                                <td class='centered'>{$graosBrotados}</td>
                                <td style='width: 25%;' class='questions-header no-border-left'><b>42.</b>Pragas, doenças e outros danos (%): Especifique quais.</td>
                                <td class='centered no-border-right'>{$pragasDoencas}</td>
                            </tr>
                        </table>
                    </td>
                </tr>
        ";
    }

    /**
     * Retorna o HTML do bloco 'Observações Gerais da Vistoria/Lavoura'
     *
     * @return string
     */
    protected function montarBlocoObservacoesGerais(): string
    {
        return "
                <tr>
                    <td class='inner-header'>Observações Gerais da Vistoria/Lavoura</td>
                </tr>
                <tr>
                    <td style='height: 130px;'>
                        {$this->dados['laudoFinal']['ds_observacao']}
                    </td>
                </tr>
        ";
    }

    /**
     * Retorna o HTML do bloco de data e hora
     *
     * @param array $dadosItem
     * @return string
     */
    protected function montarBlocoDataHora(array $dadosItem): string
    {
        return "
                <tr>
                    <td class='inner-header' style='text-align: left;'>Este Laudo integra o processo de regulação do(s) sinistro(s) avisado(s) pelo Segurado. O pagamento de eventual indenização está sujeito à verificação, pela Seguradora, das condições do seguro.</td>
                </tr>
                <tr>
                    <td class='inner-header' style='text-align: left;'>Eu autorizo a AgroBrasil e a Essor a utilizarem meus dados pessoais e imagem para fins comerciais, jurídicos, financeiros e administrativos, inclusive enviarem para empresas terceiras que fazem parte do processo. Esta autorização terá prazo de validade de 15 anos, para garantir que todos os serviços e benefícios ofertados possam ser usufruídos.</td>
                </tr>
                <tr>
                    <td>
                        <table class='table-questions no-border-top-bottom inner-tables'>
                            <tr>
                                <td class='bold centered no-border-left' style='width: 5.17%'>Local:</td>
                                <td>{$this->dados['laudoFinal']['endereco_completo']}</td>
                                <td class='bold centered' style='width: 5.17%'>Data:</td>
                                <td style='width: 10%' class='centered'>{$dadosItem['dt_vistoria']}</td>
                                <td class='bold centered' style='width: 5.17%'>Hora:</td>
                                <td style='width: 10%' class='no-border-right centered'>{$dadosItem['hora_vistoria']}</td>
                            </tr>
                        </table>
                    </td>
                </tr>
        ";
    }

    /**
     * Retorna o HTML com para cada assinatura
     *
     * @param array $dadosAssinatura
     * @param bool $flAssinado
     * @return string
     */
    protected function montarAssinatura(array $dadosAssinatura, string $label, bool $flAssinado = true): string
    {
        $assinatura = "<table><tr><td style='width: 90.75px; height: 30.25px;'></td></tr></table>";
        if (!empty($dadosAssinatura['path']) && $flAssinado) {
            $assinatura = "<img width='90.75px' height='30.25px' src='{$dadosAssinatura['path']}' />";
        }

        if (!empty($dadosAssinatura['nome'])) {
            $assinatura .= "<hr style='color: black;'>";
            $assinatura .= "{$dadosAssinatura['nome']}";
            
            if (!empty($dadosAssinatura['identificador'])) {
                $assinatura .= " - {$dadosAssinatura['identificador']}";
            }

            $assinatura .= "<br>";
            $assinatura .= $label;
        }

        return $assinatura;
    }

    /**
     * Retorna o HTML do bloco de assinaturas
     *
     * @param bool @flAssinado
     * @return string
     */
    protected function montarBlocoAssinaturas(bool $flAssinado): string
    {
        $labelperito = 'Nome do perito - CREA/CFTA';
        $labelAgronomo = 'Agrônomo Representante da Seguradora';
        $labelAcompanhante = 'Acompanhante da Vistoria: Segurado, Autorizado ou Outro(s) - CPF';

        $assinaturaPeritoPrincipal = $this->montarAssinatura($this->dados['assinaturas']['perito_principal'], $labelperito);
        $assinaturaPeritoSecundario = $this->montarAssinatura($this->dados['assinaturas']['perito_secundario'], $labelperito);
        $assinaturaResponsavel = $this->montarAssinatura($this->dados['assinaturas']['responsavel'], $labelAcompanhante, $flAssinado);
        $assinaturaAgronomo1 = $this->montarAssinatura($this->dados['assinaturas']['agronomo_1'], $labelAgronomo);
        $assinaturaAgronomo2 = $this->montarAssinatura($this->dados['assinaturas']['agronomo_2'], $labelAgronomo);
        $assinaturaAgronomo3 = $this->montarAssinatura($this->dados['assinaturas']['agronomo_3'], $labelAgronomo);
        $assinaturaAgronomo4 = $this->montarAssinatura($this->dados['assinaturas']['agronomo_4'], $labelAgronomo);
        $assinaturaAgronomo5 = $this->montarAssinatura($this->dados['assinaturas']['agronomo_5'], $labelAgronomo);

        return "
            <tr>
                <td>
                    <table class='no-border'>
                        <tr>
                            <td style='width: 25%; padding-top: 10px; padding-right: 30px;' class='bold'>
                                {$assinaturaPeritoPrincipal}
                            </td>
                            <td style='width: 35%; padding-top: 10px; padding-right: 35px;' class='bold'>
                                {$assinaturaAgronomo1}
                            </td>
                            <td style='padding-top: 10px;' class='bold'>
                                {$assinaturaResponsavel}
                            </td>
                        </tr>
                        <tr>
                            <td style='padding-top: 10px; padding-right: 30px;' class='bold'>
                                {$assinaturaPeritoSecundario}
                            </td>
                            <td style='padding-top: 10px; padding-right: 35px;' class='bold'>
                                {$assinaturaAgronomo2}
                            </td>
                            <td style='padding-top: 10px;' class='bold'>
                                {$assinaturaAgronomo3}
                            </td>
                        </tr>
                        <tr>
                            <td style='padding-top: 10px; padding-right: 30px; padding-bottom: 10px;' class='bold'>
                            </td>
                            <td style='padding-top: 10px; padding-right: 35px; padding-bottom: 10px;' class='bold'>
                                {$assinaturaAgronomo4}
                            </td>
                            <td style='padding-top: 10px; padding-bottom: 10px;' class='bold'>
                                {$assinaturaAgronomo5}
                            </td>
                        </tr>
                    </table>
                </td>
            </tr>
            <tr>
                <td class='inner-header' style='color: red; text-align: left;'>*ATENÇÃO: a vistoria somente poderá ser realizada na presença do Segurado ou autorizado no Aviso de Sinistro. Na falta destes, uma declaração assinada pelo segurado autorizando quem assinou é válida.</td>
            </tr>
        ";
    }

    protected function montarCorpoSegundaPagina(): string
    {
        $corpo = "<table border='1' style='width: 100%;'>";
        $corpo .= $this->montarBlocoSegurado();
        $corpo .= $this->montarBlocoCroqui();
        $corpo .="</table>";
        return $corpo;
    }

    protected function montarBlocoSegurado(): string
    {
        $blocoSegurado = "
                <tr class='inner-questions-content'>
                    <td style='width: 13.10%;' class='bold centered'>Segurado:</td>
                    <td></td>
                    <td style='width: 13.10%;' class='bold centered'>Proposta:</td>
                    <td style='width: 13.10%;'></td>
                </tr>
        ";

        return $blocoSegurado;
    }

    protected function montarBlocoCroqui(): string
    {
        $blocoCroqui = "
                <tr class='no-border-bottom'>
                    <td colspan='4' style='padding-top: 10px; font-size: 6.5px;' class='croqui-padding'>
                        Croqui de Acesso da Propriedade e Talhões
                    </td>
                </tr>
                <tr class='no-border-top'>
                    <td colspan='4' style='height: 900px;' class='croqui-padding'>
                        <table style='border-collapse: collapse; margin: auto;'>
                            <tr>
                                <td style='height: 880px; border: 1px solid black;'>
                                </td>
                            </tr>
                        </table>
                    </td>
                </tr>
        ";

        return $blocoCroqui;
    }

    /**
     * Retorna o HTML do cabeçalho do laudo
     *
     * @return string
     */
    protected function montarCabecalhoLaudo(): string
    {
        return "
            <table>
                <tr class='no-border-bottom'>
                    <td class='centered no-border-right' style='width: 21.73%'>
                        <div class='bold'>LAUDO DE VISTORIA FINAL GRÃOS</div>
                    </td>
                    <td class='no-border-sides vertical-midle' style='width: 21.73%'>
                        <table width='100%' height='100%' class='no-border'>
                            <tr>
                                <td style=height:'50%;' class='padding-4'>
                                    <span class='bold'>Produto:</span>
                                </td>
                                <td class='padding-4'>
                                    <span class='bold'>{$this->dados['laudoFinal']['ds_nome_produto']}</span>
                                </td>
                            </tr>
                            <tr>
                                <td style=height:'50%;' class='padding-4'>
                                    <span class='bold'>Cultura:</span>
                                </td>
                                <td class='padding-4'>
                                    <span class='bold'>{$this->dados['laudoFinal']['ds_nome_cultura']}</span>
                                </td>
                            </tr>
                        </table>
                    </td>
                    <td style='width: 30.33%'>
                        <table width='100%' height='100%' class='no-border'>
                            <tr>
                                <td class='inner-header' style='border-bottom: 1px solid;'>
                                    Prestadora de Serviço de Vistorias de Sinistro
                                </td>
                            </tr>
                            <tr>
                                <td class='inner-content bold centered'>{$this->dados['laudoFinal']['ds_nome_fantasia']}</td>
                            </tr>
                        </table>
                    </td>
                    <td class='logo-cell padding-4' style='width: 26.21%'>
                    <img src='/resources/imagens/logo_agrobrasil_laudo.png' class='logo-img' alt='Logo AgroBrasil'>
                    <img src='/resources/imagens/logo_essor_novo.png' class='logo-img' alt='Logo Essor'>
                    </td>
                </tr>
            </table>
        ";
    }

    /**
     * Gera a imagem de assinatura de acordo com o SVG informado
     *
     * @param string $assinante
     * @param string|null $svg
     * @return string
     */
    protected function gerarImagemAssinatura(string $assinante, ?string $svg): string
    {
        $svg = $this->validarSVG($svg);

        if ($svg) {
            $path = (new Agro_File)->getPath('empresas');
            $nomeArquivo = "assinatura_{$assinante}_{$this->idLaudoFinal}.png";

            Agro_Util::convertImage(
                $nomeArquivo,
                'png24',
                $path,
                985,
                760,
                '',
                $svg
            );

            return $path . $nomeArquivo;
        }

        return "";
    }

    /**
     * Valida se o SVG informado é válido. (possui a tag SVG). No caso de ser válido, verificamos
     * se há as propriedades 'width' e 'height' informados para ele. Se não houver, adicionamos
     * essas propriedades.
     *
     * @param string|null $svg
     * @param int $width
     * @param int $height
     * @return string|null
     */
    protected function validarSVG(?string $svg, int $width = 550, int $height = 300): ?string {
        $dom = new DOMDocument();

        $dom->loadXML($svg);
        libxml_clear_errors();

        $elementoSVG = $dom->getElementsByTagName('svg')->item(0);

        if (!$elementoSVG) {
            return '';
        }
        
        $hasWidth = $elementoSVG->hasAttribute('width');
        $hasHeight = $elementoSVG->hasAttribute('height');
        
        if (!$hasWidth) {
            $elementoSVG->setAttribute('width', $width);
        }
        
        if (!$hasHeight) {
            $elementoSVG->setAttribute('height', $height);
        }
        
        return $dom->saveXML();
    }

    /**
     * Altera os valores do percentual e do rendimento final para os casos onde há motivo de dispensa para o item
     *
     * @param array &item
     */
    private function tratarDadosDispensados(array &$item): void
    {
        $item['vl_percentual_colhido_antes_vistoria'] = Agro_Util::formatDbCurrency($item['vl_percentual_colhido_antes_vistoria']);

        if (!empty($item['id_motivo'])) {

            if ($item['id_motivo'] != Sinistro2_Model_MotivosQuadraNaoVistoriada::AREA_COLHIDA) {
                $item['vl_percentual_colhido_antes_vistoria'] = '-';
            }
            
            $item['vl_rendimento_final_lavoura'] = null;
        }
    }
}
