<?php

class Seguro_Model_ProponentesRestricoesTecnicas extends Agro_Db_Table_Abstract {
	protected $_name = 'proponentes_restricoes_tecnicas';
	protected $_schema = 'seguro';
	protected $_primary = 'id';

	public function save($dados) {
		$Row = $this->getRow($dados['id']);

		if (empty($dados['id_corretor'])) {
			throw new Exception('Corretor não informado.');
		}

		if (empty($dados['id_orientacao_restricao_tecnica'])) {
			throw new Exception('Orientação não informada.');
		}
		
		$Row->id_proponente = $dados['id_proponente'];
		$Row->id_proposta = $dados['id_proposta'];
		$Row->id_funcionario_agronomo = $dados['id_funcionario_agronomo'] ? $dados['id_funcionario_agronomo'] : null;
		$Row->id_funcionario_perito = $dados['id_funcionario_perito'] ? $dados['id_funcionario_perito'] : null;
		$Row->id_corretor = $dados['id_corretor'];
		$Row->ds_descricao = $dados['ds_descricao'];
		$Row->id_orientacao_restricao_tecnica = $dados['id_orientacao_restricao_tecnica'];

		$r = $Row->save();
		if ($r) {
			$Model = new Seguro_Model_RestricoesTecnicasProponentesRestricoesTecnicas();
			$Model->delete($r,'id_proponente_restricao');
			foreach ($dados['restricoes'] as $res => $id) {
				$Model->save(array('id_restricao' => $id, 'id_proponente_restricao' => $r));
			}
		} else {
			return false;
		}

		return $r;
	}

	public function getRestricoesByProponente($idProponente, int $idProposta = null) { //buscar proposta apenas do proponente.
		$select = $this->select()->setIntegrityCheck(false);
		$select->from(array('spr' => 'seguro.proponentes_restricoes_tecnicas'), array('id','id_proposta','ds_descricao'));
		$select->joinLeft(
			array('sprp' => 'seguro.proponentes_restricoes_tecnicas_propostas'),
			'sprp.id_proponente_restricao_tecnica = spr.id',
			"string_agg(DISTINCT sprp.id_proposta::text, ', ') as ids_proposta");
		$select->join(array('ort' => 'seguro.orientacao_restricao_tecnica'), 'ort.id = spr.id_orientacao_restricao_tecnica', 'ds_orientacao');
		$select->join(array('sp' => 'seguro.proponentes'), 'spr.id_proponente = sp.id', false);
		$select->join(array('sc' => 'sistema.corretores'), 'sc.id = spr.id_corretor', 'ds_nome_corretor');
		$select->joinLeft(array('sfa' => 'sistema.funcionarios'), 'spr.id_funcionario_agronomo = sfa.id', 'ds_nome_funcionario as ds_nome_agronomo');
		$select->joinLeft(array('sfv' => 'sistema.funcionarios'), 'spr.id_funcionario_perito = sfv.id', 'ds_nome_funcionario as ds_nome_perito');
		$select->join(array('rtprt' => 'seguro.restricoes_tecnicas_proponentes_restricoes_tecnicas'), 'rtprt.id_proponente_restricao = spr.id', false);
		$select->join(array('rt' => 'seguro.restricoes_tecnicas'), 'rtprt.id_restricao = rt.id', "string_agg(DISTINCT rt.ds_nome_restricao, ', ') as restricoes");
		$select->where('sp.id = ?', $idProponente);

        if (!empty($idProposta)) {
            $select->where('sprp.id_proposta = ?', $idProposta);
        }

		$select->group('
			spr.id,
			spr.id_proposta,
			spr.ds_descricao,
			sc.ds_nome_corretor,
			sfa.ds_nome_funcionario,
			sfv.ds_nome_funcionario,
			ort.ds_orientacao
		');
		
		return $this->fetchAll($select)->toArray();
	}

	public function findRestricoes(int $idProponente, int $idProposta): array
	{
		return $this->fetchAll(
			$this->select()
				->setIntegrityCheck(false)
				->from(['spr' => 'seguro.proponentes_restricoes_tecnicas'])
				->join(['sp' => 'seguro.proponentes'], 'sp.id = spr.id_proponente', false)
				->joinLeft(
					['sprp' => 'seguro.proponentes_restricoes_tecnicas_propostas'],
					'sprp.id_proponente_restricao_tecnica = spr.id',
					'id_proposta'
				)
				->where('spr.id_proponente = ?', $idProponente)
				->where('sp.fl_restricao IS TRUE')
		)->toArray();
	}
}