<?php

class Produto_Model_Atributos extends Agro_Db_Table_Abstract {
    const DS_CHAVE_PROD_SUBVENCAO_ESTADUAL_CULTURA_PR = 'PROD_SUBVENCAO_ESTADUAL_CULTURA_PR';
    const DS_CHAVE_PROD_SUBVENCAO_FEDERAL_VALOR_MAX_GRUPO = 'PROD_SUBVENCAO_FEDERAL_VALOR_MAX_GRUPO';
    const DS_CHAVE_PROD_VALIDAR_RENOVACAO_SEM_SINISTRO = 'PROD_VALIDAR_RENOVACAO_SEM_SINISTRO';
	const DS_CHAVE_LIMITE_MINIMO_CULTIVO = 'LIMITE_MINIMO_CULTIVO';
	const DS_CHAVE_LIMITE_MAXIMO_CULTIVO = 'LIMITE_MAXIMO_CULTIVO';

    const ID_PROD_TIPO_FINAL_VIGENCIA = 120;
    const ID_PROD_PERMITIR_SEGURO_AREA_SEMEADA_TRANSPLANTADA = 191;

    const EXCEPTION_PROD_SUBVENCAO_FEDERAL_VALOR_MAX_GRUPO_NAO_INFORMADO = 1;

	protected $_schema = 'produto';
	protected $_name = 'atributos_rn';
	protected $_view = 'v_atributos';
	protected $_primary = 'id';
	public $_order = array('ds_ordem', 'id_parent', 'id');
	private $_questionario = array();
	private $return = array();
	
	public function save($data){
		$ModelAtributosTipos = new Produto_Model_AtributosTipos();
		$AtributosTipos = $ModelAtributosTipos->find($data['id_tipo_atributo'])->current();	
		$Row = $this->getRow($data['id']);

		$Row->id_atributo_modulo = $data['id_atributo_modulo'];
		$Row->ds_chave_rn = $data['ds_chave_rn'];
		$Row->ds_descricao_atributo = $data['ds_descricao_atributo'];
		$Row->fl_permite_exclusao = $data['fl_permite_exclusao'];
		$Row->fl_atendimento = $data['fl_atendimento'];
		$Row->fl_required = $data['fl_required'];
		$Row->id_tipo_atributo = $data['id_tipo_atributo'];
		$Row->ds_valores_opcoes = $data['ds_valores_opcoes'];

		if(!$data['id']) {
			$Row->ds_ordem = $this->getLastOrder();
		}

		$Row->ds_parent_value = $data['ds_parent_value'];
		$Row->ds_validar_campo = $data['ds_validar_campo'];
		$Row->ds_validar_campo_valor = $data['ds_validar_campo_valor'];

		if ($Tipo->ds_chave_tipo_atributo == 'lookup') {
			$Row->ds_schema = $data['ds_schema'];
			$Row->ds_table = $data['ds_table'];
			$Row->ds_option_value = $data['ds_option_value'];
			$Row->ds_option_text = $data['ds_option_text'];
			$Row->ds_option_filter = $data['ds_option_filter'];
		}

		if ($data['id_parent']) {
			$Row->id_parent = $data['id_parent'];
		}

		return $Row->save();
	}
	
	public function estaAtivoParaProduto(int $idProduto, string $chave): bool
	{
		$rs = $this->fetchRow(
			$this->select()
				->setIntegrityCheck(false)
				->from(['parn' => 'produto.atributos_rn'], null)
				->join(['prodparn' => 'produto.produtos_atributos_rn'], ' prodparn.id_atributo_rn = parn.id', 'ds_valor')
				->join(
					['prodgroup' => 'produto.produtos_grupos_atributos_rn'],
					'prodgroup.id = prodparn.id_grupo_atributo_rn',
					false
				)
				->where('id_produto = ?', $idProduto)
				->where('ds_chave_rn = ?', $chave)
				->where('prodparn.fl_ativo IS TRUE AND prodparn.fl_del IS FALSE')
		);

		return !empty($rs);
	}

	public function getAtributosModulo($modulo) {
		$select = $this->select()->setIntegrityCheck(false);
		$select->from(array('a' => 'produto.v_atributos'));
		$select->where('ds_chave_atributo_modulo = ?', $modulo);
		$Rs = $this->fetchAll($select);

		if (is_object($Rs)) {
			$options[] = '';
			foreach ($Rs as $row) {
				$options[$row->id] = $row->ds_descricao_atributo;
			}
				
			return $options;
		} else {
			return false;
		}
	}
	
	public function getAtributosRelacionados($grupo) {
		$select = $this->select()->setIntegrityCheck(false);
		$select->from(array('a' => 'produto.produtos_atributos_rn'));
		$select->where('id_grupo_atributo_rn = ?', $grupo);
		$select->where('fl_del is false');
		$Rs = $this->fetchAll($select);
		
		$return = array();
		if ($Rs->count()) {
			foreach ($Rs as $Row) {
				$return[] = $Row->id_atributo_rn;
			}
		}
		
		return $return;
	}
	
	public function getAtributoValue($atributo, $grupo) {
		$select = $this->select()->setIntegrityCheck(false);
		$select->from(array('a' => 'produto.produtos_atributos_rn'));
		$select->where('id_atributo_rn = ?', $atributo);
		$select->where('id_grupo_atributo_rn = ?', $grupo);
		$select->where('fl_del is false');
		$Row = $this->fetchRow($select);
		
		return $Row->ds_valor;
	}
	
	public function getAtributos($name, $idProduto=false, $atributo=false) {
		if ($name) {
			$select = $this->select();
			$select->setIntegrityCheck(false);
			$select->from(array('a' => 'produto.v_atributos'));
			if($name == 'QUESTIONARIO') {
				$select->order(array('ds_ordem', 'id_parent', 'id'));
			} else {
				$select->order('ds_descricao_atributo asc');
			}
			
			if ($idProduto) {
				$select->join(array('pa' => 'produto.produtos_atributos_rn'), 'a.id = pa.id_atributo_rn', 'ds_valor');
				$select->join(array('pga' => 'produto.produtos_grupos_atributos_rn'), 'pa.id_grupo_atributo_rn = pga.id', 'pga.id_produto');
				$select->where("pga.id_produto = ?", $idProduto);
			}
			
			if ($atributo) {
				
				$select->where("a.ds_chave_rn = ?", $atributo);
				$Row = $this->fetchRow($select);
				return $Row->ds_valor;
			} else if ($name) {
				$select->where("a.fl_ativo is true");
				$select->where("ds_chave_atributo_modulo= ?", $name);
				return $this->fetchAll($select);
			}
		}
	}
	
	
	public function getAtributosProposta($name, $id_proposta=false, $atributo=false) {
		if ($name) {
			$select = $this->select();
			$select->setIntegrityCheck(false);
			$select->from(array('a' => 'produto.v_atributos'));
			if($name == 'QUESTIONARIO') {
				$select->order(array('ds_ordem', 'id_parent', 'id'));
			} else {
				$select->order('ds_chave_rn asc');
			}
			
			if ($idProduto) {
				$select->join(array('pa' => 'produto.produtos_atributos_rn'), 'a.id = pa.id_atributo_rn');
				$select->join(array('pga' => 'produto.produtos_grupos_atributos_rn'), 'pa.id_grupo_atributo_rn = pga.id', 'pga.id_produto');
				$select->where("pga.id_produto = ?", $idProduto);
			}
			
			if ($atributo) {
				
				$select->where("a.ds_chave_rn = ?", $atributo);
				$Row = $this->fetchRow($select);
				return $Row->ds_valor;
			} else if ($name) {
				
				$select->where("ds_chave_atributo_modulo= ?", $name);
				return $this->fetchAll($select);
			}
		}
	}
	
	public function fetchQuestionario($idProduto, $idParent=false) {
		$select = $this->select();
		$select->setIntegrityCheck(false);
		$select->from(array('a' => 'produto.v_atributos'));
		$select->join(array('pa' => 'produto.produtos_atributos_rn'), 'a.id = pa.id_atributo_rn', false);
		//$select->where("pa.id_produto = ?", $idProduto);
		$select->join(array('pga' => 'produto.produtos_grupos_atributos_rn'), 'pa.id_grupo_atributo_rn = pga.id', 'pga.id_produto');
		$select->where("pga.id_produto = ?", $idProduto);
		$select->where("a.ds_chave_atributo_modulo = ?", 'QUESTIONARIO');
		$select->order('ds_ordem');
		
		if ($idParent) {
			$select->where("a.id_parent = ?", $idParent);
		} else {
			$select->where("a.id_parent = 0");
		}
		
		return $this->fetchAll($select)->toArray();
	}
	
	public function fetchQuestionarioProposta($idProposta, $idParent=false) {
		$select = $this->select()->setIntegrityCheck(false);
		$select->from(array('a' => 'produto.v_atributos'));
		$select->join(array('pq' => 'seguro.propostas_questionario'), 'a.id = pq.id_atributo_rn', false);
		$select->where("pq.id_proposta = ?", $idProposta);
		$select->order('ds_ordem');
		
		if ($idParent) {
			$select->where("a.id_parent = ?", $idParent);
		} else {
			$select->where("a.id_parent = 0");
		}
		
		return $this->fetchAll($select)->toArray();
	}
	
	public function checkChildren($idAtributo) {
		$select = $this->select();
		$select->setIntegrityCheck(false);
		$select->from(array('a' => 'produto.v_atributos'));
		$select->where("a.id_parent = ?", $idAtributo);
		$Rs = $this->fetchAll($select);
		
		return $Rs->count();
	}
	
	public function getAtributo($chave) {
		$select = $this->select();
		$select->setIntegrityCheck(false);
		$select->from(array('a' => 'produto.v_atributos'));
		$select->where("a.ds_chave_rn = ?", $chave);
		
		return $this->fetchRow($select);
	}
	
	
	public function alteraOrdemPerguntas($dados) {
		
		$idAtributo = $dados->getParam('id');
		$orientacao = $dados->getParam('orientacao');
		
		//busca os dados do atributo
		$Select = $this->select();
		$Select->setIntegrityCheck(false);
		//$Select->from(array('a' => 'produto.v_atributos'));
		$Select->where("id = ?", $idAtributo);
		
		$Rs = $this->fetchRow($Select);
		
		
		//busca o atributo que esta na posicao solicitada
		$Select = $this->select();
		$Select->setIntegrityCheck(false);
		$Select->where("id_atributo_modulo = ?", $Rs->id_atributo_modulo);
		
		if($orientacao > 0) {
			$Select->where("ds_ordem > ?", $Rs->ds_ordem );
			$Select->order('ds_ordem asc');
		} else {
			$Select->where("ds_ordem < ?", $Rs->ds_ordem );
			$Select->order('ds_ordem desc');
		}

		$RsDestino = $this->fetchRow($Select);
		
		if($RsDestino) {
			//altera o destino
			$sql = "update 
					produto.atributos_rn
				set 
					ds_ordem = " . ($Rs->ds_ordem) . " 
				where
					id = " . $RsDestino->id . " or id_parent = " . $RsDestino->id;
			$this->_db->query($sql);
		}
		//altera o que foi clicado
		$sql = "update 
				produto.atributos_rn
			set 
				ds_ordem = " . ($RsDestino->ds_ordem) . " 
			where
				id = " . $Rs->id . " or id_parent = " . $Rs->id;
		$this->_db->query($sql);
	}
	
	public function getGrupoAtributo($produto, $tipo, $corretor, $preposto, $proponente=false, $idParent=false) {
		$Rs = array();
		
		if (!$idParent) {
			if ($proponente) {
				$select = $this->select()->setIntegrityCheck(false);
				$select->from(array('pa' => 'produto.produtos_atributos_rn'), array('ds_valor'));
				$select->join(array('pga' => 'produto.produtos_grupos_atributos_rn'), 'pa.id_grupo_atributo_rn = pga.id', null);
				$select->join(array('a' => 'produto.atributos_rn'), 'pa.id_atributo_rn = a.id', array('id','ds_chave_rn', 'ds_descricao_atributo', 'ds_valores_opcoes', 'ds_schema', 'ds_table', 'ds_option_value', 'ds_option_text', 'fl_required', 'ds_validar_campo', 'ds_validar_campo_valor', 'ds_parent_value', 'ds_option_filter'));
				$select->join(array('ta' => 'produto.tipo_atributo'), 'a.id_tipo_atributo = ta.id', array('ds_chave_tipo_atributo'));
				$select->join(array('am' => 'produto.atributos_modulos'), 'a.id_atributo_modulo = am.id', null);
				$select->join(array('pgap' => 'produto.produtos_grupos_atributos_rn_proponentes'), 'pgap.id_grupo_atributo_rn = pga.id', null);
				$select->join(array('p' => 'seguro.proponentes'), 'pgap.id_proponente = p.id', null);
				$select->where('pga.id_produto = ?', $produto, 'integer');
				$select->where('pga.fl_grupo_padrao = false');
				$select->where('am.ds_chave_atributo_modulo = ?', $tipo, 'string');
				$select->where('p.cpf_cnpj = ?', $proponente);
				
				if ($idParent) {
					$select->where('a.id_parent = ?', $idParent, 'integer');
				} else {
					$select->where('a.id_parent = 0');
				}
				
				$select->order('a.ds_ordem');
				
				$Rs = $this->fetchAll($select)->toArray() or false;
			}
				
			if (!count($Rs) && $preposto) {
				$select = $this->select()->setIntegrityCheck(false);
				$select->from(array('pa' => 'produto.produtos_atributos_rn'), array('ds_valor'));
				$select->join(array('pga' => 'produto.produtos_grupos_atributos_rn'), 'pa.id_grupo_atributo_rn = pga.id', null);
				$select->join(array('a' => 'produto.atributos_rn'), 'pa.id_atributo_rn = a.id', array('id','ds_chave_rn', 'ds_descricao_atributo', 'ds_valores_opcoes', 'ds_schema', 'ds_table', 'ds_option_value', 'ds_option_text', 'fl_required', 'ds_validar_campo', 'ds_validar_campo_valor', 'ds_parent_value', 'ds_option_filter'));
				$select->join(array('ta' => 'produto.tipo_atributo'), 'a.id_tipo_atributo = ta.id', array('ds_chave_tipo_atributo'));
				$select->join(array('am' => 'produto.atributos_modulos'), 'a.id_atributo_modulo = am.id', null);
				$select->join(array('pgau' => 'produto.produtos_grupos_atributos_rn_usuarios'), 'pgau.id_grupo_atributo_rn = pga.id', null);
				$select->where('pga.id_produto = ?', $produto, 'integer');
				$select->where('pga.fl_grupo_padrao = false');
				$select->where('am.ds_chave_atributo_modulo = ?', $tipo, 'string');
				$select->where('pgau.id_usuario = ?', $preposto, 'integer');
				
				if ($idParent) {
					$select->where('a.id_parent = ?', $idParent, 'integer');
				} else {
					$select->where('a.id_parent = 0');
				}
				
				$select->order('a.ds_ordem');

				$Rs = $this->fetchAll($select)->toArray() or false;
			}
			
			if (!count($Rs) && $corretor) {
				$select = $this->select()->setIntegrityCheck(false);
				$select->from(array('pa' => 'produto.produtos_atributos_rn'), array('ds_valor'));
				$select->join(array('pga' => 'produto.produtos_grupos_atributos_rn'), 'pa.id_grupo_atributo_rn = pga.id', null);
				$select->join(array('a' => 'produto.atributos_rn'), 'pa.id_atributo_rn = a.id', array('id','ds_chave_rn', 'ds_descricao_atributo', 'ds_valores_opcoes', 'ds_schema', 'ds_table', 'ds_option_value', 'ds_option_text', 'fl_required', 'ds_validar_campo', 'ds_validar_campo_valor', 'ds_parent_value', 'ds_option_filter'));
				$select->join(array('ta' => 'produto.tipo_atributo'), 'a.id_tipo_atributo = ta.id', array('ds_chave_tipo_atributo'));
				$select->join(array('am' => 'produto.atributos_modulos'), 'a.id_atributo_modulo = am.id', null);
				$select->join(array('pgau' => 'produto.produtos_grupos_atributos_rn_usuarios'), 'pgau.id_grupo_atributo_rn = pga.id', null);
				$select->where('pga.id_produto = ?', $produto, 'integer');
				$select->where('pga.fl_grupo_padrao = false');
				$select->where('am.ds_chave_atributo_modulo = ?', $tipo, 'string');
				$select->where('pgau.id_usuario = ?', $corretor, 'integer');
				
				if ($idParent) {
					$select->where('a.id_parent = ?', $idParent, 'integer');
				} else {
					$select->where('a.id_parent = 0');
				}
				
				$select->order('a.ds_ordem');
				
				$Rs = $this->fetchAll($select)->toArray() or false;
			}
			
			if (!count($Rs)) {
				$select = $this->select()->setIntegrityCheck(false);
				$select->from(array('pa' => 'produto.produtos_atributos_rn'), array('ds_valor'));
				$select->join(array('pga' => 'produto.produtos_grupos_atributos_rn'), 'pa.id_grupo_atributo_rn = pga.id', null);
				$select->join(array('a' => 'produto.atributos_rn'), 'pa.id_atributo_rn = a.id', array('id','ds_chave_rn', 'ds_descricao_atributo', 'ds_valores_opcoes', 'ds_schema', 'ds_table', 'ds_option_value', 'ds_option_text', 'fl_required', 'ds_validar_campo', 'ds_validar_campo_valor', 'ds_parent_value', 'ds_option_filter'));
				$select->join(array('ta' => 'produto.tipo_atributo'), 'a.id_tipo_atributo = ta.id', array('ds_chave_tipo_atributo'));
				$select->join(array('am' => 'produto.atributos_modulos'), 'a.id_atributo_modulo = am.id', null);
				$select->where('pga.id_produto = ?', $produto, 'integer');
				$select->where('pga.fl_grupo_padrao = true');
				$select->where('am.ds_chave_atributo_modulo = ?', $tipo, 'string');
				
				if ($idParent) {
					$select->where('a.id_parent = ?', $idParent, 'integer');
				} else {
					$select->where('a.id_parent = 0');
				}
				
				$select->order('a.ds_ordem');
				
				$Rs = $this->fetchAll($select)->toArray() or false;
			}

		} else {
			$select = $this->select()->setIntegrityCheck(false);
			$select->from(array('a' => 'produto.atributos_rn'), array('id','ds_chave_rn', 'ds_descricao_atributo', 'ds_valores_opcoes', 'ds_schema', 'ds_table', 'ds_option_value', 'ds_option_text', 'fl_required', 'ds_validar_campo', 'ds_validar_campo_valor', 'ds_parent_value', 'ds_option_filter'));
			$select->join(array('ta' => 'produto.tipo_atributo'), 'a.id_tipo_atributo = ta.id', array('ds_chave_tipo_atributo'));
			$select->where('a.id_parent = ?', $idParent, 'integer');
			$select->order('a.ds_ordem');
			
			$Rs = $this->fetchAll($select)->toArray() or false;
		}
		
		
	}
	
	public function getGrupoAtributoSinistro($tipo, $idParent=false) {
		$Rs = array();
		
		if (!$idParent) {

			$select = $this->select()->setIntegrityCheck(false);
			
			$select->from(array('a' => 'produto.atributos_rn'), array('id','ds_chave_rn', 'ds_descricao_atributo', 'ds_valores_opcoes', 'ds_schema', 'ds_table', 'ds_option_value', 'ds_option_text', 'fl_required', 'ds_validar_campo', 'ds_validar_campo_valor', 'ds_parent_value', 'ds_option_filter'));
			$select->join(array('ta' => 'produto.tipo_atributo'), 'a.id_tipo_atributo = ta.id', array('ds_chave_tipo_atributo'));
			$select->join(array('am' => 'produto.atributos_modulos'), 'a.id_atributo_modulo = am.id', null);
			
			$select->where('am.ds_chave_atributo_modulo = ?', $tipo, 'string');
			
			if ($idParent) {
				$select->where('a.id_parent = ?', $idParent, 'integer');
			} else {
				$select->where('a.id_parent = 0');
			}
			
			$select->order('a.ds_ordem');
			
			$Rs = $this->fetchAll($select)->toArray() or false;
		

		} else {
			$select = $this->select()->setIntegrityCheck(false);
			$select->from(array('a' => 'produto.atributos_rn'), array('id','ds_chave_rn', 'ds_descricao_atributo', 'ds_valores_opcoes', 'ds_schema', 'ds_table', 'ds_option_value', 'ds_option_text', 'fl_required', 'ds_validar_campo', 'ds_validar_campo_valor', 'ds_parent_value', 'ds_option_filter'));
			$select->join(array('ta' => 'produto.tipo_atributo'), 'a.id_tipo_atributo = ta.id', array('ds_chave_tipo_atributo'));
			$select->where('a.id_parent = ?', $idParent, 'integer');
			$select->order('a.ds_ordem');
			
			$Rs = $this->fetchAll($select)->toArray() or false;
		}
		
		$return = array();
		if (count($Rs)) {
			foreach ($Rs as $Row) {
				$return[$Row['ds_chave_rn']] = $Row;
				$return[$Row['ds_chave_rn']]['chields'] = $this->getGrupoAtributoSinistro($tipo, $Row['id']);
			}
		}
		
		return $return;
	}
	
	public function getLastOrder() {
		$sql = "select max(ds_ordem) as ordem from produto.atributos_rn";
		$ordem = $this->_db->fetchOne($sql);
		return $ordem+1;
	}
	
	/**
	 * Busca as configuracoes do atributo através da chave
	 *
	 * @param string $ds_chave_rn Chave do Modulo de Atributos.
	 * @author Tonismar - 05/05/2016
	 */
	public function getAtributoByChaveProduto($ds_chave_rn,$id_produto) {
		$Db = Agro_Db_Table_Abstract::getDefaultAdapter();
		return $Db->fetchOne("select p.ds_valor
				from produto.produtos_grupos_atributos_rn g
				join produto.produtos_atributos_rn p on g.id = p.id_grupo_atributo_rn
				join produto.atributos_rn a on a.id = p.id_atributo_rn
				join produto.tipo_atributo t on t.id = a.id_tipo_atributo
				join produto.atributos_modulos m on m.id = a.id_atributo_modulo
				where ds_chave_rn = '$ds_chave_rn'
				and g.id_produto = $id_produto
				group by p.ds_valor");
	}

	/**
	 * Retorna uma array para ser usada em um combo de atributos que podem ter seus valores definidos em lote
	 * 
	 * @return array
	 */
	public function getComboPropriedades() {
	    $rowAtributoSubFederal = $this->fetchAll(["ds_chave_rn = '" . self::DS_CHAVE_PROD_SUBVENCAO_FEDERAL_VALOR_MAX_GRUPO . "'"])->current();
	    $rowAtributoRenovacaoSemSinistro = $this->fetchAll(["ds_chave_rn = '" . self::DS_CHAVE_PROD_VALIDAR_RENOVACAO_SEM_SINISTRO . "'"])->current();

		//atributos definidos na solicitação 3721
		$where = "id IN (2, 3, 4, 6, 7, 8, 11, 12, 61, 120, 122, 141, 142, 149, 150, 169, 176, 178, 184, 185, 191 ,193, 194, {$rowAtributoSubFederal['id']}, {$rowAtributoRenovacaoSemSinistro['id']})
				  AND fl_ativo = TRUE
				  AND fl_del = FALSE";
		$rs = $this->fetchAll($where)->toArray();

		if (is_array($rs)) {
			$options[] = '';
			foreach ($rs as $row) {
				$options[$row['id']] = $row['ds_descricao_atributo'];
			}

			return $options;
		} else {
			return false;
		}
	}

	/**
	 * Retorna um atributo apartir da busca pela view
	 * 
	 * @return Object
	 */
	public function buscaPorId($id) {
		if (!$id) {
			throw new Exception('Necessário informar um id');
		}
		$select = $this->select();
		$select->setIntegrityCheck(false);
		$select->from(array('v' => 'produto.v_atributos'));
		$select->where('id = ?', $id);

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

	public static function getDescricaoTipoSoloByValue($value)
	{
		$descricoesPorId = [1 => 'Tipo 1', 2 => 'Tipo 2', 3 => 'Tipo 3', 4 => 'AD1', 5 => 'AD2', 6 => 'AD3', 7 => 'AD4', 8 => 'AD5', 9 => 'AD6'];
		return array_key_exists($value, $descricoesPorId) ? $descricoesPorId[$value] : $value;
	}
}