<?php

class Produto_Model_ProdutosVariedades extends Agro_Db_Table_Abstract {
	protected $_schema = 'produto';
	protected $_name = 'produtos_variedades';
	protected $_primary = 'id_produto';
	private $importancia_minima;
	private $importancia_maxima;

	public function getCulturaVariedade(int $idProduto, $idGrupo = null)
    {
        $select = $this->select()->setIntegrityCheck(false)->distinct();
        $select->from(array('v' => 'produto.variedades'), array('id', 'ds_nome_variedade', 'cd_variedade_seguradora'));
        $select->join(array('cv' => 'produto.culturas_variedades'), 'v.id = cv.id_variedade', null);
        $select->join(array('pg' => 'produto.produtos_geral'), 'cv.id_cultura = pg.id_cultura', null);
        $select->join(array('p' => 'produto.produtos'), 'pg.id = p.id_produto_geral', null);
        $select->joinLeft(
            array('pv' => 'produto.produtos_variedades'),
            'v.id = pv.id_variedade AND p.id = pv.id_produto and pv.id_validacao_limites_lmga = ' . $idGrupo,
            array(
                'id_variedade',
                'vl_importancia_segurada_minima',
                'vl_importancia_segurada_maxima',
                'id_validacao_limites_lmga'
            )
        );
        $select->where('p.id = ?', $idProduto);

        $select->order('v.ds_nome_variedade');

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

	public function getProdutoVariedade($idProduto) {
		$select = $this->select();
		$select->setIntegrityCheck(false);
		$select->from(array('v'=>'produto.variedades'), array('id', 'ds_nome_variedade'));
		$select->join(array('pv'=>'produto.produtos_variedades'), 'v.id = pv.id_variedade', null);
		$select->join(array('p'=>'produto.produtos'), 'pv.id_produto = p.id', null);
		$select->where('p.id = ?', $idProduto);
		$select->order('v.ds_nome_variedade');

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


	public function getVariedades($produto) {
		$ret = array();
		$Rs = $this->fetchAll("id_produto = $produto")->toArray();

		if (is_array($Rs)) {
			foreach ($Rs as $row) {
				$ret[$row['id_variedade']] = array(
					'min' => $row['vl_importancia_segurada_minima'],
					'max' => $row['vl_importancia_segurada_maxima']
				);
			}
		}

		return $ret;
	}


	//usado na copia de produtos entre safras
	public function save($dados) {
		$Row = $this->createRow();

		$Row->id_produto = $dados['id_produto'];
		$Row->id_variedade = $dados['id_variedade'];
		$Row->vl_importancia_segurada_minima = Agro_Util::formatCurrencyDb($dados['vl_importancia_segurada_minima']);
		$Row->vl_importancia_segurada_maxima = Agro_Util::formatCurrencyDb($dados['vl_importancia_segurada_maxima']);
		$Row->id_validacao_limites_lmga = $dados['id_validacao_limites_lmga'];

		return $Row->save();
	}

	public function saveVariedades($produto, $check, $minima, $maxima, $grupo) {
		$ret = array();

		if ($produto && is_array($check)) {

			$this->delete($grupo, 'id_validacao_limites_lmga');

			foreach ($check as $variedade) {

				if ($variedade) {
					$save = array();
					$save['id_produto']                     = $produto;
					$save['id_validacao_limites_lmga']      = $grupo;
					$save['id_variedade']                   = $variedade;
					$save['vl_importancia_segurada_minima'] = ($minima[$variedade] ? Agro_Util::formatCurrencyDb($minima[$variedade]) : $vlMinAnterior);
					$save['vl_importancia_segurada_maxima'] = ($maxima[$variedade] ? Agro_Util::formatCurrencyDb($maxima[$variedade]) : $vlMaxAnterior);

					$vlMinAnterior = $save['vl_importancia_segurada_minima'];
					$vlMaxAnterior = $save['vl_importancia_segurada_maxima'];

					$this->insert($save);
				}
			}

		} else { return false; }

		return true;
	}

	public function checkBetweenVariedade($dados, $idProduto, $idProposta, $flPG=false) {
		$Propostas   = new Seguro_Model_Propostas();
		$Proposta    = $Propostas->find($idProposta)->current();
		$Propriedade = $Proposta->propriedade();
		$proponente = $Proposta->proponente();

		if ($dados && $idProduto) {

			if ($dados['IS_LMGA_PARCIAL'] && $dados['IS_VARIEDADES']) {

				//BUSCA O GRUPO DE PRODUTOS_VARIEDADES
				unset($id_grupo);
				$id_grupo = $this->_produtovariedadeCPF($proponente['id_proponente'], $Proposta->id_produto);

				if(!$id_grupo){
					$id_grupo = $this->_produtovariedadeUsuario($Proposta->id_usuario_criacao,$Proposta->id_produto);
				}

				if(!$id_grupo){
					$id_grupo = $this->_produtovariedadeMunicipio($Propriedade['id_municipio'],$Proposta->id_produto);
				}

				if(!$id_grupo){
					$id_grupo = $this->_produtovariedadeEstado($Propriedade['id_estado'],$Proposta->id_produto);
				}

				if(!$id_grupo){
					$id_grupo = $this->_produtovariedadePadrao($Proposta->id_produto);
				}
				if(!$id_grupo){
					return false;
				}

				$select = $this->select()->setIntegrityCheck(false);
				$select->from(array('pv'=>'produto.produtos_variedades'), array('vl_importancia_segurada_minima', 'vl_importancia_segurada_maxima'));
				$select->where('id_variedade = ?', $dados['IS_VARIEDADES']);
				$select->where('id_produto = ?', $idProduto);
				$select->where('id_validacao_limites_lmga = ?', $id_grupo);
				$Row = $this->fetchRow($select);

				if($dados['IS_IDADE'] == 1 or $dados['IS_IDADE'] == 2){
					$Row->vl_importancia_segurada_minima = 0;
				}


				if($flPG == true){
					$tmp = round($dados['IS_PRODUCAO_GARANTIDA'] * Agro_Util::formatCurrencyDb($dados['IS_VALOR_TONELADA']),2);
				} else {
					$tmp = round($dados['IS_PRODUTIVIDADE'] * Agro_Util::formatCurrencyDb($dados['IS_VALOR_TONELADA']),2);
				}
				
				if ($tmp >= $Row->vl_importancia_segurada_minima && $tmp <= $Row->vl_importancia_segurada_maxima) {
					return true;
				} else {
					return array($Row->vl_importancia_segurada_minima, $Row->vl_importancia_segurada_maxima, $tmp);
				}
			}
		} else {
			return false;
		}
	}

	public function getProdutosVariedades($id_variedade) {
		$sql = "select
					p.*
				from
					produto.produtos_variedades pv inner join
					produto.produtos p on pv.id_produto = p.id
				where
					pv.id_variedade = $id_variedade";
		return $this->_db->fetchAll($sql);
	}

	/**
	 * Retorna o(s) agrupamento(s) do corretor/preposto
	 */
	public function _produtovariedadeUsuario($id_usaurio,$id_produto) {
		if ($id_usaurio) {
			$Select = $this->select()->setIntegrityCheck(false);
			$Select->from(array('v' => 'produto.validacoes_limites_lmga'),'id');
			$Select->join(array('vu' => 'produto.validacoes_limites_lmga_usuarios'), 'v.id = vu.id_validacao_limites_lmga', false);
			$Select->where("vu.id_usuario = ?", $id_usaurio);
			$Select->where("v.id_produto = ?", $id_produto);
			return Agro_Db_Table_Abstract::getDefaultAdapter()->fetchOne($Select);
		}
		return false;
	}

	/**
	 * Retorna o(s) agrupamento(s) do proponente
	 */
	public function _produtovariedadeCPF($id_proponente,$id_produto) {
		if ($id_proponente) {
			$Select = $this->select()->setIntegrityCheck(false);
			$Select->from(array('v' => 'produto.validacoes_limites_lmga'),'id');
			$Select->join(array('vp' => 'produto.validacoes_limites_lmga_proponentes'), 'v.id = vp.id_validacao_limites_lmga', false);
			$Select->where("vp.id_proponente = ?", $id_proponente);
			$Select->where("v.id_produto = ?", $id_produto);
			return Agro_Db_Table_Abstract::getDefaultAdapter()->fetchOne($Select);
		}
		return false;
	}

	/**
	 * Retorna o(s) agrupamento(s) do Municipio
	 */
	public function _produtovariedadeMunicipio($id_municipio,$id_produto) {
		if ($id_municipio) {
			$Select = $this->select()->setIntegrityCheck(false);
			$Select->from(array('v' => 'produto.validacoes_limites_lmga'),'id');
			$Select->join(array('vu' => 'produto.validacoes_limites_lmga_municipios'), 'v.id = vu.id_validacao_limites_lmga', false);
			$Select->where("vu.id_municipio = ?", $id_municipio);
			$Select->where("v.id_produto = ?", $id_produto);
			return Agro_Db_Table_Abstract::getDefaultAdapter()->fetchOne($Select);
		}
		return false;
	}

	/**
	 * Retorna o(s) agrupamento(s) do Estado
	 */
	public function _produtovariedadeEstado($id_estado,$id_produto) {
		if ($id_estado) {
			$Select = $this->select()->setIntegrityCheck(false);
			$Select->from(array('v' => 'produto.validacoes_limites_lmga'),'id');
			$Select->join(array('vu' => 'produto.validacoes_limites_lmga_estados'), 'v.id = vu.id_validacao_limites_lmga', false);
			$Select->where("vu.id_estado = ?", $id_estado);
			$Select->where("v.id_produto = ?", $id_produto);
			return Agro_Db_Table_Abstract::getDefaultAdapter()->fetchOne($Select);
		}
		return false;
	}

	/**
	 * Retorna o(s) agrupamento(s) Padrao
	 */
	public function _produtovariedadePadrao($id_produto) {
		if ($id_produto) {
			$Select = $this->select()->setIntegrityCheck(false);
			$Select->from(array('v' => 'produto.validacoes_limites_lmga'),'id');
			$Select->where("v.id_produto = ?", $id_produto);
			$Select->where("v.fl_grupo_padrao = true");
			return Agro_Db_Table_Abstract::getDefaultAdapter()->fetchOne($Select);
		}
		return false;
	}

    public function checkBetweenVariedadeCotacao($dados, $indiceUnidade, $pg = false)
    {
        $atributosProduto = (new Produto_Model_Produtos())->find($dados['cotacao']['id_produto'])->current()->unidades();

        if ((array_key_exists('IS_LMGA_PARCIAL', $atributosProduto) && array_key_exists('IS_VARIEDADES', $atributosProduto)) || $pg) {
            unset($id_grupo);

            $rowProponente = (new Seguro_Model_Proponentes())->fetchAll(["cpf_cnpj = '{$dados['cotacao']['cpf_cnpj']}'"])->current();

            $id_grupo = $this->_produtovariedadeCPF($rowProponente['id'], $dados['cotacao']['id_produto']);

            if (!$id_grupo) {
                $row = null;

                if (!empty($dados['cotacao']['id_corretor'])) {
                    $row = (new Sistema_Model_Corretores())->find($dados['cotacao']['id_corretor'])->current();
                } else {
                    $row = (new Sistema_Model_Prepostos())->find($dados['cotacao']['id_preposto'])->current();
                }

                $id_grupo = $this->_produtovariedadeUsuario($row['id_usuario'], $dados['cotacao']['id_produto']);
            }

            if (!$id_grupo) {
                $id_grupo = $this->_produtovariedadeMunicipio($dados['cotacao']['id_municipio'], $dados['cotacao']['id_produto']);
            }

            if (!$id_grupo) {
                $id_grupo = $this->_produtovariedadeEstado($dados['cotacao']['id_estado'], $dados['cotacao']['id_produto']);
            }

            if (!$id_grupo) {
                $id_grupo = $this->_produtovariedadePadrao($dados['cotacao']['id_produto']);
            }

            if (!$id_grupo) {
                return false;
            }

            $select = $this->select()->setIntegrityCheck(false);
            $select->from(['pv'=>'produto.produtos_variedades'], ['min(vl_importancia_segurada_minima) as vl_importancia_segurada_minima', 'max(vl_importancia_segurada_maxima) as vl_importancia_segurada_maxima']);
            $select->where('id_produto = ?', $dados['cotacao']['id_produto']);
            $select->where('id_validacao_limites_lmga = ?', $id_grupo);
            $Row = $this->fetchRow($select);

            $unidade = $dados['cotacao']['unidades'][$indiceUnidade];
            $valor = round($unidade['produtividade'] * Agro_Util::formatCurrencyDb($unidade['tonelada']), 2);

            if ($pg) {
                $valorPg = $unidade['produtividade'] * ($dados['cotacao']['cob_principal']['vl_franquia'] / 100);
                $valor = round($valorPg * Agro_Util::formatCurrencyDb($unidade['tonelada']), 2);
            }

            if ($valor >= $Row->vl_importancia_segurada_minima && $valor <= $Row->vl_importancia_segurada_maxima) {
                return true;
            } else {
                return [$Row->vl_importancia_segurada_minima, $Row->vl_importancia_segurada_maxima, $valor];
            }
        }

        return false;
    }
}
