<?php

/**
 * AdminDepartamento.class [ MODEL ADMIN ]
 * Responsável por gerenciar as departamentos do sistema no admin!
 * 
 * @copyright (c) 2017, Welton Thierree TagPage
 */
class AdminDepartamento {

    private $Data;
    private $DepId;
    private $Error;
    private $Result;

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

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

        if (in_array('', $this->Data)):
            $this->Result = false;
            $this->Error = ['<b>Erro ao cadastrar</b> Para cadastrar um departamento, preencha todos os campos', WS_ALERT];
        else:
            $this->setData();
            $this->setName();
            $this->Create();
        endif;
    }

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

        if (in_array('', $this->Data)):
            $this->Result = false;
            $this->Error = ["<b>Erro ao atualizar</b> Para cadastrar a departamento {$this->Data['departamento_titulo']}, preencha todos os campos", WS_ALERT];
        else:
            $this->setData();
            $this->setName();
            $this->Update();
        endif;
    }

    public function ExeDelete($departamentoId) {
        $this->DepId = (int) $departamentoId;

        $read = new Read;
        $read->ExeRead(self::Entidy, "WHERE departamento_id = :delid", "delid={$this->DepId}");

        if (!$read->getResult()):
            $this->Result = false;
            $this->Error = ['Oppss, você tentou remover uma departamento que não existe no sistema!', WS_INFOR];
        else:
            extract($read->getResult()[0]);
            if (!$departamento_parente && !$this->checkDeps()):
                $this->Result = false;
                $this->Error = ["A <b>seção {$departamento_titulo}</b> possui departamentos cadastradas. Para deletar, antes altere ou remova as departamentos filhas!", WS_ALERT];
            elseif ($departamento_parente && !$this->checkProdutos()):
                $this->Result = false;
                $this->Error = ["A <b>departamento {$departamento_titulo}</b> possui produtos cadastrados. para deletar, antes altere ou remova os produtos!", WS_ALERT];
            else:
                $delete = new Delete;
                $delete->ExeDelete(self::Entidy, "WHERE departamento_id = :deletaid", "deletaid={$this->DepId}");
                
                $tipo = (empty($departamento_parente) ? 'seção' : 'departamento');
                $this->Result = true;
                $this->Error = ["A <b>{$tipo} {$departamento_titulo}</b> foi removida com sucesso!", WS_ACCEPT];
            endif;
        endif;
    }

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

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

    //PRIVATES
    private function setData() {
        $this->Data = array_map('strip_tags', $this->Data);
        $this->Data = array_map('trim', $this->Data);
        $this->Data['departamento_nome'] = Check::Name($this->Data['departamento_titulo']);
        //$this->Data['departamento_data'] = Check::Data($this->Data['departamento_date']);
        $this->Data['departamento_parente'] = ($this->Data['departamento_parente'] == 'null' ? null : $this->Data['departamento_parente']);
    }

    private function setName() {
        $Where = (!empty($this->DepId) ? "departamento_id != {$this->DepId} AND" : '');

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

    private function checkDeps() {
        $readSes = new Read;
        $readSes->ExeRead(self::Entidy, "WHERE departamento_parente = :parente", "parente={$this->DepId}");
        if ($readSes->getResult()):
            return false;
        else:
            return true;
        endif;
    }

    private function checkProdutos() {
        $readPost = new Read;
        $readPost->ExeRead("tp_produtos_departamentos", "WHERE departamento_id = :departamento", "departamento={$this->DepId}");
        if ($readPost->getResult()):
            return false;
        else:
            return true;
        endif;
    }

    private function Create() {
        $Create = new Create;
        $Create->ExeCreate(self::Entidy, $this->Data);
        if ($Create->getResult()):
            $this->Result = $Create->getResult();
            $this->Error = ["<b>Sucesso:</b> O departamento {$this->Data['departamento_titulo']} foi cadastrado no sistema", WS_ACCEPT];
        endif;
    }

    private function Update() {
        $Update = new Update;
        $Update->ExeUpdate(self::Entidy, $this->Data, "WHERE departamento_id = :catid", "catid={$this->DepId}");
        if ($Update->getResult()):
            $tipo = (empty($this->Data['departamento_parente']) ? 'seção' : 'departamento');
            $this->Result = true;
            $this->Error = ["<b>Sucesso:</b> A {$tipo} {$this->Data['departamento_titulo']} foi atualizada no sistema", WS_ACCEPT];
        endif;
    }

}
