<?php

class Seguro_Model_BeneficiarioRestricaoTecnica extends Agro_Db_Table_Abstract {
    protected $_name = 'beneficiario_restricao_tecnica';
	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_beneficiario = $dados['id_beneficiario'];
		$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_RestricaoTecnicaBeneficiarioRestricaoTecnica();
			$Model->delete($r,'id_beneficiario_restricao_tecnica');
			foreach ($dados['restricoes'] as $res => $id) {
				$Model->save(array('id_restricao_tecnica' => $id, 'id_beneficiario_restricao_tecnica' => $r));
			}
		} else {
			return false;
		}

		return $r;
	}

	public function getRestricoesByBeneficiario(int $idBeneficiario)
	{
		$query = $this
			->select()
			->setIntegrityCheck(false)
			->from(array('brt' => 'seguro.beneficiario_restricao_tecnica'), array('id','ds_descricao'))
			->joinLeft(
				array('brtp' => 'seguro.beneficiario_restricao_tecnica_proposta'),
				'brtp.id_beneficiario_restricao_tecnica = brt.id',
				"string_agg(DISTINCT brtp.id_proposta::text, ', ') as ids_proposta")
			->join(array('ort' => 'seguro.orientacao_restricao_tecnica'), 'ort.id = brt.id_orientacao_restricao_tecnica', 'ds_orientacao')
			->join(array('b' => 'seguro.beneficiarios'), 'brt.id_beneficiario = b.id', false)
			->join(array('sc' => 'sistema.corretores'), 'sc.id = brt.id_corretor', 'ds_nome_corretor')
			->joinLeft(array('sfa' => 'sistema.funcionarios'), 'brt.id_funcionario_agronomo = sfa.id', 'ds_nome_funcionario as ds_nome_agronomo')
			->joinLeft(array('sfv' => 'sistema.funcionarios'), 'brt.id_funcionario_perito = sfv.id', 'ds_nome_funcionario as ds_nome_perito')
			->join(array('rtprt' => 'seguro.restricao_tecnica_beneficiario_restricao_tecnica'), 'rtprt.id_beneficiario_restricao_tecnica = brt.id', false)
			->join(array('rt' => 'seguro.restricoes_tecnicas'), 'rtprt.id_restricao_tecnica = rt.id', "string_agg(DISTINCT rt.ds_nome_restricao, ', ') as restricoes")
			->where('b.id = ?', $idBeneficiario);

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

		$query->group('
			brt.id,
			brt.ds_descricao,
			sc.ds_nome_corretor,
			sfa.ds_nome_funcionario,
			sfv.ds_nome_funcionario,
			ort.ds_orientacao
		');

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

	public function findRestricoesByIdsBeneficiarios(array $idsBeneficiarios, int $idProposta): array
	{
		return $this->fetchAll(
			$this->select()
				->setIntegrityCheck(false)
				->from(['brt' => 'seguro.beneficiario_restricao_tecnica'])
				->join(['sb' => 'seguro.beneficiarios'], 'sb.id = brt.id_beneficiario', false)
				->joinLeft(
					['brtp' => 'seguro.beneficiario_restricao_tecnica_proposta'],
					'brtp.id_beneficiario_restricao_tecnica = brt.id',
					'id_proposta'
				)
				->where('sb.fl_restricao IS TRUE')
				->where('brt.id_beneficiario IN (?)', $idsBeneficiarios)
				->where('brtp.id_proposta = ? OR brtp.id_proposta IS NULL', $idProposta)
		)->toArray();
	}
}