<?php
class Sinistro2_Model_TipoLaudoFinal extends Agro_Db_Table_Abstract {
	public $_pairs = array('key' => 'id', 'field' => 'ds_nome_tipo_laudo_final');
	protected $_schema = 'sinistro';
	protected $_name = 'tipo_laudo_final';
	protected $_primary = 'id';
	public $_order = 'ds_chave';


	public function getData($where=false) {
		$select = $this->select();

		$select->setIntegrityCheck(false);
		$select->from("{$this->_schema}.{$this->_name}");
		$select->where($this->_name.'.id_safra is null');

		if ($this->_order) {
			$select->order($this->_order);
		}

		$this->getWhere($select, $where);

		return $select;
	}


	public function save(array $data) {
		$this->getAdapter()->beginTransaction();
		try {
			$Row = $this->getRow($data['id']);

			$Row->ds_nome_tipo_laudo_final = $data['ds_nome_tipo_laudo_final'];
			$Row->ds_chave = $data['ds_chave'];
			$Row->id_grupamento_cultura = $data['id_grupamento_cultura'];
			$Row->ds_descricao_tipo_laudo_final = $data['ds_descricao_tipo_laudo_final'];
			$Row->ds_nome_arquivo = ($data['ds_nome_arquivo'] ? $data['ds_nome_arquivo'] : $Row->ds_nome_arquivo);
            $Row->ds_versao = $data['ds_versao'];
            $Row->fl_import_xml = $data['can_import_xml'] ? 't' : 'f'; 

			$Row->save();

			$this->getAdapter()->commit();

			return $Row;

		} catch (Exception $e) {
			$this->getAdapter()->rollBack();
			throw new Exception($e);
		}
	}


	public function getComboTipoLaudoFinal($first=true, $idProdCob) {

		$params = explode(',',$idProdCob);

		$ModelSafraProduto = new Produto_Model_Safras();
		$idSafra = $ModelSafraProduto->getSafraByProduto($params[0]);

		$Select = $this->select()->setIntegrityCheck(false)->distinct(true);
		$Select->from(array('lf' => $this->_schema.".".$this->_name), array('id', 'ds_chave'));

		if($idSafra >= 18){
			$Select->where('lf.id_safra is null');
		}else{
			$Select->where('lf.id_safra in(select id_safra from produto.produtos where id = ?)',$params[0]);
		}

		$Select->order('ds_chave');

		return $this->getDefaultAdapter()->fetchPairs($Select);
	}

	public function getChaveByLaudoProcessoCobertura($idLaudoFinal, $idProcesso, $idCobertura) {
		$ModelProdutoCobertura = new Produto_Model_ProdutosCoberturas();
		$ModelSafras = new Produto_Model_Safras();

		$Select = $this->select()->setIntegrityCheck(false);
		$Select->from(array('lf' => 'sinistro.laudos_finais'), '');
		$Select->join(array('p' => 'sinistro.processos'), 'lf.id_processo = p.id', null);
		$Select->join(array('pr' => 'seguro.propostas'), 'pr.id = p.id_proposta', null);
		$Select->join(array('pd' => 'produto.produtos'), 'pd.id = pr.id_produto', null);
		$Select->join(array('pc' => 'produto.produtos_coberturas'), 'pc.id_produto = pd.id', null);
		$Select->join(array('tlf' => 'sinistro.tipo_laudo_final'), 'tlf.id = pc.id_tipo_laudo_final', 'lower(ds_chave) as ds_chave');
		$Select->where('lf.id = ?', $idLaudoFinal);
		$Select->where('p.id = ?', $idProcesso);
		$Select->where('pc.id_cobertura = ?', $idCobertura);

		$Row = $this->fetchRow($Select);

		return $Row;
	}

	/**
	 * Retorna o tipo do laudo final pela proposta e/ou cobertura
	 * 
	 * @param int $idProposta
	 * @param int|null $idCobertura
	 */
	public function getTipoLaudoFinalByProposta(int $idProposta, ?int $idCobertura = null)
    {
        $Select = $this->select()->setIntegrityCheck(false);
        $Select->from(['tlf' => 'sinistro.tipo_laudo_final'], ['ds_chave']);
        $Select->join(['pc' => 'produto.produtos_coberturas'], 'pc.id_tipo_laudo_final = tlf.id', null);
        $Select->join(['p' => 'produto.produtos'], 'p.id = pc.id_produto', null);
        $Select->join(['prop' => 'seguro.propostas'], 'prop.id_produto = p.id', null);
        $Select->where('prop.id = ?', $idProposta);

		if (!empty($idCobertura)) {
			$Select->where('pc.id_cobertura = ?', $idCobertura);
		}

        return $this->fetchRow($Select);
    }

	public function canImportXml(int $idLaudoFinal, int $idProcesso, int $idCobertura) : bool {
		return $this->fetchRow(
			$this->select()->setIntegrityCheck(false)
				->from(['lf' => 'sinistro.laudos_finais'], '')
				->join(['p' => 'sinistro.processos'], 'lf.id_processo = p.id', null)
				->join(['pr' => 'seguro.propostas'], 'pr.id = p.id_proposta', null)
				->join(['pd' => 'produto.produtos'], 'pd.id = pr.id_produto', null)
				->join(['pc' => 'produto.produtos_coberturas'], 'pc.id_produto = pd.id', null)
				->join(['tlf' => 'sinistro.tipo_laudo_final'], 'tlf.id = pc.id_tipo_laudo_final', 'fl_import_xml')
				->where('lf.id = ?', $idLaudoFinal)
				->where('p.id = ?', $idProcesso)
				->where('pc.id_cobertura = ?', $idCobertura)
		)->fl_import_xml ? true : false;
	}
}
