<?php

declare(strict_types=1);

class Sinistro2_Model_ParametroTipoDespesa extends Agro_Db_Table_Abstract
{
    protected $_schema = 'sinistro';
	protected $_name = 'parametro_tipo_despesa';
	protected $_primary = 'id';
    public $_columnExcel = array(
		'id' => 'Cód',
		'id_tipo_despesa' => 'ID Tipo Despesa',
        'ds_parametro_tipo_despesa' => 'Descrição Parâmetro Tipo Despesa',
        'vl_minimo' => 'Valor Mínimo',
        'vl_maximo' => 'Valor Máximo',
        'estados' => 'Estados / UFs'
	);

    public function save(array $dados): Zend_Db_Table_Row
    {
        if (!empty($dados['id'])) {
            $row = $this->find($dados['id'])->current();
        } else {
            $row = $this->createRow();
        }
        
        $row->id_tipo_despesa = $dados['id_tipo_despesa'];
        $row->ds_parametro_tipo_despesa = $dados['ds_parametro_tipo_despesa'];
        $row->vl_minimo = !empty($dados['vl_minimo']) ? $dados['vl_minimo'] : null;
        $row->vl_maximo = !empty($dados['vl_maximo']) ? $dados['vl_maximo'] : null;
        $row->fl_anexo_obrigatorio = !empty($dados['fl_anexo_obrigatorio']) ? 1 : 0;
        
        $idParametroTipoDespesa = $row->save();
        
        if (!empty($dados['ids_estado'])) {
            (new Sinistro2_Model_ParametroTipoDespesaEstado())->save($idParametroTipoDespesa, $dados['ids_estado']);
        }

        return $row;
    }

    public function beforeDelete($id, $field = '')
    {
        (new Sinistro2_Model_ParametroTipoDespesaEstado())->deleteByIdParametroTipoDespesa((int) $id);
    }

    public function getParametrosTiposDespesaByIdEstado(int $idEstado): array
    {
        return $this->fetchAll(
            $this->select()
                ->setIntegrityCheck(false)
                ->from(
                    ['sptd' => 'sinistro.parametro_tipo_despesa'],
                    'sptd.id, sptd.id_tipo_despesa, sptd.ds_parametro_tipo_despesa'
                )
                ->join(
                    ['sptde' => 'sinistro.parametro_tipo_despesa_estado'],
                    'sptde.id_parametro_tipo_despesa = sptd.id',
                    false
                )
                ->where('sptde.id_estado = ?', $idEstado)
        )->toArray();
    }

    public function getEstadosVinculados(int $idParametroTipoDespesa): array
    {
        $q = $this->select()
            ->setIntegrityCheck(false)
            ->from(['sptd' => 'sinistro.parametro_tipo_despesa'])
            ->join(
                ['sptde' => 'sinistro.parametro_tipo_despesa_estado'],
                'sptde.id_parametro_tipo_despesa = sptd.id',
                'id_estado'
            )
            ->where('sptd.id = ?', $idParametroTipoDespesa);

        $rs = $this->fetchAll($q);

        if ($rs->count() > 0) {
            return $rs->toArray();
        }

        return [];
    }

    public function getParametrosTiposDespesa(string $tipoDespesa='', array $idsEstado=[]): array
    {
        $subq = $this->select()
            ->setIntegrityCheck(false)
            ->from(
                ['sptd' => 'sinistro.parametro_tipo_despesa'],
                'sptd.id, sptd.vl_minimo, sptd.vl_maximo, sptd.ds_parametro_tipo_despesa'
            )
            ->join(
                ['sptde' => 'sinistro.parametro_tipo_despesa_estado'],
                'sptde.id_parametro_tipo_despesa = sptd.id',
                false
            )
            ->join(
                ['se' => 'sistema.estados'],
                'se.id = sptde.id_estado',
                "string_agg(ds_sigla, ', ' ORDER BY ds_sigla) as estados"
            )
            ->group(['sptd.id']);
        
        if (!empty($tipoDespesa)) {
            $subq->where("ds_tipo_despesa ILIKE '%{$tipoDespesa}%'");
        }
        
        $q = $this->select()
            ->setIntegrityCheck(false)
            ->from(
                ['aux' => $subq],
                'aux.id, aux.ds_parametro_tipo_despesa, aux.vl_minimo, aux.vl_maximo, aux.estados')
            ->join(
                ['sptde' => 'sinistro.parametro_tipo_despesa_estado'],
                'sptde.id_tipo_despesa = aux.id',
                false
            )
            ->join(
                ['se' => 'sistema.estados'],
                'se.id = sptde.id_estado',
                false
            );

        if (!empty($idsEstado)) {
            $q->where("id_estado IN(?) ", $idsEstado);
        }
        
        $rs = $this->fetchAll($q);

        if ($rs->count() > 0) {
            return $rs->toArray();
        }

        return [];
    }

    public function fetchAllPaginator($where, $pageNumber=false, $itemCountPerPage = 10, $paginator='')
    {
        $q = $this->select()
            ->setIntegrityCheck(false)
            ->from(
                ['sptd' => 'sinistro.parametro_tipo_despesa'],
                'sptd.id, sptd.ds_parametro_tipo_despesa, sptd.fl_anexo_obrigatorio'
            )
            ->join(
                ['sptde' => 'sinistro.parametro_tipo_despesa_estado'],
                'sptde.id_parametro_tipo_despesa = sptd.id',
                false
            )
            ->join(
                ['std' => 'sinistro.tipo_despesa'],
                'std.id = sptd.id_tipo_despesa',
                'ds_tipo_despesa'
            )
            ->join(
                ['se' => 'sistema.estados'],
                'se.id = sptde.id_estado',
                "string_agg(ds_sigla, ', ' ORDER BY ds_sigla) as estados"
            )
            ->group(['sptd.id', 'std.ds_tipo_despesa']);

        $this->getWhere($q, $where);
        
        return $this->getPaginator($q, $pageNumber, $itemCountPerPage, $paginator);
    }
}