<?php

class Produto_Model_Atributogrupos extends Agro_Db_Table_Abstract {
    CONST TIPO_PROPRIEDADES = 'p';
    CONST TIPO_QUESTIONARIO = 'q';
    CONST TIPO_UNIDADES_SEGURADAS = 'u';

	protected $_schema = 'produto';
	protected $_name = 'produtos_grupos_atributos_rn';
	protected $_primary = 'id';

	public function save($values) {
		try {
			$Row = $this->getRow($values['id']);

			if ($values['ds_nome_grupo']) {
				$Row->id_produto = $values['id_produto'];
				$Row->ds_nome_grupo = $values['ds_nome_grupo'];
				$Row->fl_grupo_padrao = ($values['fl_grupo_padrao'] ? 1 : 0);
				$Row->ds_tipo = $values['ds_tipo'];

				if (isset($values['tp_grupo']) && !empty($values['tp_grupo'])) {
					$Row->tp_grupo = $values['tp_grupo'];
				}

				if ($Row->save()) {
					$this->relacionaAtributosPrincipal($Row);
				}

				return $Row->id;
			}
		} catch (Exception $e) {
			return false;
		}
	}

	public function relacionaAtributosPrincipal($Grupo) {
		if (!$Grupo->fl_grupo_padrao && !$this->countAtributos($Grupo->id)) {
			$AtributosPadrao = $this->getAtributosPadrao($Grupo->id_produto, $Grupo->ds_tipo);

			if ($AtributosPadrao) {
				$Model = new Produto_Model_ProdutosAtributos();

				foreach ($AtributosPadrao as $Row) {
					$data = array(
						'id_grupo_atributo_rn' => $Grupo->id,
						'id_atributo_rn' => $Row->id_atributo_rn,
						'ds_valor' => $Row->ds_valor
					);

					$Model->save($data);
				}
			}
		}
	}

	public function copiaAtributos($novo, $antigo) {

		if ($this->countAtributos($antigo->id)) {
			$Atributos = $this->getAtributos($antigo->id);
			if ($Atributos) {
				$Model = new Produto_Model_ProdutosAtributos();

				foreach ($Atributos as $Row) {
					$data = array(
						'id_grupo_atributo_rn' => $novo->id,
						'id_atributo_rn' => $Row->id_atributo_rn,
						'ds_valor' => $Row->ds_valor
					);

					$Model->save($data);
				}
			}
		}
	}

	public function countAtributos($idGrupo) {
		$select = $this->select()->setIntegrityCheck(false);
		$select->from(array('a' => 'produto.produtos_atributos_rn'));
		$select->where('fl_del = false');
		$select->where('id_grupo_atributo_rn = ?', $idGrupo);

		return $this->fetchAll($select)->count();
	}

	public function getAtributos($idGrupo) {
		$select = $this->select()->setIntegrityCheck(false);
		$select->from(array('a' => 'produto.produtos_atributos_rn'));
		$select->where('fl_del = false');
		$select->where('id_grupo_atributo_rn = ?', $idGrupo);

		return $this->fetchAll($select);
	}

	public function getAtributosProposta($RowProposta, $tipo, $chave='', array $parametrosAdicionais = [])
    {
        $idProponente = !empty($RowProposta->id_proponente_original) ?? null;

        if (empty($idProponente)) {
            $proponente = $RowProposta->proponente();
            $idProponente = $proponente['id_proponente'];
        }

        $corretor = $RowProposta->corretor();
        $preposto = $RowProposta->preposto();
        $propriedade = $RowProposta->propriedade();

        $idMunicipio = $parametrosAdicionais['id_municipio'] ?? $propriedade['id_municipio'];
        $idUsuario = !empty($preposto) ? $preposto['id_usuario'] : $corretor['id_usuario'];
		
		if (!empty($parametrosAdicionais['id_proponente'])) {
			$idProponente = !empty($idProponente) ? $idProponente : $parametrosAdicionais['id_proponente'];
		}

        $tipos = [
            Produto_Model_AtributosModulos::DS_CHAVE_PROPRIEDADE => self::TIPO_PROPRIEDADES,
            Produto_Model_AtributosModulos::DS_CHAVE_QUESTIONARIO => self::TIPO_QUESTIONARIO,
            Produto_Model_AtributosModulos::DS_CHAVE_UNIDADE_SEGURADA => self::TIPO_UNIDADES_SEGURADAS,
        ];

        $atributos = $this->getAtributosProduto(
            $RowProposta->id_produto,
            $idUsuario,
            $idMunicipio,
            $idProponente,
            !empty($chave) ? $chave : '',
            ['ppar.ds_valor', 'par.*', 'pam.ds_chave_atributo_modulo', 'pta.ds_chave_tipo_atributo'],
            null,
            $tipos[$tipo]
        );

        if ($atributos instanceof Zend_Db_Table_Rowset) {
            $atributos = $atributos->toArray();
        }

        if (!empty($atributos)) {
            return $atributos;
        }

		return false;
	}

	public function getAtributosSinistro($RowProcesso, $tipo, $chave='') {

		$Atributos = $this->getAtributosPadrao($RowProposta->id_produto, $tipo, $chave);

		if ($Atributos) {
			return $Atributos;
		}

		return false;
	}


	public function getAtributosPadrao($idProduto, $tipo, $chave='') {
		$select = $this->select()->setIntegrityCheck(false)->distinct();
		$select->from(array('a' => 'produto.produtos_grupos_atributos_rn'), null);
		$select->join(array('pa' => 'produto.produtos_atributos_rn'), 'a.id = pa.id_grupo_atributo_rn', array('ds_valor'));
		$select->join(array('rn' => 'produto.atributos_rn'), 'pa.id_atributo_rn = rn.id');
		$select->join(array('m' => 'produto.atributos_modulos'), 'rn.id_atributo_modulo = m.id', 'ds_chave_atributo_modulo');
		$select->join(array('tpa' => 'produto.tipo_atributo'), 'rn.id_tipo_atributo = tpa.id', 'ds_chave_tipo_atributo');
		$select->where('ds_chave_atributo_modulo = ?', $tipo);
		$select->where('a.id_produto = ?', $idProduto);
		$select->where('fl_grupo_padrao = true');
        $select->where('pa.fl_del = ?', 'f');
		$select->order('rn.ds_ordem');

		if ($chave) $select->where('ds_chave_rn = ?', $chave);

		if ($chave) {
			$Row = $this->fetchRow($select);
			return $Row->ds_valor;
		} else {
			$Row = $this->fetchAll($select);
			if ($Row) return $Row->toArray();
		}
	}

	public function getAtributosUsuario($idProduto, $idUsuario, $tipo='', $chave='') {
		if ($idUsuario) {
			$select = $this->select()->setIntegrityCheck(false)->distinct();
			$select->from(array('a' => 'produto.produtos_grupos_atributos_rn'), null);
			$select->join(array('pa' => 'produto.produtos_atributos_rn'), 'a.id = pa.id_grupo_atributo_rn', array('ds_valor'));
			$select->join(array('rn' => 'produto.atributos_rn'), 'pa.id_atributo_rn = rn.id');
			$select->join(array('m' => 'produto.atributos_modulos'), 'rn.id_atributo_modulo = m.id', 'ds_chave_atributo_modulo');
			$select->join(array('p' => 'produto.produtos_grupos_atributos_rn_usuarios'), 'p.id_grupo_atributo_rn = a.id', null);
			$select->join(array('tpa' => 'produto.tipo_atributo'), 'rn.id_tipo_atributo = tpa.id', 'ds_chave_tipo_atributo');
			$select->where('ds_chave_atributo_modulo = ?', $tipo);
			$select->where('p.id_usuario = ?', $idUsuario, 'integer');
			$select->where('a.id_produto = ?', $idProduto);
			$select->where('fl_grupo_padrao = false');
            $select->where('pa.fl_del = ?', 'f');
			$select->order('rn.ds_ordem');

			if ($chave) $select->where('ds_chave_rn = ?', $chave);

			if ($chave) {
				$Row = $this->fetchRow($select);
				return $Row->ds_valor;
			} else {
				$Row = $this->fetchAll($select);
				if ($Row) return $Row->toArray();
			}
		}

		return;
	}

	public function getAtributosProponente($idProduto, $idProponente, $tipo='', $chave='') {
		if ($idProponente) {
			$select = $this->select()->setIntegrityCheck(false)->distinct();
			$select->from(array('a' => 'produto.produtos_grupos_atributos_rn'), null);
			$select->join(array('pa' => 'produto.produtos_atributos_rn'), 'a.id = pa.id_grupo_atributo_rn', array('ds_valor'));
			$select->join(array('rn' => 'produto.atributos_rn'), 'pa.id_atributo_rn = rn.id');
			$select->join(array('m' => 'produto.atributos_modulos'), 'rn.id_atributo_modulo = m.id', 'ds_chave_atributo_modulo');
			$select->join(array('p' => 'produto.produtos_grupos_atributos_rn_proponentes'), 'p.id_grupo_atributo_rn = a.id', null);
			$select->join(array('tpa' => 'produto.tipo_atributo'), 'rn.id_tipo_atributo = tpa.id', 'ds_chave_tipo_atributo');
			$select->where('ds_chave_atributo_modulo = ?', $tipo);
			$select->where('p.id_proponente = ?', $idProponente);
			$select->where('a.id_produto = ?', $idProduto);
			$select->where('fl_grupo_padrao = false');
            $select->where('pa.fl_del = ?', 'f');
			$select->order('rn.ds_ordem');

			if ($chave) $select->where('ds_chave_rn = ?', $chave);

			if ($chave) {
				$Row = $this->fetchRow($select);
				return $Row->ds_valor;
			} else {
				$Row = $this->fetchAll($select);
				if ($Row) return $Row->toArray();
			}
		}

		return;
	}

	public function getAtributosMunicipio($idProduto, $idMunicipio, $tipo='', $chave='') {
		if ($idMunicipio) {
			$select = $this->select()->setIntegrityCheck(false)->distinct();
			$select->from(array('a' => 'produto.produtos_grupos_atributos_rn'), null);
			$select->join(array('pa' => 'produto.produtos_atributos_rn'), 'a.id = pa.id_grupo_atributo_rn', array('ds_valor'));
			$select->join(array('rn' => 'produto.atributos_rn'), 'pa.id_atributo_rn = rn.id');
			$select->join(array('m' => 'produto.atributos_modulos'), 'rn.id_atributo_modulo = m.id', 'ds_chave_atributo_modulo');
			$select->join(array('p' => 'produto.produtos_grupos_atributos_rn_municipios'), 'p.id_grupo_atributo_rn = a.id', null);
			$select->join(array('tpa' => 'produto.tipo_atributo'), 'rn.id_tipo_atributo = tpa.id', 'ds_chave_tipo_atributo');
			$select->where('ds_chave_atributo_modulo = ?', $tipo);
			$select->where('p.id_municipio = ?', $idMunicipio);
			$select->where('a.id_produto = ?', $idProduto);
			$select->where('fl_grupo_padrao = false');
            $select->where('pa.fl_del = ?', 'f');
			$select->order('rn.ds_ordem');
	
			if ($chave) $select->where('ds_chave_rn = ?', $chave);

			if ($chave) {
				$Row = $this->fetchRow($select);
				return $Row->ds_valor;
			} else {
				$Row = $this->fetchAll($select);
				if ($Row) return $Row->toArray();
			}
		}
	
		return;
	}
	
	public function getUsuariosRelacionados($grupo) {
		$select = $this->select()->setIntegrityCheck(false);
		$select->from(array('pgau'=>'produto.produtos_grupos_atributos_rn_usuarios'));
		$select->where('id_grupo_atributo_rn = ?', $grupo);
		$Rs = $this->fetchAll($select);

		$return = array();
		if ($Rs->count()) {
			foreach ($Rs as $Row) {
				$return[] = $Row->id_usuario;
			}
		}

		return $return;
	}

	public function beforeDelete($id, $field) {
		if ($field == 'id_produto') {
			$Rs = $this->fetchAll("id_produto = $id");
			if ($Rs->count()) {
				$id = array();
				foreach ($Rs as $Row) {
					$id[] = $Row->id;
				}
			}
		}

		$Model = new Produto_Model_ProdutosAtributos();
		$Model->delete($id, 'id_grupo_atributo_rn');

		$Model = new Produto_Model_AtributoGrupoProponente();
		$Model->delete($id, 'id_grupo_atributo_rn');

		$Model = new Produto_Model_AtributoGrupoUsuarios();
		$Model->delete($id, 'id_grupo_atributo_rn');
	}

	public function delete($id, $field='id') {
		if ($field == 'id') {
			$Row = $this->find($id)->current();
			$this->executeJsAfterDelete = "$.listGrupos";
			$this->executeJsValueAfterDelete = $Row->ds_tipo;
		}

		return parent::delete($id, $field);
	}

	public function copiaGrupo($values) {
		try {
			$RowOld = $this->getRow($values['id_grupo']);
			$Row = $this->createRow();

			if ($values['ds_nome_grupo']) {
				$Row->id_produto = $values['id_produto'];
				$Row->ds_nome_grupo = $values['ds_nome_grupo'];
				$Row->fl_grupo_padrao = ($values['fl_grupo_padrao'] ? 1 : 0);
				$Row->ds_tipo = $values['ds_tipo'];

				if (isset($values['tp_grupo']) && !empty($values['tp_grupo'])) {
					$Row->tp_grupo = $values['tp_grupo'];
				}

				if ($Row->save()) {
					$this->copiaAtributos($Row, $RowOld);
				}

				return $Row->id;
			}
		} catch (Exception $e) {
			dump($e);
			return false;
		}
	}

	public function getData($where = false)
    {
        $select = $this->select();

        $select->setIntegrityCheck(false)->distinct();
        $select->from(['pgar' => "{$this->_schema}.{$this->_name}"]);
        $select->joinLeft(['pgarp' => 'produto.produtos_grupos_atributos_rn_proponentes'], 'pgarp.id_grupo_atributo_rn = pgar.id', false);
        $select->joinLeft(['prop' => 'seguro.proponentes'], 'prop.id = pgarp.id_proponente', false);
        $select->joinLeft(['pgaru' => 'produto.produtos_grupos_atributos_rn_usuarios'], 'pgaru.id_grupo_atributo_rn = pgar.id', false);
        $select->joinLeft(['usu' => 'sistema.usuarios'], 'usu.id = pgaru.id_usuario', false);

        if ($this->_order) {
            $select->order($this->_order);
        }

        $this->getWhere($select, $where);

        return $select;
    }

	public function isAtributoLiberadoParaProduto(int $idProduto, string $dsChaveAtributo): bool
	{
		$select = $this->select()
			->setIntegrityCheck(false)
			->from(['ppgar' => 'produto.produtos_grupos_atributos_rn'])
			->join(['ppar' => 'produto.produtos_atributos_rn'], 'ppar.id_grupo_atributo_rn = ppgar.id', false)
			->join(['par' => 'produto.atributos_rn'], 'par.id = ppar.id_atributo_rn', false)
			->where('ppgar.id_produto = ?', $idProduto)
			->where('par.ds_chave_rn = ?', $dsChaveAtributo)
			->where('ppar.fl_del IS FALSE');
		
		return $this->fetchRow($select) ? true : false;
	}

    public function getAtributosProduto(
        int $idProduto,
        int $idUsuario,
        int $idMunicipio,
        int $idProponente = null,
        string $atributoChaveRn = '',
        array $campos = [],
        int $limit = null,
        string $tipo = self::TIPO_PROPRIEDADES,
        bool $grupoPadrao = true,
        int $idParent = null
    ) {
        $campos[] = "CASE WHEN ppgar.fl_grupo_padrao is false THEN 0 ELSE 1 END AS grupo_padrao";
        $atributoChaveRn = !empty($atributoChaveRn) ? "par.ds_chave_rn = '{$atributoChaveRn}'" : '';

        $selectBase = $this->select()->setIntegrityCheck(false)
            ->from(['ppgar' => 'produto.produtos_grupos_atributos_rn'], false)
            ->join(['ppar' => 'produto.produtos_atributos_rn'], 'ppar.id_grupo_atributo_rn = ppgar.id', false)
            ->join(['par' => 'produto.atributos_rn'], 'par.id = ppar.id_atributo_rn', false)
            ->join(['pta' => 'produto.tipo_atributo'], 'pta.id = par.id_tipo_atributo', false)
            ->join(['pam' => 'produto.atributos_modulos'], 'pam.id = par.id_atributo_modulo', false)
            ->where('ppgar.id_produto = ?', $idProduto)
            ->where("ppgar.ds_tipo = ?", $tipo)
            ->where('ppar.fl_del is false');

        /**
         * Condição para novos orçamentos onde o proponente ainda não foi selecionado
         */
        if (empty($idProponente) && $tipo === self::TIPO_QUESTIONARIO) {
            $selectBase->where('par.id_parent = 0');
        } elseif (!empty($idParent)) {
            $selectBase->where('par.id_parent = ?', $idParent);
        }

        $select1 = clone $selectBase;
        $select2 = clone $selectBase;
        $select3 = clone $selectBase;
        $select4 = clone $selectBase;
        $select5 = clone $selectBase;
        $select6 = clone $selectBase;
        $select7 = clone $selectBase;
        $select8 = clone $selectBase;

        $campos['nivel_hierarquia'] = new Zend_Db_Expr("'2'");
        $select1->join(['ppgaru' => 'produto.produtos_grupos_atributos_rn_usuarios'], 'ppgaru.id_grupo_atributo_rn = ppgar.id', false)
            ->join(['ppgarm' => 'produto.produtos_grupos_atributos_rn_municipios'], 'ppgarm.id_grupo_atributo_rn = ppgar.id', false)
            ->joinLeft(['ppgarp' => 'produto.produtos_grupos_atributos_rn_proponentes'], 'ppgarp.id_grupo_atributo_rn = ppgar.id', false)
            ->columns($campos)
            ->where('ppgar.fl_grupo_padrao is false')
            ->where('ppgaru.id_usuario = ?', $idUsuario)
            ->where('ppgarm.id_municipio = ?', $idMunicipio)
            ->where('ppgarp.id_proponente is null');

        $select2->join(['ppgaru' => 'produto.produtos_grupos_atributos_rn_usuarios'], 'ppgaru.id_grupo_atributo_rn = ppgar.id', false)
            ->joinLeft(['ppgarm' => 'produto.produtos_grupos_atributos_rn_municipios'], 'ppgarm.id_grupo_atributo_rn = ppgar.id', false)
            ->joinLeft(['ppgarp' => 'produto.produtos_grupos_atributos_rn_proponentes'], 'ppgarp.id_grupo_atributo_rn = ppgar.id', false)
            ->columns($campos)
            ->where('ppgar.fl_grupo_padrao is false')
            ->where('ppgaru.id_usuario = ?', $idUsuario)
            ->where('ppgarm.id_municipio is null')
            ->where('ppgarp.id_proponente is null');

        $campos['nivel_hierarquia'] = new Zend_Db_Expr("'3'");
        $select3->joinLeft(['ppgaru' => 'produto.produtos_grupos_atributos_rn_usuarios'], 'ppgaru.id_grupo_atributo_rn = ppgar.id', false)
            ->join(['ppgarm' => 'produto.produtos_grupos_atributos_rn_municipios'], 'ppgarm.id_grupo_atributo_rn = ppgar.id', false)
            ->joinLeft(['ppgarp' => 'produto.produtos_grupos_atributos_rn_proponentes'], 'ppgarp.id_grupo_atributo_rn = ppgar.id', false)
            ->columns($campos)
            ->where('ppgar.fl_grupo_padrao is false')
            ->where('ppgaru.id_usuario is null')
            ->where('ppgarm.id_municipio = ?', $idMunicipio)
            ->where('ppgarp.id_proponente is null');

        $querys = [$select1, $select2, $select3];

        if (!empty($idProponente)) {
            $campos['nivel_hierarquia'] = new Zend_Db_Expr("'1'");
            $select4->join(['ppgaru' => 'produto.produtos_grupos_atributos_rn_usuarios'], 'ppgaru.id_grupo_atributo_rn = ppgar.id', false)
                ->join(['ppgarm' => 'produto.produtos_grupos_atributos_rn_municipios'], 'ppgarm.id_grupo_atributo_rn = ppgar.id', false)
                ->join(['ppgarp' => 'produto.produtos_grupos_atributos_rn_proponentes'], 'ppgarp.id_grupo_atributo_rn = ppgar.id', false)
                ->columns($campos)
                ->where('ppgar.fl_grupo_padrao is false')
                ->where('ppgaru.id_usuario = ?', $idUsuario)
                ->where('ppgarm.id_municipio = ?', $idMunicipio)
                ->where('ppgarp.id_proponente = ?', $idProponente);

            $select5->join(['ppgaru' => 'produto.produtos_grupos_atributos_rn_usuarios'], 'ppgaru.id_grupo_atributo_rn = ppgar.id', false)
                ->joinLeft(['ppgarm' => 'produto.produtos_grupos_atributos_rn_municipios'], 'ppgarm.id_grupo_atributo_rn = ppgar.id', false)
                ->join(['ppgarp' => 'produto.produtos_grupos_atributos_rn_proponentes'], 'ppgarp.id_grupo_atributo_rn = ppgar.id', false)
                ->columns($campos)
                ->where('ppgar.fl_grupo_padrao is false')
                ->where('ppgaru.id_usuario = ?', $idUsuario)
                ->where('ppgarm.id_municipio is null')
                ->where('ppgarp.id_proponente = ?', $idProponente);

            $select6->joinLeft(['ppgaru' => 'produto.produtos_grupos_atributos_rn_usuarios'], 'ppgaru.id_grupo_atributo_rn = ppgar.id', false)
                ->join(['ppgarm' => 'produto.produtos_grupos_atributos_rn_municipios'], 'ppgarm.id_grupo_atributo_rn = ppgar.id', false)
                ->join(['ppgarp' => 'produto.produtos_grupos_atributos_rn_proponentes'], 'ppgarp.id_grupo_atributo_rn = ppgar.id', false)
                ->columns($campos)
                ->where('ppgar.fl_grupo_padrao is false')
                ->where('ppgaru.id_usuario is null')
                ->where('ppgarm.id_municipio = ?', $idMunicipio)
                ->where('ppgarp.id_proponente = ?', $idProponente);

            $select7->joinLeft(['ppgaru' => 'produto.produtos_grupos_atributos_rn_usuarios'], 'ppgaru.id_grupo_atributo_rn = ppgar.id', false)
                ->joinLeft(['ppgarm' => 'produto.produtos_grupos_atributos_rn_municipios'], 'ppgarm.id_grupo_atributo_rn = ppgar.id', false)
                ->join(['ppgarp' => 'produto.produtos_grupos_atributos_rn_proponentes'], 'ppgarp.id_grupo_atributo_rn = ppgar.id', false)
                ->columns($campos)
                ->where('ppgar.fl_grupo_padrao is false')
                ->where('ppgaru.id_usuario is null')
                ->where('ppgarm.id_municipio is null')
                ->where('ppgarp.id_proponente = ?', $idProponente);

            $querys[] = $select4;
            $querys[] = $select5;
            $querys[] = $select6;
            $querys[] = $select7;
        }

        if ($grupoPadrao) {
            $campos['nivel_hierarquia'] = new Zend_Db_Expr("'1'");
            $select8->columns($campos);
            $select8->where('ppgar.fl_grupo_padrao is true');
            $querys[] = $select8;
        }

        if (!empty($atributoChaveRn)) {
            $select1->where($atributoChaveRn);
            $select2->where($atributoChaveRn);
            $select3->where($atributoChaveRn);

            if (!empty($idProponente)) {
                $select4->where($atributoChaveRn);
                $select5->where($atributoChaveRn);
                $select6->where($atributoChaveRn);
                $select7->where($atributoChaveRn);
            }

            if ($grupoPadrao) {
                $select8->where($atributoChaveRn);
            }
        }

        $select = $this->select()->setIntegrityCheck(false);
        $select->union($querys, Zend_Db_Select::SQL_UNION_ALL);
        $select->order(['ds_ordem', 'nivel_hierarquia']);

        if (!is_null($limit) && $limit > 0) {
            $select->limit($limit);
        }

        if (!empty($atributoChaveRn)) {
            $rs = $this->fetchRow($select);

            if (empty($rs)) {
                return null;
            }

            $retorno = $rs->toArray();
            return $retorno['ds_valor'];
        }

        return $this->fetchAll($select);
    }
}
