<?php

class Sinistro2_Model_RelatorioImportacaoIndenizacao extends Agro_Db_Table_Abstract
{
    protected $_schema = 'sinistro';
	protected $_name = 'relatorio_importacao_indenizacao';
	protected $_primary = 'id';

    public function save(array $data): ?int
    {
        $row = $this->createRow();

        if (!empty($data['id'])) {
            $row = $this->getRow($data['id']);
        }
        
        $row->dt_base_inicial = $data['dt_base_inicial'];
        $row->dt_base_final = $data['dt_base_final'];
        $row->ds_nome_arquivo = $data['ds_nome_arquivo'];
        $row->ds_incluiu_antecipacoes = ($data['ds_incluiu_antecipacoes']) ? 't' : 'f';
        $row->ds_ids_liquidacoes_antecipacoes = $data['ds_ids_liquidacoes_antecipacoes'];
        
        return $row->save();
    }

    public function fetchAllPaginatorProposta($where, $pageNumber=false, $itemCountPerPage = 10, $paginator='') {
        if ($paginator) {
			return $this->getPaginator($this->getPropostas(), $pageNumber, $itemCountPerPage, $paginator);
        } else {
            return $this->getPaginator($this->getPropostas(), 1, null, false);
        }
    }

    public function getPropostas()
    {
        $db = Zend_Db_Table::getDefaultAdapter();

        $subSelect = $db->select()
            ->from(
                ['lisc' => 'sinistro.liquidacoes_itens_segurados_coberturas'],
                [
                    'vl_indenizacao' => new Zend_Db_Expr('GREATEST(SUM(vl_indenizacao), 0)'),
                    'id_liquidacao'
                ]
            )
            ->join(
                ['coberturas' => 'produto.coberturas'],
                'coberturas.id = lisc.id_cobertura',
                []
            )
            ->group('lisc.id_liquidacao');

        $subSelectRanked = $db->select()
            ->from(
                ['pb' => 'seguro.propostas_beneficiarios'],
                [
                    'id_proposta',
                    'ds_nome_beneficiarios',
                    'nr_cpf_cnpj',
                    'rn' => new Zend_Db_Expr(
                        'ROW_NUMBER() OVER (
                            PARTITION BY id_proposta
                            ORDER BY ds_nome_beneficiarios
                        )'
                    )
                ]
            )
            ->where('pb.fl_del IS FALSE');

        $subSelectBeneficiario = $db->select()
            ->from(
                ['pb' => $subSelectRanked],
                [
                    'beneficiarios' => new Zend_Db_Expr(
                        "STRING_AGG(ds_nome_beneficiarios, ',')"
                    ),
                    
                    'cpf_cnpj_beneficiarios' => new Zend_Db_Expr(
                        "STRING_AGG(nr_cpf_cnpj, ',')"
                    ),
                    'id_proposta'
                ]
            )
            ->where('rn <= 2')
            ->group('id_proposta');
  
        return $db->select()
            ->from(['propostas' => 'seguro.propostas'], ['id_proposta_mae', 'nr_apolice'])
            ->join(
                ['propostas_endosso' => 'seguro.propostas_endosso'],
                'propostas_endosso.id_proposta = propostas.id AND fl_proposta_vigente IS TRUE',
                false
            )
            ->join(['processos' => 'sinistro.processos'], 'processos.id_proposta = propostas.id', false)
            ->join(
                ['liquidacoes' => 'sinistro.liquidacoes'],
                'liquidacoes.id_processo = processos.id',
                ['id AS id_liquidacao', 'to_char(dt_base_pagamento, \'DD/MM/YYYY\') AS dt_base_pagamento']
            )
            ->join(
                ['propostas_proponentes' => 'seguro.propostas_proponentes'],
                'propostas_proponentes.id_proposta = propostas.id',
                ['cpf_cnpj AS cpf_cnpj_segurado', 'ds_nome_proponente AS segurado']
            )
            ->join(['subq' => new Zend_Db_Expr('(' . $subSelect . ')')], 'subq.id_liquidacao = liquidacoes.id', 'vl_indenizacao')
            ->join(['produtos' => 'produto.produtos'], 'produtos.id = propostas.id_produto', [])
            ->join(
                ['liquidacoes_status' => 'sinistro.liquidacoes_status'],
                'liquidacoes_status.id_liquidacao = liquidacoes.id AND liquidacoes_status.fl_ativo IS TRUE'
            )
            ->joinLeft(
                ['subqbeneficiario' => new Zend_Db_Expr('(' . $subSelectBeneficiario . ')')],
                'subqbeneficiario.id_proposta = propostas.id',
                ['beneficiarios', 'cpf_cnpj_beneficiarios']
            )
            ->where('liquidacoes_status.id_status  = ?', Sinistro2_Model_Liquidacoes::ID_STATUS_ENVIADA_SEGURADORA)
            ->where('produtos.id_safra >= 16')
            ->where('liquidacoes.id IN (SELECT id_liquidacao FROM sinistro.liquidacoes_itens_segurados_coberturas)')
            ->order('liquidacoes.dt_base_pagamento ASC');
    }

    public function getData($where = false)
    {
        $db = Zend_Db_Table::getDefaultAdapter();

        $subSelect = $db->select()
            ->from(
                ['ri' => 'sinistro.relatorio_importacao_indenizacao'],
                [
                    '*',
                    new Zend_Db_Expr('ROW_NUMBER() OVER (PARTITION BY dt_base_inicial, dt_base_final ORDER BY dt_criacao DESC) AS rn')
                ]
            );

        return $db->select()
            ->from(
                ['urpp' => new Zend_Db_Expr('(' . $subSelect . ')')],
                [
                    'id',
                    'data_base_inicial' => new Zend_Db_Expr("TO_CHAR(urpp.dt_base_inicial, 'DD/MM/YYYY')"),
                    'data_base_final' => new Zend_Db_Expr("TO_CHAR(urpp.dt_base_final, 'DD/MM/YYYY')"),
                    'data_geracao_relatorio' => new Zend_Db_Expr("TO_CHAR(urpp.dt_criacao, 'DD/MM/YYYY HH24:MI:SS')"),
                    'ds_nome_arquivo',
                    'ds_incluiu_antecipacoes'
                ]
            )
            ->join(['su' => 'sistema.usuarios'], 'su.id = urpp.id_usuario_criacao', [])
            ->join(['sf' => 'sistema.funcionarios'], 'sf.id_usuario = su.id', ['ds_nome_funcionario'])
            ->where('urpp.rn = 1')
            ->order('urpp.dt_criacao ASC');
    }

    public function getDataBasesByIdLiquidacoes(array $idsLiquidacoes): array
    {
        $subSelectAvisoEncerramento = $this->select()
            ->setIntegrityCheck(false)
            ->from(
                ['avisos_encerramento' => 'sinistro.avisos_encerramento'],
                ['id_proposta', 'MAX(dt_encerramento_colheita) AS dt_encerramento_colheita']
            )
            ->where('fl_del IS FALSE')
            ->group('id_proposta');

        $subSelectProcessoArquivo = $this->select()
            ->setIntegrityCheck(false)
            ->from(['processos' => 'sinistro.processos'], ['id AS id_processo'])
            ->join(
                ['sprocobs' => 'sinistro.processos_observacoes_arquivos'],
                'sprocobs.id_processo = processos.id',
                ['max(sprocobs.dt_criacao) as dt_atualizacao_status']
            )
            ->where('processos.id_status_arquivos = 108')
            ->group('processos.id');

        $rs = $this->fetchAll(
            $this->select()
                ->setIntegrityCheck(false)
                ->from(['liquidacoes' => 'sinistro.liquidacoes'], [])
                ->join(['processos' => 'sinistro.processos'], 'processos.id = liquidacoes.id_processo', [])
                ->join(
                    ['subqprocarquivos' => new Zend_Db_Expr('('. $subSelectProcessoArquivo .')')],
                    'subqprocarquivos.id_processo = processos.id',
                    []
                )
                ->joinLeft(
                    ['subqavisoencerramento' => new Zend_Db_Expr('('. $subSelectAvisoEncerramento .')')],
                    'subqavisoencerramento.id_proposta = processos.id_proposta',
                    ['
                        to_char(
                            GREATEST(
                                subqavisoencerramento.dt_encerramento_colheita,
                                subqprocarquivos.dt_atualizacao_status::timestamp
                            ),
                            \'YYYY-MM-DD\'
                        ) AS dt_base
                    ']
                )
                ->where('liquidacoes.id IN (?)', $idsLiquidacoes)
                ->order('GREATEST(subqavisoencerramento.dt_encerramento_colheita, subqprocarquivos.dt_atualizacao_status)')
        );

        $rs = $rs->toArray();

        return [$rs[0]['dt_base'], $rs[count($rs) - 1]['dt_base']];
    }


    public function getIdsLiquidacoes(int $idRelatorio): array
    {
        $rs = $this->fetchAll(
            $this->select()
                ->setIntegrityCheck(false)
                ->from(['rel' => 'sinistro.relatorio_importacao_indenizacao'], [])
                ->join(
                    ['rel_liq' => 'sinistro.relatorio_importacao_indenizacao_liquidacao'],
                    'rel.id = rel_liq.id_relatorio_importacao_indenizacao',
                    ['id_liquidacao']
                )
                ->where('rel.id = ?', $idRelatorio)
        )->toArray();

        if (empty($rs)) {
            return [];
        }

        return array_map(function($row) {
            return $row['id_liquidacao'];
        }, $rs);
    }
}