<?php

class Comercializacao_Model_TaxasAgrupamentoCar extends Agro_Db_Table_Abstract {
	protected $_schema = 'comercializacao';
	protected $_name = 'taxas_agrupamento_car';
	protected $_primary = array('id');

	public $_columnExcel = array(
		'ds_nome_agrupamento_taxas' => 'Agrupamento',
		'ds_nome_safra' => 'Safra',
		'ds_nome_produto' => 'Produto',
		'ds_car' => 'Número CAR'
	);

	public function save($values) {
		$user = Zend_Auth::getInstance()->getIdentity();
		$Row = $this->find($values['id'])->current();

		if (!$Row) {
			$Row = $this->createRow();
		}

		$Row->id_taxa_agrupamento = $values['id_taxa_agrupamento'];
		$Row->ds_car = Agro_Util::carUnmask($values['ds_car']);
		$Row->vl_produtividade_esperada = !empty($values['vl_produtividade_esperada'])
			? $values['vl_produtividade_esperada']
			: null;
		$Row->id_usuario_criacao = $user->id;
		$Row->dt_criacao = date('Y-m-d H:i:s');

		return $Row->save();
	}

	public function getMapDescricoesCar(): array
	{
		$taxasCar = $this->_db->fetchAll(
			$this
				->select()
				->setIntegrityCheck(false)
				->from(['t' => 'comercializacao.taxas_agrupamento_car'], 'ds_car')
		);
		
		$map = [];
		foreach ($taxasCar as $taxa) {
			$map[$taxa['ds_car']] = true;
		}

		return $map;
	}
	
	public function getCarsRelacionadosPorIdProduto(int $idProduto): array
	{
		$taxasCar = $this->_db->fetchAll(
			$this
				->select()
				->setIntegrityCheck(false)
				->from(array('tac' => 'comercializacao.taxas_agrupamento_car'), 'ds_car')
				->join(
					array('ta' => 'comercializacao.taxas_agrupamento'),
					'ta.id = tac.id_taxa_agrupamento',
					false
				)
				->where('ta.id_produto = ?', $idProduto)
		);

		$map = [];
		foreach ($taxasCar as $taxa) {
			$map[$taxa['ds_car']] = true;
		}

		return $map;
	}

	function getCarsRelacionadosPorTaxaAgrupamento(int $idTaxaAgrupamento, array $cars): array
	{
		$numerosCar = $separator = '';
		foreach ($cars as $key => $car) {
			$numerosCar .= "{$separator} '{$car['ds_car']}'";
			$separator = ', ';
		}
		
		$taxaAgrupamento = (new Comercializacao_Model_TaxasAgrupamentos())
			->find($idTaxaAgrupamento)
			->current();

		$taxasAgrupamentoCar = $this->_db->fetchAll(
			$this
				->select()
				->setIntegrityCheck(false)
				->from(array('tac' => 'comercializacao.taxas_agrupamento_car'), 'ds_car')
				->join(
					array('ta' => 'comercializacao.taxas_agrupamento'),
					'ta.id = tac.id_taxa_agrupamento',
					false)
				->where("ds_car IN ({$numerosCar})")
				->where('ta.id_produto = ?', $taxaAgrupamento->id_produto)
		);

		$mapTaxasCar = [];

		foreach ($taxasAgrupamentoCar as $taxa) {
			$mapTaxasCar[$taxa['ds_car']] = true;
		}

		return $mapTaxasCar;
	}

	public function vincularCar(int $idTaxaAgrupamento, array $carArray): void
	{
		$mapTaxasCar = $this->getCarsRelacionadosPorTaxaAgrupamento($idTaxaAgrupamento, $carArray);

		$sql = "INSERT INTO comercializacao.taxas_agrupamento_car (id_taxa_agrupamento, ds_car, vl_produtividade_esperada) VALUES";

		$separator = $errorMessage = '';
		$linha = 1;
		foreach ($carArray as $car) {
			$dsCar = Agro_Util::carUnmask($car['ds_car']);

			if (empty($dsCar)) {
				$errorMessage .= "Linha {$linha}: número do CAR está vazio.\n";
			}

			if (array_key_exists($dsCar, $mapTaxasCar)) {
				$errorMessage .= "Linha {$linha}: número do CAR já está vinculado a uma taxa.\n";
			}

			if ($car['vl_produtividade_esperada'] != 'null' && !is_numeric($car['vl_produtividade_esperada'])) {
				$errorMessage .= "Linha {$linha}: produtividade informada deve ser um número.\n";
			}

			++$linha;

			$sql .= "{$separator}({$idTaxaAgrupamento}, '{$dsCar}', {$car['vl_produtividade_esperada']})";
			$separator = ',';
		}

		if (!empty($errorMessage)) {
			throw new Exception("Não foi possível importar o arquivo por causa dos seguintes erros:\n$errorMessage");
		}
		
		if (!empty($separator)) {
			$this->_db->query($sql);
		}
	}

	public function getData($where=null){
		$select = $this->select()->distinct();
		$select->setIntegrityCheck(false);
		$select->from(array('c'=>'comercializacao.v_taxas_agrupamento'), '*');
		$select->joinLeft(array('tp' => 'comercializacao.taxas_agrupamento_car'), 'c.id = tp.id_taxa_agrupamento', false);

		if (is_array($where)) {
			if($where['id_estado']) {
				$select->where("
				exists(select 1 from sistema.municipios mun where pr.id_municipio = mun.id and id_estado = {$where['id_estado']})");
				unset($where['id_estado']);
			}

			foreach ($where as $clause) {
				$field = $clause['field'];
				$operator = $clause['operator'];
				$value = $clause['value'];

				$select->where("$field $operator ?", $value);
			}
		} elseif ($where != '') {
			$select->where($where);
		}
		if($this->_order)
			$select->order($this->_order);

		return $select;
	}

	public function getDataExcel($where = null)
	{
		$select = $this->select()->distinct();
		$select->setIntegrityCheck(false);
		$select->from(array('c'=>'comercializacao.v_taxas_agrupamento'), '*');
		$select->joinLeft(array('tp' => 'comercializacao.taxas_agrupamento_car'), 'c.id = tp.id_taxa_agrupamento', 'ds_car');

		if (is_array($where)) {
			if($where['id_estado']) {
				$select->where("
				exists(select 1 from sistema.municipios mun where pr.id_municipio = mun.id and id_estado = {$where['id_estado']})");
				unset($where['id_estado']);
			}

			foreach ($where as $clause) {
				$field = $clause['field'];
				$operator = $clause['operator'];
				$value = $clause['value'];

				$select->where("$field $operator ?", $value);
			}
		} elseif ($where != '') {
			$select->where($where);
		}
		if($this->_order)
			$select->order($this->_order);

		return $select;
	}

	public function getCarRelacionados($id) {
		$Select = $this->select()->setIntegrityCheck(false);
		$Select->where("id_taxa_agrupamento = ?", $id);
		$Select->order("ds_car");
		
		return $this->fetchAll($Select);
	}

	public function deletar(int $id) {
		return $this->_db->query("delete from comercializacao.taxas_agrupamento_car where id = {$id}");
	}

    public function getTaxaAgrupamento(int $idTaxaAgrupamento)
    {
        $select = $this->select();
        $select->setIntegrityCheck(false);
        $select->from(array('tap' => 'comercializacao.taxas_agrupamento_car'), '*');
        $select->join(array('ta' => 'comercializacao.taxas_agrupamento'), 'tap.id_taxa_agrupamento = ta.id', '*');
        $select->where('id_taxa_agrupamento = ?', $idTaxaAgrupamento);

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

	public function getTaxaAgrupamentoByCARS(int $idProduto, array $cars)
    {
        $select = $this->select();
        $select->setIntegrityCheck(false);
        $select->from(array('tap' => 'comercializacao.taxas_agrupamento_car'), ['vl_produtividade_esperada']);
        $select->join(array('ta' => 'comercializacao.taxas_agrupamento'), 'tap.id_taxa_agrupamento = ta.id', ['vl_comissao']);
		$select->where('ta.id_produto = ?', $idProduto);

		$aux = "'".implode("', '",$cars)."'";
		
		$select->where("ds_car IN ({$aux})");
		
		$select->group(["vl_produtividade_esperada", "vl_comissao"]);
		
        return $this->fetchAll($select)->toArray();
    }

	public function getTaxaAgrupamentoByIdProdutoAndCARS(int $idProduto, array $cars)
	{
		$select = $this->select();
        $select->setIntegrityCheck(false);
        $select->from(array('tap' => 'comercializacao.taxas_agrupamento_car'), ['vl_produtividade_esperada', 'ds_car']);
        $select->join(array('ta' => 'comercializacao.taxas_agrupamento'), 'tap.id_taxa_agrupamento = ta.id', ['vl_comissao']);
		$select->join(
			array('tv' => 'comercializacao.taxas_valores'),
			'tv.id_taxa_agrupamento = ta.id', 
			['vl_taxa_inadimplente', 'vl_taxa', 'id as id_taxa_valor', 'vl_franquia', 'vl_percentual_subvencao_federal']);
		$select->where('id_produto = ?', $idProduto);

		$cars = "'" . implode ( "', '", $cars ) . "'";

		$select->where("ds_car IN ({$cars})");
		
        return $this->fetchAll($select)->toArray();
	}
}