<?php

class Produto_Model_Safras extends Agro_Db_Table_Safras {
    const SAFRA_2022_2023 = 25;
    const SAFRA_2023_2024 = 26;
    const SAFRA_2025_2026 = 28;

	protected $_schema = 'produto';
	protected $_name = 'safras';
	protected $_primary = 'id';
	public $_order = 'ds_nome_safra';
	public $safraCurrent = 0;

	public function getSafra($idSafra,$field=null){
		$data = null;
		if($idSafra){
			$data = $this->fetchRow($this->getAdapter()->quoteInto('id = ?',$idSafra))->toArray();

			if($field && array_key_exists($field, $data)){
				$data = $data[$field];
			}
		}
		return $data;
	}

	public function getSafraAtual($field=null){
		$data = null;
		$data = $this->fetchRow('fl_vigente = true')->toArray();

		if($field && array_key_exists($field, $data)){
			$data = $data[$field];
		}
		return $data;
	}

	/**
	 * Retorna o nome completo do Model da Safra da proposta recebida por parâmetro.
	 * Se $model estiver null, retorna simplesmente o nome do schema da safra.
	 *
	 * @param int $idProposta
	 * @param String $model
	 * @return String
	 */
	public function getSafraModel($idProposta, $model=null){
		$data = '';
		if($idProposta){
			$select = $this->select();
			$select->setIntegrityCheck(false);
			$select->from(array('sa' => 'produto.safras'),'sa.ds_chave');
			$select->join(array('pd'=>'produto.produtos'),'sa.id = pd.id_safra',false);
			$select->join(array('pr'=>'seguro.propostas'),'pd.id = pr.id_produto',false);
			$select->where($this->getAdapter()->quoteInto('pr.id = ?',$idProposta));

			$data = ucfirst(strtolower($this->_db->fetchOne($select)));

			if($data) {
    			if($model){
    				$data .= '_Model_'.$model;
    			}else{
    				$data = strtolower($data);
    			}
			} else {
			    return false;
			}
		}

		return $data;
	}

	/**
	 * Retorna o nome completo do Form da Safra da proposta recebida por parâmetro.
	 * Se $form estiver null, retorna simplesmente o nome do schema da safra.
	 *
	 * @param int $idProposta
	 * @param String $form
	 * @return String
	 */
	public function getSafraForm($idProposta,$form=null){
		$data = '';
		if($idProposta){
			$select = $this->select();
			$select->setIntegrityCheck(false);
			$select->from(array('sa' => 'produto.safras'),'sa.ds_chave');
			$select->join(array('pd'=>'produto.produtos'),'sa.id = pd.id_safra',false);
			$select->join(array('pr'=>'seguro.propostas'),'pd.id = pr.id_produto',false);
			$select->where($this->getAdapter()->quoteInto('pr.id = ?',$idProposta));
			$data = ucfirst(strtolower($this->_db->fetchOne($select)));

			if($form){
				$data .= '_Form_'.$form;
			}else{
				$data = strtolower($data);
			}
		}

		return $data;
	}

	public function getComboProdutoSafraAtual($cobertura=false) {
		return $this->getComboProdutoSafraRequest($this->safraCurrent);
	}

	public function getComboProdutoSafraAtualComercial() {
	    return $this->getComboProdutoAbreviadoSafraRequest($this->safraCurrent, true, true, true);
	}
	
	public function getComboProdutoSafraRequest($idSafra=false, $first=1, bool $multiSafra = false) {
        $campos = ['pp.id', 'pp.ds_nome_produto', 'ps.ds_nome_safra'];
		$select = $this->select()->setIntegrityCheck(false);
		$select->from(['pp' => 'produto.produtos'], $campos);
		$select->join(['ps' => 'produto.safras'], 'ps.id = pp.id_safra', null);

		if($idSafra) {
            if (is_array($idSafra)) {
                $select->where('id_safra in('. implode(',', $idSafra) . ')');
            } else {
			    $select->where('id_safra = ?', $idSafra);
            }
		}

		$select->where('pp.fl_ativo = true');
		$select->order(['pp.ds_nome_produto', 'ps.id desc']);

		$Rs = $this->fetchAll($select);

		$options = array();
		if ($Rs) {
			if ($first)
				$options[] = '';

			foreach ($Rs as $row) {
                if ($multiSafra) {
				    $options[$row['id']] = "{$row['ds_nome_produto']} ({$row['ds_nome_safra']})";
                } else {
                    $options[$row['id']] = $row['ds_nome_produto'];
                }
			}
			return $options;
		} else {
			return false;
		}
	}

	public function getComboProdutoBySafraAndCultura($idSafra=false, $idCultura=false, $first=1) {
		$select = $this->select()->setIntegrityCheck(false);
		$select->from(array('p' => 'produto.produtos'));
		$select->join(array('pg' => 'produto.produtos_geral'), 'p.id_produto_geral = pg.id', null);
		if ($idSafra){
			$select->where('p.id_safra = ?', $idSafra);
		}
		if ($idCultura) {
			if (is_array($idCultura)) {
				$idCultura = implode(", ", $idCultura);
			}
			$select->where("pg.id_cultura IN ($idCultura)");
		}
		$select->where('p.fl_ativo = true');
		$select->order('ds_nome_produto');

		$Rs = $this->fetchAll($select);

		$options = array();
		if ($Rs) {
			if ($first)
				$options[] = '';

			foreach ($Rs as $row) {
				$options[$row['id']] = $row['ds_nome_produto'];
			}
			return $options;
		} else {
			return false;
		}
	}

	public function getComboProdutoAbreviadoSafraRequest($idSafra=false, $first=1, $checkComercial=false, $validarComercializacao = false) {
	    $Auth = Zend_Auth::getInstance()->getIdentity();
	    
		$select = $this->select()->setIntegrityCheck(false);
		$select->from(array('p' => 'produto.produtos'), ['id', 'ds_nome_abreviado']);
		
		if($checkComercial == true && $Auth->ds_departamento == 'COMERCIAL'){
            $select->join(array('pga'=>'produto.produtos_grupos_atributos_rn'), 'pga.id_produto = p.id AND pga.fl_grupo_padrao = true', null);
	        $select->join(array('pa'=>'produto.produtos_atributos_rn'), 'pa.id_grupo_atributo_rn = pga.id', 'ds_valor');
	        $select->join(array('prn'=>'produto.atributos_rn'), "prn.id = pa.id_atributo_rn AND prn.ds_chave_rn='PROD_COMERCIAL_HABILITACAO'", null);
		}

		if ($validarComercializacao) {
			$select->join(array('c' => 'comercializacao.comercializacoes'), 'c.id_produto = p.id', null);
			$select->where("DATE(CURRENT_TIMESTAMP) BETWEEN c.dt_comercializacao_inicio AND c.dt_comercializacao_fim");
		}
		
		$select->where('p.id_safra = ?', $idSafra);
		$select->where('p.fl_ativo = true');
		if ($checkComercial == true && $Auth->ds_departamento == 'COMERCIAL') {
                        $select->group(['p.id', 'p.ds_nome_abreviado', 'pa.ds_valor']);
                } else {
                        $select->group(['p.id', 'p.ds_nome_abreviado']);
                }
		$select->order('p.ds_nome_abreviado');

		$Rs = $this->fetchAll($select);

		$options = array();
		if ($Rs) {
			if ($first)
				$options[] = '';

			foreach ($Rs as $row) {
				$options[$row['id']] = $row['ds_nome_abreviado'];
			}
			return $options;
		} else {
			return false;
		}
	}

	public function getComboProdutoGeralSafraAtual() {
		$Rs = $this->fetchRow('fl_ativo = true', 'dt_criacao desc');

		$select = $this->select()->setIntegrityCheck(false);
		$select->from(array('p' => 'produto.produtos'));
		$select->where('id_safra = ?', $Rs->id);
		$Rs = $this->fetchAll($select);

		$options = array();
		if ($Rs) {
			$options[] = '';
			foreach ($Rs as $row) {
				$options[$row['id_produto_geral']] = $row['ds_nome_produto'];
			}
			return $options;
		} else {
			return false;
		}
	}

	public function getLastSafras($qtdLastSafras) {
		$select = $this->select();
		$select->order('dt_inicio desc');
		$select->limit($qtdLastSafras);

		$rs = $this->fetchAll($select);
		$ret = array();

		if ($rs->count()) {
			foreach ($rs as $row) {
				$ret[$row->id] = $row->ds_nome_safra;
			}
		}

		return $ret;
	}

	public function delete($id) {
		return $this->_db->query("delete from produto.safras where id = $id");
	}

	public function getComboSafrasAtivas(){
		$Rs = $this->fetchAll("ds_chave is not null");

		$result=array();
		foreach ($Rs as $item){
			$result[$item->ds_chave]=$item->ds_nome_safra;
		}

		return $result;
	}

	public function getAnoInicioSafraByIdProposta($idProposta) {
		$select = $this->select()->setIntegrityCheck(false);
		$select->from(array('s'=>'produto.safras'), "to_char(dt_inicio, 'YYYY') as dt_inicio");
		$select->join(array('pd'=>'produto.produtos'), 'pd.id_safra = s.id', null);
		$select->join(array('pr'=>'seguro.propostas'), 'pr.id_produto = pd.id', null);
		$select->where('pr.id = ?', $idProposta);
		return $this->_db->fetchOne($select);
	}

	public function getInicioSafraByIdProposta($idProposta) {
		$select = $this->select()->setIntegrityCheck(false);
		$select->from(array('s'=>'produto.safras'), "to_char(dt_inicio, 'DD/MMM/YYYY') as dt_inicio");
		$select->join(array('pd'=>'produto.produtos'), 'pd.id_safra = s.id', null);
		$select->join(array('pr'=>'seguro.propostas'), 'pr.id_produto = pd.id', null);
		$select->where('pr.id = ?', $idProposta);
		return $this->_db->fetchOne($select);
	}

	public function getSafraByProduto($idProduto){
		$select = $this->select()->setIntegrityCheck(false);
		$select->from(array('sa' => 'produto.safras'),'sa.id');
		$select->join(array('p'=>'produto.produtos'),'sa.id = p.id_safra',false);
		$select->where('p.id = ?',$idProduto);
		return $this->_db->fetchOne($select);
	}

	public function getNomeSafraByProduto($idProduto){
		$select = $this->select()->setIntegrityCheck(false);
		$select->from(array('sa' => 'produto.safras'),'sa.ds_nome_safra');
		$select->join(array('p'=>'produto.produtos'),'sa.id = p.id_safra',false);
		$select->where('p.id = ?',$idProduto);
		return $this->_db->fetchOne($select);
	}

	public function getSafrasByPropostas(string $idPropostas) {
		$select = $this->select()->setIntegrityCheck(false)
			->from('produto.produtos', "string_agg(id_safra::text, ',') as id_safra")
			->join('seguro.propostas', 'produtos.id = propostas.id_produto', false)
			->where('propostas.id in ('.$idPropostas.')');
		return $this->_db->fetchOne($select);
	}

	public function getSafrasByIdSafra(int $idSafra, $campos = '*', $order = 'id desc')
    {
        $select = $this->select()->setIntegrityCheck(false);
        $select->from(array('sa' => 'produto.safras'), $campos);
        $select->where('sa.id >= ?', $idSafra);
        $select->order($order);

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

    public function getSafraDataAtual()
    {
        return $this->fetchAll(["now() between dt_inicio AND dt_termino"])->current();
    }

	/**
	 * Retorna somente as safras onde houveram devoluções
	 *
	 * @return array
	 */
	public function getComboSafrasDevolucao(): array
	{
		$select = $this->select()->setIntegrityCheck(false);
        $select->from(['sf' => 'produto.safras'], ['id', 'ds_nome_safra']);
		$select->join(['prod' => 'produto.produtos'], 'prod.id_safra = sf.id', null);
		$select->join(['pr' => 'seguro.propostas'], 'pr.id_produto = prod.id', null);
		$select->join(['pd' => 'seguro.propostas_devolucoes'], 'pd.id_proposta = pr.id', null);
        $select->where('sf.fl_ativo = ?', true);
        $select->order('sf.id DESC');
		$rs = $this->fetchAll($select);

		$combo = [];
		foreach ($rs as $row){
			$combo[$row->id]=$row->ds_nome_safra;
		}

		return $combo;
	}
}
