<?php

/**
 * AdminArtigo.class [TIPO]
 * Responsável por gerenciar os artigos no admin do sistema!
 * 
 * @copyright (c) 2017, Welton Thierree TagPage
 */
class AdminArtigo {

    private $Data;
    private $Artigo;
    private $Error;
    private $Result;

    //Nome da tabela no banco de dados
    const Entidy = 'tp_artigos';

    public function ExeCreate(array $Data) {
        $this->Data = $Data;

        if (in_array('', $this->Data)):
            $this->Error = ["Erro ao cadastrar: Para criar um artigo, favor preencha todos os campos!", WS_ALERT];
            $this->Result = false;
        else:
            $this->setData();
            $this->setName();
            $this->Create();

//            if ($this->Data['artigo_imagem']):
//                $upload = new Upload;
//                $upload->Image($this->Data['artigo_imagem'], $this->Data['artigo_nome']);
//            endif;
//
//            if (isset($upload) && $upload->getResult()):
//                $this->Data['artigo_imagem'] = $upload->getResult();
//                $this->Create();
//            else:
//                $this->Data['artigo_imagem'] = null;
//                $this->Create();
//            endif;
        endif;
    }

    public function ExeUpdate($ArtigoId, array $Data) {
        $this->Artigo = (int) $ArtigoId;
        $this->Data = $Data;

        if (in_array('', $this->Data)):
            $this->Error = ["Para atualizar este artigo, preencha todos os campos (Capa não precisa ser enviada)", WS_ALERT];
            $this->Result = false;
        else:
            $this->setData();
            $this->setName();

//            if (is_array($this->Data['artigo_imagem'])):
//                $readCapa = new Read;
//                $readCapa->ExeRead(self::Entidy, "WHERE artigo_id = :artigo", "artigo={$this->Artigo}");
//                $capa = '../uploads/' . $readCapa->getResult()[0]['artigo_imagem'];
//
//                if (file_exists($capa) && !is_dir($capa)):
//                    unlink($capa);
//                endif;
//
//                $uploadCapa = new Upload;
//                $uploadCapa->Image($this->Data['artigo_imagem'], $this->Data['artigo_nome']);
//            endif;

            if (isset($uploadCapa) && $uploadCapa->getResult()):
                $this->Data['artigo_imagem'] = $uploadCapa->getResult();
                $this->Update();
            else:
                unset($this->Data['artigo_imagem']);
                $this->Update();
            endif;

        endif;
    }

    public function ExeDelete($ArtigoId) {
        $this->Artigo = (int) $ArtigoId;
        $ReadArtigo = new Read;
        $ReadArtigo->ExeRead(self::Entidy, "WHERE artigo_id = :id", "id={$this->Artigo}");

        if (!$ReadArtigo->getResult()):
            $this->Error = ["O artigo que você tentou deletar não existe no sistema!", WS_ERROR];
            $this->Result = false;
        else:
            $ArtigoDelete = $ReadArtigo->getResult()[0];
            if (file_exists('../uploads/' . $ArtigoDelete['artigo_imagem']) && !is_dir('../uploads/' . $ArtigoDelete['artigo_imagem'])):
                unlink('../uploads/' . $ArtigoDelete['artigo_imagem']);
            endif;

//            $readGallery = new Read;
//            $readGallery->ExeRead("ws_artigos_gallery", "WHERE artigo_id = :id", "id={$this->Artigo}");
//            if ($readGallery->getResult()):
//                foreach ($readGallery->getResult() as $gbdel):
//                    if (file_exists('../uploads/' . $gbdel['gallery_image']) && !is_dir('../uploads/' . $gbdel['gallery_image'])):
//                        unlink('../uploads/' . $gbdel['gallery_image']);
//                    endif;
//                endforeach;
//            endif;

            $deleta = new Delete;
//            $deleta->ExeDelete("ws_artigos_gallery", "WHERE artigo_id = :gbartigo", "gbartigo={$this->Artigo}");
            $deleta->ExeDelete(self::Entidy, "WHERE artigo_id = :artigoid", "artigoid={$this->Artigo}");

            $this->Error = ["O artigo <b>{$ArtigoDelete['artigo_titulo']}</b> foi removido do sistema!", WS_ACCEPT];
        endif;
    }

    public function ExeStatus($ArtigoId, $ArtigoStatus) {
        $this->Artigo = (int) $ArtigoId;
        $this->Data['artigo_status'] = (string) $ArtigoStatus;

        $Update = new Update;
        $Update->ExeUpdate(self::Entidy, $this->Data, "WHERE artigo_id = :id", "id={$this->Artigo}");
    }

    public function gbSend(array $Images, $ArtigoId) {
        $this->Artigo = (int) $ArtigoId;
        $this->Data = $Images;

        $ImageName = new Read;
        $ImageName->ExeRead(self::Entidy, "WHERE artigo_id = :id", "id={$this->Artigo}");
        if (!$ImageName->getResult()):
            $this->Error = ["Erro ao enviar galeria. O índice {$this->Artigo} não foi encontrado no banco!", WS_ERROR];
            $this->Result = false;
        else:
            $ImageName = $ImageName->getResult()[0]['artigo_nome'];

            $gbFiles = array();
            $gbCount = count($this->Data['tmp_nome']);
            $gbKeys = array_keys($this->Data);

            for ($gb = 0; $gb < $gbCount; $gb++):
                foreach ($gbKeys as $Keys):
                    $gbFiles[$gb][$Keys] = $this->Data[$Keys][$gb];
                endforeach;
            endfor;

            $gbSend = new Upload;
            $i = 0;
            $u = 0;

            foreach ($gbFiles as $gbUpload):
                $i++;
                $ImageName = "{$ImageName}-gb-{$this->Artigo}-" . (substr(md5(time() + $i), 0, 5));
                $gbSend->Image($gbUpload, $ImageName);

                if ($gbSend->getResult()):
                    $gbImage = $gbSend->getResult();
                    $gbCreate = ['artigo_id' => $this->Artigo, "gallery_image" => $gbImage, "gallery_date" => date("Y-m-d H:i:s")];
                    $insertGb = new Create;
                    $insertGb->ExeCreate("ws_artigos_gallery", $gbCreate);
                    $u++;
                endif;
            endforeach;

            if ($u > 1):
                $this->Error = ["Galeria Atualizada: Foram enviadas {$u} imagens para galeria deste artigo!", WS_ACCEPT];
                $this->Result = true;
            endif;

        endif;
    }

    public function gbRemove($GbImageId) {
        $this->Artigo = (int) $GbImageId;
        $readGb = new Read;
        $readGb->ExeRead("ws_artigos_gallery", "WHERE gallery_id = :gb", "gb={$this->Artigo}");
        if ($readGb->getResult()):
            $Imagem = '../uploads/' . $readGb->getResult()[0]['gallery_image'];

            if (file_exists($Imagem) && !is_dir($Imagem)):
                unlink($Imagem);
            endif;

            $Deleta = new Delete;
            $Deleta->ExeDelete("ws_artigos_gallery", "WHERE gallery_id = :id", "id={$this->Artigo}");
            if ($Deleta->getResult()):
                $this->Error = ["A imagem foi removida com sucesso da galeria! ", WS_ACCEPT];
                $this->Result = true;

            endif;
        endif;
    }

    function getResult() {
        return $this->Result;
    }

    function getError() {
        return $this->Error;
    }

    //PRIVATE
    private function setData() {
//        $Cover = $this->Data['artigo_imagem'];
        $Content = $this->Data['artigo_conteudo'];
        unset($this->Data['artigo_imagem'], $this->Data['artigo_conteudo']);

        $this->Data = array_map('strip_tags', $this->Data);
        $this->Data = array_map('trim', $this->Data);

        $this->Data['artigo_nome'] = Check::Name($this->Data['artigo_titulo']);
//        $this->Data['artigo_data'] = Check::Data($this->Data['artigo_data']);
        $this->Data['artigo_data'] = date('Y-m-d H:i:s');
        $this->Data['artigo_autor'] = $_SESSION['userlogin']['usuario_id'];
//        $this->Data['artigo_imagem'] = $Cover;
        $this->Data['artigo_conteudo'] = $Content;
        $this->Data['artigo_cat_parent'] = $this->getCatParent();
    }

    private function getCatParent() {
        $rCat = new Read;
        $rCat->ExeRead("tp_categorias", "WHERE categoria_id = :id", "id={$this->Data['artigo_categoria']}");
        if ($rCat->getResult()):
            return $rCat->getResult()[0]['categoria_parent'];
        else:
            return null;
        endif;
    }

    private function setName() {
        $where = (isset($this->Artigo) ? "artigo_id != {$this->Artigo} AND" : '');

        $readName = new Read;
        $readName->ExeRead(self::Entidy, "WHERE {$where} artigo_titulo = :t", "t={$this->Data['artigo_titulo']}");
        if ($readName->getResult()):
            $this->Data['artigo_nome'] = $this->Data['artigo_nome'] . '-' . $readName->getRowCount();
        endif;
    }

    private function Create() {
        $cadastra = new Create;
        $cadastra->ExeCreate(self::Entidy, $this->Data);
        if ($cadastra->getResult()):
            $this->Error = ["O artigo <b>{$this->Data['artigo_titulo']}</b> foi cadastrado com sucesso no sistema!", WS_ACCEPT];
            $this->Result = $cadastra->getResult();
        else:
            $this->Error = ["Erro no cadastro", WS_ERROR];
            $this->Result = false;            
        endif;
    }

    private function Update() {
        $Update = new Update;
        $Update->ExeUpdate(self::Entidy, $this->Data, "WHERE artigo_id = :id", "id={$this->Artigo}");
        if ($Update->getResult()):
            $this->Error = ["O artigo <b>{$this->Data['artigo_titulo']}</b> foi atualizado com sucesso no sistema!", WS_ACCEPT];
            $this->Result = true;
        endif;
    }

}
