<?php
/**
 * Arquivo de declaração da classe ImagemArqDAO.
 */
class ImagemArqDAO extends Model
{
    private $conexao;
    protected $_table = 'cp_arquiteto';

    /**
     * Método construtor.
     */
    public function __construct()
    {
        $this->conexao = Conexao::getInstancia();
    }

    /**
     * Método para retornar a quantidade de usuarios, conforme condição informada.
     *
     * @param  string $condicao
     * @param  array  $parametros
     * @return string
     */
    public function contador($condicao = '', $parametros = array())
    {
        $condicao = Util::verificaCampo($condicao, 'AND');

        $txtSql = "SELECT COUNT(*) AS quantidade FROM {$this->_table} WHERE excluido IS NULL $condicao";

        try {
            $sql = $this->conexao->getConexao()->prepare($txtSql);
            $this->conexao->setParametros($sql, $parametros);
            $sql->execute();
        } catch (PDOException $ex) {
            throw new BancoExcecao($ex->getMessage(), $txtSql, __FILE__, __CLASS__, __METHOD__, __LINE__);
        }

        $resultado = $sql->fetchColumn();
        $sql->closeCursor();

        return (int) $resultado;
    }

    /**
     * Método para retornar o ultimo id.
     *
     * @return string
     */
    public function ultimoId()
    {
        $txtSql = "SELECT MAX(id) AS max FROM {$this->_table}";

        try {
            $sql = $this->conexao->getConexao()->prepare($txtSql);
            $sql->execute();
        } catch (PDOException $ex) {
            throw new BancoExcecao($ex->getMessage(), $txtSql, __FILE__, __CLASS__, __METHOD__, __LINE__);
        }

        $resultado = $sql->fetchColumn();
        $sql->closeCursor();

        return (int) $resultado;
    }

    /**
     * Método para inserir.
     *
     * @param  ImagemArq $obj
     */
    public function inserir(ImagemArq $obj)
    {

        $txtSql = "INSERT INTO {$this->_table} (arq_id, imagem,criado_em) VALUES (:arquiteto, :imagem, NOW())";

        try {
            $sql = $this->conexao->getConexao()->prepare($txtSql);
            $sql->bindValue(':arquiteto', $obj->arquiteto, PDO::PARAM_STR);
            $sql->bindValue(':imagem', $obj->imagem, PDO::PARAM_STR);
            $sql->execute();
        } catch (PDOException $ex) {
            throw new BancoExcecao($ex->getMessage(), $txtSql, __FILE__, __CLASS__, __METHOD__, __LINE__);
        }

        $lastId = $sql->rowCount() > 0 ? (int) $this->conexao->getConexao()->lastInsertId() : null;
        $sql->closeCursor();

        return $lastId;
    }

    /**
     * Editar dados.
     *
     * @param  ImagemArq $obj
     */
    public function editar(ImagemArq $obj)
    {
        $slug = ($obj->slug) ? $obj->slug : $obj->nome;
        $slug = self::geraSlug($slug, $obj->id);

        $txtSql = "UPDATE {$this->_table}
                    SET arquiteto = :arquiteto,
                        imagem =  :imagem,
                        atualizado_em = NOW()
                    WHERE id = :id";

        try {
            $sql = $this->conexao->getConexao()->prepare($txtSql);
            $sql->bindValue(':arquiteto', $obj->arquiteto, PDO::PARAM_STR);
            $sql->bindValue(':imagem', $obj->imagem, PDO::PARAM_STR);
            $sql->bindValue(':id', $obj->id, PDO::PARAM_INT);
            $sql->execute();
            $sql->closeCursor();
        } catch (PDOException $ex) {
            throw new BancoExcecao($ex->getMessage(), $txtSql, __FILE__, __CLASS__, __METHOD__, __LINE__);
        }
    }

    /**
     * Método para excluir.
     *
     * @param  int $id
     */
    public function excluir($id = 0)
    {
        $txtSql = "UPDATE {$this->_table} SET excluido = now() WHERE id = :id";

        try {
            $sql = $this->conexao->getConexao()->prepare($txtSql);
            $sql->bindValue(':id', $id, PDO::PARAM_INT);
            $sql->execute();
        } catch (PDOException $ex) {
            throw new BancoExcecao($ex->getMessage(), $txtSql, __FILE__, __CLASS__, __METHOD__, __LINE__);
        }

        $resultado = $sql->rowCount() > 0 ? true : false;
        $sql->closeCursor();

        return $resultado;
    }

    /**
     * Método para listar os objetos.
     *
     * @param  string $condicao
     * @param  array  $parametros
     * @param  string $order
     * @param  string $limit
     * @param  string $offset
     */
    public function listar($condicao = '', $parametros = array(), $order = '', $limit = '', $offset = '')
    {
        $condicao = Util::verificaCampo($condicao, 'AND');
        $order = Util::verificaCampo($order, 'ORDER BY');
        $limit = Util::verificaCampo($limit, 'LIMIT');
        $offset = Util::verificaCampo($offset, 'OFFSET');

        $select = $this->getSelect();

        $txtSql = "SELECT $select FROM {$this->_table} WHERE ((excluido IS NULL) OR (excluido = 0)) $condicao $order $limit $offset";

        try {
            $sql = $this->conexao->getConexao()->prepare($txtSql);
            $this->conexao->setParametros($sql, $parametros);
            $sql->execute();
        } catch (PDOException $ex) {
            throw new BancoExcecao($ex->getMessage(), $txtSql, __FILE__, __CLASS__, __METHOD__, __LINE__);
        }

        $resultado = $sql->fetchAll(PDO::FETCH_ASSOC);
        $sql->closeCursor();

        if (!$resultado) {
            return null;
        }

        foreach ($resultado as $res) {
            $arrObjeto[] = $this->classObject($res);
        }

        return $arrObjeto;
    }

    /**
     * Método para buscar.
     *
     * @param  int $id
     * @return object
     */
    public function buscar($id = 0)
    {
        $select = $this->getSelect();

        $txtSql = "SELECT $select FROM {$this->_table} WHERE ((excluido IS NULL) OR (excluido = 0)) AND id = :id";

        try {
            $sql = $this->conexao->getConexao()->prepare($txtSql);
            $sql->bindValue(':id', $id, PDO::PARAM_INT);
            $sql->execute();
        } catch (PDOException $ex) {
            throw new BancoExcecao($ex->getMessage(), $txtSql, __FILE__, __CLASS__, __METHOD__, __LINE__);
        }

        $resultado = $sql->fetch(PDO::FETCH_ASSOC);
        $sql->closeCursor();

        return !$resultado ? null : $this->classObject($resultado);
    }


    /**
     * Método para verificar se o slug existe.
     *
     * @param  string  $slug
     * @param  int $id
     * @return string
     */
    public function checaSlug($slug = '', $id = 0)
    {
        $param = array();
        $where = '';

        $param[] = Util::montaParametros(':slug', $slug, 'STR');
        $where .= 'slug = :slug';

        if ($id > 0) {
            $param[] = Util::montaParametros(':id', $id, 'STR');
            $where .= ' AND id NOT IN (:id)';
        }

        $contador = self::contador($where, $param);

        return $contador;
    }

    /**
     * Método para gerar o slug.
     *
     * @param  string  $slug
     * @param  int $id
     * @return string
     */
    public function geraSlug($slug = '', $id = 0)
    {
        $slug = Util::slugify($slug);

        do {
            $result = self::checaSlug($slug, $id);

            $explode = explode('-', $slug);
            $end = end($explode);

            $slugNumber = is_numeric($end) ? $end : $result;

            $slug = ($result > 0) ? str_replace('-' . $slugNumber, '', $slug) . '-' . ($slugNumber + 1) : $slug;
        } while ($result > 0);

        return $slug;
    }

    /**
     * Método para buscar.
     *
     * @param  int $id
     * @return object
     */
    public function buscarPorTipo($id = 0, $tipo = '')
    {
        $select = $this->getSelect();

        $txtSql = "SELECT $select FROM {$this->_table} WHERE ((excluido IS NULL) OR (excluido = 0)) AND id = :id ";

        try {
            $sql = $this->conexao->getConexao()->prepare($txtSql);
            $sql->bindValue(':id', $id, PDO::PARAM_INT);
            $sql->execute();
        } catch (PDOException $ex) {
            throw new BancoExcecao($ex->getMessage(), $txtSql, __FILE__, __CLASS__, __METHOD__, __LINE__);
        }

        $resultado = $sql->fetch(PDO::FETCH_ASSOC);
        $sql->closeCursor();

        return !$resultado ? null : $this->classObject($resultado);
    }

    /**
     * Método para mudar o status.
     *
     * @param  int $id
     */
    public function mudaStatus($id = 0)
    {
        $txtSql = "SELECT ativo FROM {$this->_table} WHERE id = :id;
                UPDATE {$this->_table} SET ativo = (ativo ^ 1), atualizado_em = NOW() WHERE id = :id";

        try {
            $sql = $this->conexao->getConexao()->prepare($txtSql);
            $sql->bindValue(':id', $id, PDO::PARAM_INT);
            $sql->execute();
        } catch (PDOException $ex) {
            throw new BancoExcecao($ex->getMessage(), $txtSql, __FILE__, __CLASS__, __METHOD__, __LINE__);
        }

        $resultado = $sql->fetchColumn();
        $sql->closeCursor();

        return (int) !$resultado;
    }

    /**
     * Método para listar no select
     *
     * @param  boolean $inicio
     * @return array
     */
    public function arraySelect($inicio = false)
    {
        $retorno = ($inicio) ? array(array('Selecionar')) : array();
        $where = '';
        $resultado = self::listar($where);

        foreach ($resultado as $result) {
            $retorno[] = array($result->id => $result->nome);
        }

        return $retorno;
    }

    

    /**
     * Objeto da classe.
     *
     * @param  array  $resultado
     * @return object
     */
    private function classObject($resultado = array())
    {
        $obj = null;
        $obj = new ImagemArq();

        isset($resultado['id']) ? $obj->id = $resultado['id'] : '';
        isset($resultado['imagem']) ? $obj->imagem = $resultado['imagem'] : '';
        isset($resultado['arquiteto']) ? $obj->arquiteto = $resultado['arquiteto'] : '';
        isset($resultado['criado_em']) ? $obj->criadoem = $resultado['criado_em'] : '';

        return $obj;
    }
}
