<?php

class Produto_Model_Coberturas extends Agro_Db_Table_Abstract {
    const COB_PROTECAO_FITO = 16;
    const COB_QUEDA_PARREIRAL = 11;
    const COB_QUEDA_PARREIRAL_ESTENDIDA = 41;
    const COB_REPLANTIO = 5;
    const COB_REPLANTIO_SEM_ESTIAGEM = 30;
    const COB_REPLANTIO_EXCESSO_CHUVA = 31;
    const COB_REPLANTIO_GEADA = 36;
    const COB_MULTIRISCO = 18;
    const COB_MULTIRISCO_II = 32;
    const BAIXA_INDICE = 42;
	const COB_GEADA_II = 46;
	const COB_GEADA = 3;
	const COB_GRANIZO = 1;
	const COB_QUALIDADEIII_CEV = 45;

    const COB_GRANIZO_CHAVE = 'COB_GRANIZO';
    const COB_MULTIRISCO_CHAVE = 'COB_MULTIRISCO';
    const COB_MULTIRISCO_II_CHAVE = 'COB_MULTIRISCO_II';
    const COB_MULTIRRISCO_RAIO_VARIACAO_EXT_TEMP_CHAVE = 'COB_MULTIRRISCO_RAIO_VARIACAO_EXT_TEMP';

    const DS_CHAVE_COB_REPLANTIO = 'COB_REPLANTIO';
    const DS_CHAVE_COB_REPLANTIO_EXCESSO_CHUVA = 'COB_REPLANTIO_EXCESSO_CHUVA';
    const DS_CHAVE_COB_REPLANTIO_GEADA = 'COB_REPLANTIO_GEADA';
    const DS_CHAVE_COB_REPLANTIO_SEM_ESTIAGEM = 'COB_REPLANTIO_SEM_ESTIAGEM';

    const DS_CHAVE_COB_QUEDA_PARREIRAL = 'COB_QUEDA_PARREIRAL';
    const DS_CHAVE_COB_QUEDA_PARREIRAL_ESTENDIDA = 'COB_QUEDA_PARREIRAL_ESTENDIDA';

	protected $_rowClass = 'Produto_Model_Row_Cobertura';
	protected $_schema = 'produto';
	protected $_name = 'coberturas';
	protected $_primary = 'id';
	public $_order = 'ds_nome_cobertura';
	public $_columnExcel = array(
		'id' => 'Cód',
		'ds_nome_cobertura' => 'Nome',
		'ds_chave_cobertura' => 'Chave'
	);
	
	public function save(array $data){
		try {
			$Row = $this->getRow($data['id']);
			
			$Row->ds_nome_cobertura = $data['ds_nome_cobertura'];
			$Row->ds_descricao_cobertura = $data['ds_descricao_cobertura'];
			$Row->ds_chave_cobertura = $data['ds_chave_cobertura'];
			$Row->cd_cobertura_seguradora = ($data['cd_cobertura_seguradora'] ? $data['cd_cobertura_seguradora'] : null);
			$Row->id_tipo_liquidacao_cobertura = ($data['id_tipo_liquidacao_cobertura'] ? $data['id_tipo_liquidacao_cobertura'] : null);

			return $Row->save();

		} catch (Exception $e) {
			return false;
		}
	
	}
	

	public static function isReplantio(int $id): bool
	{
		return in_array($id, [
			self::COB_REPLANTIO,
			self::COB_REPLANTIO_EXCESSO_CHUVA,
			self::COB_REPLANTIO_GEADA,
			self::COB_REPLANTIO_SEM_ESTIAGEM
		]);
	}

	public function setEventos($eventos) {
		$cobertura = new Zend_Session_Namespace('cobertura');
		$this->_db->query("delete from produto.coberturas_eventos where id_cobertura = {$cobertura->id}");
		
		if (is_array($eventos)) {
			foreach ($eventos as $evento) {
				$ins = array(
					'id_cobertura' => $cobertura->id,
					'id_evento' => $evento
				);
				
				$CoberturaEvento = new Produto_Model_CoberturasEventos();
				$CoberturaEvento->insert($ins);
			}
		}
	}
	
	public function getEventos($id) {
		$Select = $this->select();
		$Select->setIntegrityCheck(false);
		$Select->from(array('e'=>'produto.eventos'));
		$Select->join(array('ce'=>'produto.coberturas_eventos'), 'e.id = ce.id_evento');
		$Select->where(' ce.id_cobertura = ?', $id);
		$Select->where(' e.fl_ativo = true');
		$Select->order('ds_nome_evento');
		
		return $this->fetchAll($Select)->toArray();
	}
	
	public function getCoberturasByIdProposta($idProposta){
		if($idProposta){
			$select = "
				select
					co.id,
					co.ds_nome_cobertura
				from
					produto.coberturas co
				where
					co.id in(
						select
							ce.id_cobertura
						from
							produto.coberturas_eventos ce
						where
							ce.id_evento in(
								
								select
									ae.id_evento
								from
									sinistro.avisos av inner join
									sinistro.avisos_eventos ae on av.id = ae.id_aviso
								where
									av.id_proposta = $idProposta and
									av.fl_ativo = true
							)
					)
			";
			
			return $this->_db->fetchAll($select);
		}else{
			return null;
		}
	}
	
	public function getComboProduto($produto) {
		$Select = $this->select();
		$Select->setIntegrityCheck(false);
		$Select->from(array('c'=>'produto.coberturas'), '*');
		$Select->join(array('pc'=>'produto.produtos_coberturas'), 'c.id = pc.id_cobertura');
		$Select->where('id_produto = ?', $produto);
		
		$Rs = $this->fetchAll($Select)->toArray();
		
		$options = array();
		if (is_array($Rs)) {
			$options[0] = '';
			foreach ($Rs as $row) {
				$options[$row['id']] = $row['ds_nome_cobertura'];
			}
			
			return $options;
		} else {
			return false;
		}
		
		
		
		return $this->fetchRow($Select);
	}
	
	public function getCobertura($chave, $produto) {
		$Select = $this->select();
		$Select->setIntegrityCheck(false);
		$Select->from(array('c'=>'produto.coberturas'), '*');
		$Select->join(array('pc'=>'produto.produtos_coberturas'), 'c.id = pc.id_cobertura');

		if ($chave) {
			$Select->where('ds_chave_cobertura = ?', $chave);
		}
		
		if ($produto) {
			$Select->where('pc.id_produto = ?', $produto);
		}
		
		return $this->fetchRow($Select);
	}
	
	public function getCoberturasProduto(array $produto) : array
    {
        $select = $this->select()->setIntegrityCheck(false);
        $select->from(array('c' => 'produto.coberturas'), array('ds_nome_cobertura', 'ds_descricao_cobertura'));
        $select->join(
            array('pc' => 'produto.produtos_coberturas'),
            'c.id = pc.id_cobertura',
            array(
                'id_cobertura',
                'fl_cobertura_principal',
                'fl_taxa_relacionada',
                'fl_somente_renovacoes',
                'fl_vistoria_previa',
                'vl_lmi',
                'id_condicao_especial',
                'fl_vistoria_preliminar',
                'fl_cobertura_dependente',
                'id_cobertura_dependencia',
                'fl_exibir_franquia',
                'id_produto',
            )
        );
        $select->where('id_produto in (' . implode(',', $produto) . ')');

        return $this->fetchAll($select)->toArray();
    }
	
	public function getDadosXls($dados) {
		$Select = $this->select()->setIntegrityCheck(false);
		$Select->from(array('c'=>'produto.coberturas'));
		
		$Rs = $this->fetchAll($Select);
		if ($Rs->count()) {
			return $Rs->toArray();
		} else {
			return array();
		}
	}
	
	public function getNameById($id){
		$Row = $this->getRow($id);
		return $Row->ds_nome_cobertura;
	}
	
	public function getChaveById($id) {

		$Select = $this->select()->setIntegrityCheck(false);
		$Select->from(array('c'=>'produto.coberturas'), 'ds_chave_cobertura');
		$Select->where('id = ?', $id);

		return $this->_db->fetchOne($Select);
	}

    public static function getCoberturasQuedaParreiral() : array
    {
        return [
            self::COB_QUEDA_PARREIRAL,
            self::COB_QUEDA_PARREIRAL_ESTENDIDA,
        ];
    }

    public static function getCoberturasReplantio() : array
    {
        return [
            self::COB_REPLANTIO,
            self::COB_REPLANTIO_EXCESSO_CHUVA,
            self::COB_REPLANTIO_GEADA,
            self::COB_REPLANTIO_SEM_ESTIAGEM,
        ];
    }

    public static function getCoberturasQuedaParreiralChave() : array
    {
        return [
            self::DS_CHAVE_COB_QUEDA_PARREIRAL,
            self::DS_CHAVE_COB_QUEDA_PARREIRAL_ESTENDIDA,
        ];
    }

    public static function getCoberturasReplantioChave() : array
    {
        return [
            self::DS_CHAVE_COB_REPLANTIO,
            self::DS_CHAVE_COB_REPLANTIO_EXCESSO_CHUVA,
            self::DS_CHAVE_COB_REPLANTIO_GEADA,
            self::DS_CHAVE_COB_REPLANTIO_SEM_ESTIAGEM,
        ];
    }

	public function getComboTipoLiquidacao(): array
	{
		$options = ['' => 'Selecione...'];

		$select = $this->select();
		$select->setIntegrityCheck(false);
		$select->from(array('ptlc'=>'produto.tipos_liquidacoes_coberturas'), ['id', 'ds_nome']);
		$select->where('ptlc.fl_ativo = ?', true);
		$rs = $this->fetchAll($select)->toArray();
		
		foreach ($rs as $row) {
			$options[$row['id']] = $row['ds_nome'];
		}

		return $options;
	}

    public function getCoberturas(array $campos, array $where): Zend_Db_Table_Rowset_Abstract
    {
        $campos = !empty($campos) ? $campos : ['*'];
        $select = $this->select()
            ->setIntegrityCheck(true)
            ->from(['pc' => "{$this->_schema}.{$this->_name}"], $campos);

        foreach ($where as $condicao) {
            $select->where($condicao);
        }

        if (empty($where)) {
            $select->limit(1);
        }

        return $this->fetchAll($select);
    }
}
