<?php

class Sistema_Model_InformacoesBancarias extends Agro_Db_Table_Abstract {
	protected $_schema = 'sistema';
	protected $_name = 'informacoes_bancarias';
	protected $_primary = 'id';
	public $executeJsAfterDelete = '$.listContas';
	
	public function add(int $idProposta, array $row)
    {
		return $this->save([
 			'id_banco' => $row['id_banco'],
 			'ds_agencia' => $row['ds_agencia'],
 			'ds_conta' => $row['ds_conta'],
 			'ds_observacao' => $row['ds_observacao'],
 			'ds_tipo_conta' => $row['ds_tipo_conta'],
 			'nu_digito_agencia' => $row['nu_digito_agencia'],
 			'nu_digito_conta' => $row['nu_digito_conta']
        ]);
	}

	public function removeChavesDuplicadas($array) {
		$chavesUnicas = [];
		$result = [];
	
		foreach ($array as $item) {
			if (!in_array($item->name, $chavesUnicas)) {
				$chavesUnicas[] = $item->name;
				$result[] = $item;
			}
		}
		return $result;
	}

	public function mergeInformacoesBancarias($original, $novo) {
		$resultado = $original;
	
		$existingNames = array_column($original, 'name');
		$arr = array_unique($existingNames);
		
		foreach ($novo as $item) {
			if (!in_array($item->name, $arr)) {
				$resultado[] = $item;
			}else{
				foreach($resultado as $key => $m){
					if($m->name == $item->name){
						$resultado[$key]->value = $item->value;
					}
				}
			}
		}
		$resultado = $this->removeChavesDuplicadas($resultado);
		return $resultado;
	}

	public function save(array $data) {
		$Row = $this->getRow($data['id']);
		
		$row_campos_alteracoes_original = json_decode($Row->ds_campos_alteracoes);
		$campos_alteracoes_novo = json_decode($data['ds_campos_alteracoes']);

		$arrayIncrementado = $this->mergeInformacoesBancarias(
			$row_campos_alteracoes_original->informacoes_bancarias->E,
			$campos_alteracoes_novo->informacoes_bancarias->E
		);

		$row_campos_alteracoes_original->informacoes_bancarias->E = $arrayIncrementado;

		$data['ds_campos_alteracoes'] = json_encode($row_campos_alteracoes_original);

		try {
			$Row->id_banco = $data['id_banco'];
			$Row->ds_agencia = $data['ds_agencia'];
			$Row->ds_conta = $data['ds_conta'];
			$Row->ds_observacao = !empty($data['ds_observacao']) ? $data['ds_observacao'] : $Row->ds_observacao;
			$Row->ds_tipo_conta = $data['ds_tipo_conta'];
			$Row->nu_digito_agencia = $data['nu_digito_agencia'];
			$Row->nu_digito_conta = $data['nu_digito_conta'];
			$Row->ds_campos_alteracoes = $data['ds_campos_alteracoes'] ? $data['ds_campos_alteracoes'] : $Row->ds_campos_alteracoes;
			$Row->ds_campos_valores_iniciais = $data['ds_campos_valores_iniciais'] ? $data['ds_campos_valores_iniciais'] : $Row->ds_campos_valores_iniciais;
			$Row->save();
			
			if ($data['tipo'] == 'C') {
				$this->relacionaCorretor($Row->id, $data['id_corretor']);
			} else if ($data['tipo'] == 'E') {
				$this->relacionaEmpresa($Row->id, $data['id_empresa']);
			}
			
			return $Row;
		} catch (Exception $e) {
			$this->setMessage($e->getMessage());
			return false;
		}
	}

	public function getCamposAlterados($idInformacoesBancarias)
    {
        $select = $this->select()->setIntegrityCheck(false);
        $select->from(array('ib' => 'sistema.informacoes_bancarias'), array('ds_campos_alteracoes', 'ds_campos_valores_iniciais'));
        $select->where('id = ?', $idInformacoesBancarias);

        $info_bancaria_proposta = $this->fetchRow($select);
        if (!$info_bancaria_proposta) {
            throw new RuntimeException('Nenhuma informação bancária encontrada.');
        }
        return $info_bancaria_proposta;
    }
	
	public function relacionaCorretor($id, $corretor) {
		$Model = new Sistema_Model_InformacoesBancariasCorretores();
		
		$data = array();
		$data['id_informacoes_bancarias'] = $id;
		$data['id_corretor'] = $corretor;
		
		return $Model->save($data);
	}
	
	public function relacionaEmpresa($id, $empresa) {
		$Model = new Sistema_Model_InformacoesBancariasEmpresas();
		
		$data = array();
		$data['id_informacoes_bancarias'] = $id;
		$data['id_empresa'] = $empresa;
		
		return $Model->save($data);
	}
	
	public function getData($where) {
		$select = $this->select()->distinct(true)->setIntegrityCheck(false);
		$select->from(array('ib' => 'sistema.informacoes_bancarias'));
		$select->join(array('b' => 'sistema.bancos'), 'ib.id_banco = b.id', 'ds_nome_banco');
		$select->joinLeft(array('ibc' => 'sistema.informacoes_bancarias_corretores'), 'ib.id = ibc.id_informacoes_bancarias', false);
		$select->joinLeft(array('ibe' => 'sistema.informacoes_bancarias_empresas'), 'ib.id = ibe.id_informacoes_bancarias', false);
		
		foreach ($where as $clause) {
			if (is_array($clause)) {
				$field = $clause['field'];
				$operator = $clause['operator'];
				$value = $clause['value'];
				
				$select->where("$field $operator ?", $value);
			}
		}
		
		return $select;
	}
	
	public function delete($id) {
		$Model = new Sistema_Model_InformacoesBancariasEmpresas();
		$Model->delete($id, 'id_informacoes_bancarias');
		$Model = new Sistema_Model_InformacoesBancariasCorretores();
		$Model->delete($id, 'id_informacoes_bancarias');
		$model = new Seguro_Model_InformacoesBancariasPropostas();
		$model->delete($id, 'id_informacoes_bancarias');
		return $this->_db->query("delete from sistema.informacoes_bancarias where id = $id");
	}

	public function getInformacoesBancariasByProposta(int $idProposta)
    {
        $select = $this->select()->setIntegrityCheck(false);
        $select->from(['ib' => "{$this->_schema}.{$this->_name}"], ['id', 'id_banco', 'ds_agencia', 'ds_conta', 'ds_tipo_conta', 'nu_digito_agencia', 'ds_observacao','nu_digito_conta']);
        $select->join(['ibp' => 'seguro.informacoes_bancarias_propostas'], 'ibp.id_informacoes_bancarias = ib.id', ['id as id_informacao_bancaria_proposta', 'fl_titular_conta', 'fl_conta_conjunta']);
        $select->where("ibp.id_proposta = {$idProposta}");

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

	public function getInformacoesBancariasById(int $idInformacoesBancarias)
	{
		$sql = "select ib.id, 
		ib.ds_agencia, 
		ib.ds_conta,
		ib.nu_digito_conta as digito_conta, 
		ib.nu_digito_agencia as digito_agencia, 
		b.ds_nome_banco, 
		ib.ds_tipo_conta,
		ibb.id_forma_pagamento,
		ib.id_banco,
		fp.ds_forma_pagamento from sistema.informacoes_bancarias ib 
		join sistema.bancos b ON b.id = ib.id_banco 
		join seguro.informacoes_bancarias_beneficiarios ibb on ibb.id_informacoes_bancarias = ib.id 
		join sistema.formas_pagamento fp on fp.id = ibb.id_forma_pagamento 
		where ib.id = {$idInformacoesBancarias}";

		return $this->_db->fetchRow($sql);
		
	}
}