<?php

class Produto_Model_CondicoesEspeciais extends Agro_Db_Table_Abstract {
	protected $_schema = 'produto';
	protected $_name = 'condicoes_especiais';
	protected $_primary = 'id';
	public $_order = 'ds_titulo';
	
	public function save(array $values) {
		$Row = $this->getRow($values['id']);
		
		$Row->ds_titulo = $values['ds_titulo'];
		$Row->ds_complemento = $values['ds_complemento'];
		
		$id = $Row->save();
		if ($values['id_configuracao_data_corte']) {
			$configuracaoDataCorte = (new Produto_Model_ConfiguracaoDataCorte())
				->find($values['id_configuracao_data_corte'])
				->current();
			$dataCorte = $configuracaoDataCorte['dt_corte'];
		} else {
			$dataCorte = '2000-01-01';
		}

		(new Produto_Model_CondicaoEspecialConfiguracao())->save([
			'ds_condicao_especial' => $values['ds_condicao_especial'],
			'id_condicao_especial' => $id,
			'dt_inicio_validade' => $dataCorte
		]);

		return $id;
	}
	
	public function getCondicoes(){
		$Select = $this->select()->setIntegrityCheck(false);
		$Select->from(array("ce" => "produto.condicoes_especiais"), array("id", "substring(ds_titulo from 0 for 120) as ds_titulo"));
		$Select->where('fl_ativo = true');
		$Select->where("ds_titulo != ''");
		$Select->order("ds_titulo");
		
		$Row = $this->fetchAll($Select);
		
		$condicoes = array();
		
		if ($Row){
			foreach ($Row as $condicao){
				$condicoes[$condicao->id] = $condicao->ds_titulo;
			}
		}
		
		return $condicoes;
	}

    /**
     * Retorna as condições especiais do produto e cobertura especificados
     * @param int $idProduto
     * @param int $idCobertura
     * @return Zend_Db_Table_Row_Abstract|null
     */
	public function getByProdutoCobertura(
		int $idProduto,
		int $idCobertura,
		DateTime $dateTime
	): ?Zend_Db_Table_Row_Abstract {
		$configuracoesCondicaoEspecial = (new Produto_Model_CondicaoEspecialConfiguracao())->getConfiguracoesPorProdutoData(
			$idProduto,
			$dateTime
		);
		
		if (empty($configuracoesCondicaoEspecial)) {
			return null;
		}

		$idsConfiguracoesCondicoesEspeciais = array_column($configuracoesCondicaoEspecial, 'id');
		
		$select = $this->select()->distinct(true)->setIntegrityCheck(false);
		$select->from(array('ce' => 'produto.condicoes_especiais'));
		$select->join(
            array('pcce' => 'produto.produtos_coberturas_condicoes_especiais'),
            'ce.id = pcce.id_condicao_especial',
            'id_cobertura'
        );
		$select->join(
            array('pc' => 'produto.produtos_coberturas'),
            'pc.id_produto = pcce.id_produto AND pc.id_cobertura = pcce.id_cobertura',
            false
        );
		$select->join(
			array('cond' => 'produto.condicao_especial_configuracao'),
			'cond.id_condicao_especial = pcce.id_condicao_especial',
			'ds_condicao_especial'
		);
		$select->where("pcce.id_produto = ?", $idProduto);
		$select->where("pcce.id_cobertura = ?", $idCobertura);
		$select->where('cond.id IN (?)', $idsConfiguracoesCondicoesEspeciais);
		$select->order('ce.id');
		
		return $this->fetchRow($select);
	}
}