MOON
Server: Apache
System: Linux server1.studioinfinity.com.br 2.6.32-954.3.5.lve1.4.90.el6.x86_64 #1 SMP Tue Feb 21 12:26:30 UTC 2023 x86_64
User: artinside (517)
PHP: 7.4.33
Disabled: exec,passthru,shell_exec,system
Upload Files
File: //home/artinside/sites.artinside.com.br/mainpro/sourcebackup/App/Web.php
<?php

namespace Source\App;

use Anam\Phpcart\Cart;
use FlyingLuscas\ViaCEP\ViaCEP;
use Source\Core\Controller;
use Source\Core\Session;
use Source\Core\View;
use Source\Models\Address;
use Source\Models\Auth;
use Source\Models\Batch;
use Source\Models\Category;
use Source\Models\Company;
use Source\Models\Config;
use Source\Models\Ecommerce\CreditCard;
use Source\Models\Ecommerce\OrderItens;
use Source\Models\Ecommerce\Orders;
use Source\Models\Ecommerce\Product;
use Source\Models\Ecommerce\ProductVariations;
use Source\Models\Files;
use Source\Models\Gallery;
use Source\Models\Newsletter;
use Source\Models\Post;
use Source\Models\Report\Access;
use Source\Models\Report\Online;
use Source\Models\Service;
use Source\Models\User;
use Source\Support\Email;
use Source\Support\Frete;
use Source\Support\Pager;

/**
 * Web Controller
 * @package Source\App
 */
class Web extends Controller
{
    /** @var User */
    private $user;
    /**
     * Web constructor.
     */
    public function __construct($router)
    {
        parent::__construct(__DIR__ . "/../../themes/" . CONF_VIEW_THEME . "/");
        (new Access())->report();
        (new Online())->report();
        $this->view->addData("router", $router);
        $Config = (new Config())->findById(1);
        $company = (new Company())->findById(1);
        $this->view->addData("company", true);
        if($Config->data()->maintenance == 1){
            if (!Auth::user() OR !Auth::userLevel(Auth::user(), 5)){
                get_url(1) != "manutencao" ? redirect("manutencao") : null;
            }else{
                $this->view->addData("maintenance", true);
            }
        }
    }

    /**
     * SITE HOME
     */
    public function home(): void
    {
        $head = $this->seo->render(
            CONF_SITE_NAME . " - " . CONF_SITE_TITLE,
            CONF_SITE_DESC,
            url(),
            theme("/assets/images/sharer.jpg")
        );
        echo $this->view->render("home", [
            "head" => $head,
            "video" => "lDZGl9Wdc7Y",
            "categories" => (new Category())
                ->find()
                ->offset(1)
                ->limit(2)
                ->fetch(true),
            "posts" => (new Post())
                ->findPost()
                ->limit(3)
                ->order("post_at DESC")
                ->fetch(true),
            "services" => (new Service())
                ->find()
                ->limit(4)
                ->order("post_at DESC")
                ->fetch(true),
            "company" => (new Company())->findById(1),

        ]);
    }

    /**
     * SITE SERVICES
     * @param array|null $data
     */
    public function services(?array $data): void
    {
        $head = $this->seo->render(
            "Nossos Serviços - " . CONF_SITE_NAME,
            "Confira os serviços de Administração de Condomínios que a Neocond oferece para você",
            url("/services"),
            theme("/assets/images/share.jpg")
        );

        $services = (new Service())->find();
        $pager = new Pager(url("/servicos/p/"));
        $pager->pager($services->count(), 12, ($data['page'] ?? 1));

        echo $this->view->render("services", [
            "head" => $head,
            "services" => $services->order("title ASC")->limit($pager->limit())->offset($pager->offset())->fetch(true),
            "pageTitle" => (object)[
                "title" => "Nossos Serviços",
                "subtitle" => "Conheça nossos Serviços",
                "image" => url("images/slide-bg.jpg"),

            ],
            "breadcrumb" => (object)[
                ["Serviços", "#"]
            ],
            "paginator" => $pager->render()
        ]);
    }


    /**
     * SITE PRODUCT SINGLE
     */
    public function service(array $data): void
    {
        $service = (new Service())->findByUri($data["uri"]);
        if (!$service) {
            redirect("/404");
        }

        $service->views += 1;
        $service->save();

        $head = $this->seo->render(
            "{$service->title} - " . CONF_SITE_NAME,
            $service->title,
            url("/servicos/{$service->uri}"),
            ($service->cover ? image($service->cover, 1200, 628) : theme("/assets/images/share.jpg"))
        );

        echo $this->view->render("service", [
            "head" => $head,
            "service" => $service,
            "pageTitle" => (object)[
                "title" => "$service->title",
                "subtitle" => "Nossos Serviços",
                "image" => url("images/slide-bg.jpg"),
            ],
            "breadcrumb" => (object)[
                [$service->title]]
        ]);
    }

    /**
     *
     */
    public function maintenance():void
    {
        echo $this->view->render("maintenance", []);
    }

    /**
     *
     */
    public function atuacao():void
    {
        $head = $this->seo->render(
            "SH Wrapping - " . CONF_SITE_NAME . " - " . CONF_SITE_DESC,
            CONF_SITE_DESC,
            url("/atuacao"),
            theme("/assets/images/sharer.jpg")
        );

        echo $this->view->render("atuacao", [
            "head" => $head,
            "pageTitle" => (object)[
                "title" => "Atuação",
                "subtitle" => "Especializada em Direito empresarial",
                "image" => url("images/slide-bg.jpg"),

            ]
        ]);
    }



    /**
     *
     */
    public function lp1():void
    {
        echo $this->view->render("lp1", []);
    }
    /**
     *
     */
    public function typ1():void
    {
        echo $this->view->render("typ1", []);
    }


    /**
     * SITE HOME
     */
    public function lp4ever(): void
    {

        $head = $this->seo->render(
            CONF_SITE_NAME . " - " . CONF_SITE_TITLE,
            CONF_SITE_DESC,
            url(),
            theme("/assets/images/sharer.jpg")
        );
        echo $this->view->render("lp4ever", [
            "head" => $head,
            "video" => "lDZGl9Wdc7Y",
            "categories" => (new Category())
                ->find()
                ->offset(1)
                ->limit(2)
                ->fetch(true),
            "posts" => (new Post())
                ->findPost()
                ->limit(3)
                ->order("post_at DESC")
                ->fetch(true)
        ]);
    }



    /**
     * SITE ABOUT
     */
    public function about(): void
    {

        $company = (new Company())->findById(1);

        $head = $this->seo->render(
            "Sobre a " . CONF_SITE_NAME . " - " . CONF_SITE_DESC,
            CONF_SITE_DESC,
            url("/sobre"),
            theme("/assets/images/sharer.jpg")
        );

        echo $this->view->render("about", [
            "head" => $head,
            "company" => $company,
            "pageTitle" => (object)[
                "title" => "À PROPOS ",
                "subtitle" => "",
                "image" => url("images/slide-bg.jpg"),

            ],"breadcrumb" => (object)[
                ["A ".CONF_SITE_NAME, "#"]
            ]
        ]);
    }

    /**
     * SITE SH WRAPPING
     */
    public function shWrapping(): void
    {

        $head = $this->seo->render(
            "SH Wrapping - " . CONF_SITE_NAME . " - " . CONF_SITE_DESC,
            CONF_SITE_DESC,
            url("/sh-wrapping"),
            theme("/assets/images/sharer.jpg")
        );

        echo $this->view->render("sh-wrapping", [
            "head" => $head,
            "pageTitle" => (object)[
                "title" => "SH Wrapping",
                "subtitle" => "Conserve a pintura original do seu veículo",
                "image" => url("images/sh-wrapping.jpg"),

            ]
        ]);
    }


    /**
     * SITE Nar PPF
     */
    public function narPPF(): void
    {

        $head = $this->seo->render(
            "NAR PPF - " . CONF_SITE_NAME . " - " . CONF_SITE_DESC,
            CONF_SITE_DESC,
            url("/nar-ppf"),
            theme("/assets/images/sharer.jpg")
        );

        echo $this->view->render("nar-ppf", [
            "head" => $head,
            "pageTitle" => (object)[
                "title" => "NAR PPF",
                "subtitle" => "Desenvolvido para proteger",
                "image" => url("images/nar-ppf.jpg"),

            ]
        ]);
    }

    /**
     * SITE SH Decor
     */
    public function shDecor(): void
    {

        $head = $this->seo->render(
            "shdecor - " . CONF_SITE_NAME . " - " . CONF_SITE_DESC,
            CONF_SITE_DESC,
            url("/sh-decor"),
            theme("/assets/images/sharer.jpg")
        );

        echo $this->view->render("sh-decor", [
            "head" => $head,
            "pageTitle" => (object)[
                "title" => "shdecor",
                "subtitle" => "Revestimento autoadesivo decorativo",
                "image" => url("images/shdecor.jpg"),

            ]
        ]);
    }

    /**
     * SITE ABOUT
     */
    public function batch(array $data): void
    {

       if($data){
           $data = filter_var_array($data, FILTER_SANITIZE_STRIPPED);
            $Batch = new Batch();
            $b = $Batch->find("batch_number = :b", "b={$data["batch_number"]}")->fetch();
            if($Batch->count()){
                $json["callback"] = $this->view->render("views/valid", ["data"=>$b]);
                $json["target"] = ".ajax_fragment";
                echo json_encode($json);
                return;
            }
            else{
                $json['message'] = $this->message->warning("Número de lote não encontrado, favor entrar em contato com nossa equipe")->render();
                $json["target"] = ".ajax_fragment";
                $json["clear"] = true;
                echo json_encode($json);
                return;
            }
       }

        $head = $this->seo->render(
            "Pesquisa de Lote " . CONF_SITE_NAME . " - " . CONF_SITE_DESC,
            CONF_SITE_DESC,
            url("/lote"),
            theme("/assets/images/sharer.jpg")
        );

        echo $this->view->render("batch", [
            "head" => $head,
            "pageTitle" => (object)[
                "title" => "Consulta de Lote de Produtos",
                "subtitle" => "Veja a validade através do número do lote",
            ],"breadcrumb" => (object)[
                ["A ".CONF_SITE_NAME, "#"]
            ]
        ]);
    }


    /**
     * SITE Time
     */
    public function experiences(): void
    {

        $head = $this->seo->render(
            "ÉXPERIENCES " . CONF_SITE_NAME . " - " . CONF_SITE_DESC,
            CONF_SITE_DESC,
            url("/experiences"),
            theme("/assets/images/sharer.jpg")
        );

        echo $this->view->render("experiences", [
            "head" => $head,
            "pageTitle" => (object)[
                "title" => "Expériences",
                "subtitle" => "Vivez l’expérience Ultime ",
                "image" => url("images/slide-bg.jpg"),

            ],
//            "team" => (new User())->find("team = 'on'")->order("created_at ASC")->fetch(true)
        ]);
    }

    /**
     * SITE Time
     */
    public function teams1(): void
    {

        $head = $this->seo->render(
            "Nome da Advogada 1 " . CONF_SITE_NAME . " - " . CONF_SITE_DESC,
            CONF_SITE_DESC,
            url("/team"),
            theme("/assets/images/sharer.jpg")
        );

        echo $this->view->render("team-s1", [
            "head" => $head,
            "pageTitle" => (object)[
                "title" => "Nome da Advogada 1 ",
                "subtitle" => "Profissionais " . CONF_SITE_NAME,
                "image" => url("images/slide-bg.jpg"),

            ],
//            "team" => (new User())->find("team = 'on'")->order("created_at ASC")->fetch(true)
        ]);
    }

    /**
     * SITE Time
     */
    public function teams2(): void
    {

        $head = $this->seo->render(
            "Nome da Advogada 2 " . CONF_SITE_NAME . " - " . CONF_SITE_DESC,
            CONF_SITE_DESC,
            url("/team"),
            theme("/assets/images/sharer.jpg")
        );

        echo $this->view->render("team-s2", [
            "head" => $head,
            "pageTitle" => (object)[
                "title" => "Nome da Advogada 2 ",
                "subtitle" => "Profissionais " . CONF_SITE_NAME,
                "image" => url("images/slide-bg.jpg"),

            ],
//            "team" => (new User())->find("team = 'on'")->order("created_at ASC")->fetch(true)
        ]);
    }


    /**
     *CONTACT PAGE SITE
     */
    public function contact(): void
    {
        $head = $this->seo->render(
            "Contato " . CONF_SITE_NAME . " - " . CONF_SITE_DESC,
            CONF_SITE_DESC,
            url("/contato"),
            theme("/assets/images/sharer.jpg")
        );

        echo $this->view->render("contact", [
            "head" => $head,
            "pageTitle" => (object)[
                "title" => "Fale Conosco",
                "subtitle" => CONF_SITE_NAME,
                "image" => url("images/slide-bg.jpg"),
            ],"breadcrumb" => (object)[
                ["Contact", "#"]
            ]
        ]);
    }

    /**
     *Form de Contato do site
     */
    public function contactForm(array $data): void
    {
        if(isset($data)){


            $data = filter_var_array($data, FILTER_SANITIZE_STRIPPED);
//            if (request_limit("weblogin", 5, 60 * 3)) {
//                $json['message'] = $this->message->error("Você já efetuou 5 tentativas, esse é o limite. Por favor, aguarde 3 minutos para tentar novamente!")->render();
//                echo json_encode($json);
//                return;
//            }


            if ((!isset($data["action"])) AND (empty($data['email']) || empty($data['name']) || empty($data['message']) || empty($data['phone']))) {
                $json['message'] = $this->message->warning("Campos com * são de preenchimento obrigatório")->render();
                echo json_encode($json);
                return;
            }

//
//            if ((isset($data["action"]) AND $data["action"] == "orcamento") AND (empty($data['email']) || empty($data['name']) || empty($data['phone']))) {
//                $json['message'] = $this->message->warning("Campos com * são de preenchimento obrigatório")->render();
//                echo json_encode($json);
//                return;
//            }

            $contact = new \stdClass();
            $contact->name = $data["name"];
            $contact->email = $data["email"];
            $contact->phone = $data["phone"];
            $contact->subject = $data["subject"];
//            $contact->product = $data["product"] ? $data["product"] : "";
            $contact->message = $data["message"];
            $template = "contact";

//            if(isset($data["action"]) AND $data["action"] == "orcamento"){
//                $template = "orcamento";
//            }

            $view = new View(__DIR__ . "/../../shared/views/email");
            $message = $view->render($template, [
                "contact" => $contact
            ]);

            (new Email())->bootstrap(
                "Email do site " . CONF_SITE_NAME . " [{$contact->subject}]",
                $message,
                CONF_EMAIL, $contact->name
            )->send($contact->email, $contact->name);

//            $newsletter = (new Newsletter())->findByEmail($data["email"]);
//
//            if(!$newsletter){
//                $newsCreate = new Newsletter();
//                $newsCreate->email = $data["email"];
//                $newsCreate->origin = "Orçamento";
//                $newsCreate->save();
//            }


            $json['message'] = $this->message->success("Solicitação efetuada com sucesso")->render();
            $json['modal'] = true;
            $json['reset'] = true;
            echo json_encode($json);
            return;

        }

        $json['message'] = $this->message->error("Erro ao enviar, favor entrar em contato com nosso suporte")->render();
        echo json_encode($json);
        return;


    }

    /**
     *Form de Contato do site
     */
    public function contact4ever(array $data): void
    {
        if(isset($data)){

            $data = filter_var_array($data, FILTER_SANITIZE_STRIPPED);
            if (request_limit("weblogin", 5, 60 * 3)) {
                $json['message'] = $this->message->error("Você já efetuou 5 tentativas, esse é o limite. Por favor, aguarde 3 minutos para tentar novamente!")->render();
                echo json_encode($json);
                return;
            }


            if ((!isset($data["action"])) AND (empty($data['email']) || empty($data['name']) || empty($data['message']) || empty($data['phone']))) {
                $json['message'] = $this->message->warning("Campos com * são de preenchimento obrigatório")->render();
                echo json_encode($json);
                return;
            }

            $contact = new \stdClass();
            $contact->name = $data["name"];
            $contact->email = $data["email"];
            $contact->phone = $data["phone"];
            $contact->subject = $data["subject"];
            $contact->product = $data["product"];


            $view = new View(__DIR__ . "/../../shared/views/email");
            $message = $view->render("4ever", [
                "contact" => $contact
            ]);

            (new Email())->bootstrap(
                "Email do site " . CONF_SITE_NAME . " [{$contact->subject}]",
                $message,
                CONF_EMAIL, $contact->name
            )->send($contact->email, $contact->name);

            $newsletter = (new Newsletter())->findByEmail($data["email"]);

            if(!$newsletter){
                $newsCreate = new Newsletter();
                $newsCreate->email = $data["email"];
                $newsCreate->origin = "Orçamento";
                $newsCreate->save();
            }


            $json['message'] = $this->message->success("Solicitação efetuada com sucesso")->render();
            $json['modal'] = true;
            $json['reset'] = true;
            echo json_encode($json);
            return;

        }

        $json['message'] = $this->message->error("Erro ao enviar, favor entrar em contato com nosso suporte")->render();
        echo json_encode($json);
        return;


    }

    /**
     * SITE PRODUCT SINGLE
     */
    public function allProducts(array $data): void
    {

        $data = filter_var_array($data, FILTER_SANITIZE_STRIPPED);

        $head = $this->seo->render(
            "Orafol - " . CONF_SITE_NAME . " - " . CONF_SITE_DESC,
            CONF_SITE_DESC,
            url("/products"),
            theme("/assets/images/sharer.jpg")
        );

        echo $this->view->render("products", [
            "head" => $head,
            "pageTitle" => (object)[
                "title" => "Orafol",
                "subtitle" => "tradição e confiabilidade em todos os seus produtos",
                "image" => url("/images/orafol.jpg")
            ],
            "products" => (new Product())->findProduct("type = 'product'")->order("id ASC")->fetch(true),
        ]);
    }

    /**
     * SITE PRODUCT SINGLE
     */
    public function products(array $data): void
    {
        $data = filter_var_array($data, FILTER_SANITIZE_STRIPPED);

        $head = $this->seo->render(
            "Máquinas " . CONF_SITE_NAME . " - " . CONF_SITE_DESC,
            CONF_SITE_DESC,
            url("/products"),
            theme("/assets/images/sharer.jpg")
        );

        switch ($data["category"]):
            case 1:
                $title = "Impressoras Sublimáticas";
                break;
            case 2:
                $title = "Impressoras Solventes";
                break;
            default:
                $title = "Erro ao selecionar";

         endswitch;

                echo $this->view->render("products", [
            "head" => $head,
            "pageTitle" => (object)[
                "title" => "Nossas Máquinas",
                "subtitle" => $title,
                "breadcrumb" => ""
            ],
            "products" => (new Product())->findProduct("type = 'product' AND category = :category", "category={$data["category"]}")->order("post_at DESC")->fetch(true),
            "category" => $title
        ]);
    }


    /**
     * SITE PRODUCT SINGLE
     */
    public function product(array $data): void
    {

        $product = (new Product())->findByUri($data["uri"]);
        if (!$product) {
            redirect("/404");
        }

        $product->views += 1;
        $product->save();

        $head = $this->seo->render(
            "{$product->title} - " . CONF_SITE_NAME,
            $product->title,
            url("/produto/maquinas/{$product->uri}"),
            ($product->cover ? image($product->cover, 1200, 628) : theme("/assets/images/sharer.jpg"))
        );

        echo $this->view->render("product", [
            "head" => $head,
            "product" => $product,
            "pageTitle" => (object)["subtitle"=>$product->subtitle, "title"=>$product->title, "breadcrumb" => "", "image" => url("/images/slide-bg.jpg")
            ],
            "gallery" => (new Gallery())
                ->find("gallery_link = :g", "g={$product->gallery_link}")
                ->fetch(true),
            "related" => (new Product())->findProduct("type = 'product' AND id != :i", "i={$product->id}")
                ->order("post_at DESC")
                ->limit(6)
                ->fetch(true),
            "variations" => (new ProductVariations())->find("product_id = :pid", "pid={$product->gallery_link}")->fetch(true),
            "files"=> (new Files())->find("unique_id = :uid", "uid={$product->gallery_link}")->fetch(true)
        ]);
    }

    /**
     * SITE Tintas SINGLE
     */
    public function inks(): void
    {

        $head = $this->seo->render(
            "Serviços " . CONF_SITE_NAME . " - " . CONF_SITE_DESC,
            CONF_SITE_DESC,
            url("/inks"),
            theme("/assets/images/sharer.jpg")
        );

        echo $this->view->render("inks", [
            "head" => $head,
            "pageTitle" => (object)[
                "title" => "Nossos Serviços",
                "subtitle" => "Assistência Técnica Especializada para Gráficas ",
            ],
            "products" => (new Product())->findProduct("type = 'ink'")->fetch(true)
        ]);
    }

    /**
     * SITE INK SINGLE
     */
    public function ink(array $data): void
    {

        $product = (new Product())->findByUri($data["uri"]);
        if (!$product) {
            redirect("/404");
        }

        $product->views += 1;
        $product->save();

        $head = $this->seo->render(
            "{$product->title} - " . CONF_SITE_NAME,
            $product->title,
            url("/produto/tintas/{$product->uri}"),
            ($product->cover ? image($product->cover, 1200, 628) : theme("/assets/images/sharer.jpg"))
        );

        echo $this->view->render("ink", [
            "head" => $head,
            "product" => $product,
            "pageTitle" => (object)["subtitle"=>$product->title, "title"=>"Tintas para Sublimação"],
            "gallery" => (new Gallery())
                ->find("gallery_link = :g", "g={$product->gallery_link}")
                ->fetch(true),
            "related" => (new Product())->findProduct("type = 'ink' AND id != :i", "i={$product->id}")
                ->order("post_at DESC")
                ->limit(6)
                ->fetch(true)
        ]);
    }

    /**
     * SITE PRODUCT SINGLE
     */
    public function parts(): void
    {

        $head = $this->seo->render(
            "Peças de reposição para impressoras de têxteis " . CONF_SITE_NAME . " - " . CONF_SITE_DESC,
            CONF_SITE_DESC,
            url("/product"),
            theme("/assets/images/sharer.jpg")
        );

        echo $this->view->render("parts", [
            "head" => $head,
            "pageTitle" => (object)[
                "title" => "Peças de reposição",
                "subtitle" => "Peças para Impressoras sublimáticas",
            ]
        ]);
    }

    /**
     * SITE PRODUCT SINGLE
     */
    public function assistance(): void
    {

        $head = $this->seo->render(
            "Assistência Técnica Especializada " . CONF_SITE_NAME . " - " . CONF_SITE_DESC,
            CONF_SITE_DESC,
            url("/product"),
            theme("/assets/images/sharer.jpg")
        );

        echo $this->view->render("assistance", [
            "head" => $head,
            "pageTitle" => (object)[
                "title" => "Assistência especializadas",
                "subtitle" => "Impressoras sublimáticas",
            ],
            "products" => (new Product())->find("type = 'product'")->fetch(true)
        ]);
    }


    /**
     * SITE BLOG SEARCH
     * @param array $data
     */
    public function productSearch(array $data): void
    {
        if (!empty($data['s'])) {
            $search = str_search($data['s']);
            echo json_encode(["redirect" => url("/produto/buscar/{$search}/1")]);
            return;
        }

        $search = str_search($data['search']);
        $page = (filter_var($data['page'], FILTER_VALIDATE_INT) >= 1 ? $data['page'] : 1);

        if ($search == "all") {
            redirect("/");
        }

        $head = $this->seo->render(
            "Pesquisa por {$search} - " . CONF_SITE_NAME,
            "Confira os resultados de sua pesquisa para {$search}",
            url("/produto/buscar/{$search}/{$page}"),
            theme("/assets/images/sharer.jpg")
        );

        $productSearch = (new Product())->findProduct("MATCH(title, subtitle) AGAINST(:s)", "s={$search}");
        if (!$productSearch->count()) {
            echo $this->view->render("search", [
                "head" => $head,
                "pageTitle" => (object)[
                    "title" => "PESQUISA POR: <b>{$search}</b>",
                    "subtitle" => "Não encontramos itens para sua busca",
                ],"breadcrumb" => (object)[
                    ["Busca por {$search}", "#"]
                ],
            ]);
            return;
        }

        $pager = new Pager(url("/produto/buscar/{$search}/"));
        $pager->pager($productSearch->count(), 12, $page);

        echo $this->view->render("search", [
            "head" => $head,
            "pageTitle" => (object)[
                "title" => "PESQUISA POR: <b>{$search}</b>",
                "subtitle" => "Encontramos <b>{$productSearch->count()}</b> itens",
            ],"breadcrumb" => (object)[
                ["Busca por {$search}", "#"]
            ],
            "products" => $productSearch->limit($pager->limit())->offset($pager->offset())->fetch(true),
            "paginator" => $pager->render()
        ]);
    }

    /**
     * SITE PRODUCT CATEGORY
     * @param array $data
     */
    public function productCategory(array $data): void
    {

        $categoryUri = filter_var($data["category"], FILTER_SANITIZE_STRIPPED);
        $category = (new Category())->findByUri($categoryUri);

        if (!$category) {
            redirect("/");
        }

        $productCategory = (new Product())->findProduct("category = :c", "c={$category->id}");
        $page = (!empty($data['page']) && filter_var($data['page'], FILTER_VALIDATE_INT) >= 1 ? $data['page'] : 1);
        $pager = new Pager(url("/produto/em/{$category->uri}/"));
        $pager->pager($productCategory->count(), 12, $page);

        $head = $this->seo->render(
            "Nossos {$category->title} - " . CONF_SITE_NAME,
            $category->description,
            url("/produto/em/{$category->uri}/{$page}"),
            ($category->cover ? image($category->cover, 1200, 628) : theme("/assets/images/sharer.jpg"))
        );

        echo $this->view->render("product-category", [
            "head" => $head,
            "products" => $productCategory
                ->limit($pager->limit())
                ->offset($pager->offset())
                ->order("post_at DESC")
                ->fetch(true),
            "pageTitle" => (object)[
                "title" => "Produtos em {$category->title}",
                "subtitle" => "Confira nossos produtos",
            ],"breadcrumb" => (object)[
                [$category->title, "#"]
            ],
            "paginator" => $pager->render()
        ]);
    }

    /**
     * SITE BLOG
     * @param array|null $data
     */
    public function blog(?array $data): void
    {
        $head = $this->seo->render(
            "Blog - " . CONF_SITE_NAME,
            "Confira em nosso blog dicas e sacadas de como controlar melhorar suas contas. Vamos tomar um café?",
            url("/blog"),
            theme("/assets/images/sharer.jpg")
        );

        $blog = (new Post())->findPost();
        $pager = new Pager(url("/blog/p/"));
        $pager->pager($blog->count(), 12, ($data['page'] ?? 1));

        echo $this->view->render("blog", [
            "head" => $head,
            "blog" => $blog->order("post_at DESC")->limit($pager->limit())->offset($pager->offset())->fetch(true),
            "pageTitle" => (object)[
                "title" => "Blog",
                "subtitle" => "News Paliar ",
                "image" => url("images/slide-bg.jpg"),

            ],
            "breadcrumb" => (object)[
                ["Blog", "#"]
            ],
            "paginator" => $pager->render()
        ]);
    }

    /**
     * SITE BLOG CATEGORY
     * @param array $data
     */
    public function blogCategory(array $data): void
    {
        $categoryUri = filter_var($data["category"], FILTER_SANITIZE_STRIPPED);
        $category = (new Category())->findByUri($categoryUri);

        if (!$category) {
            redirect("/blog");
        }

        $blogCategory = (new Post())->findPost("category = :c", "c={$category->id}");
        $page = (!empty($data['page']) && filter_var($data['page'], FILTER_VALIDATE_INT) >= 1 ? $data['page'] : 1);
        $pager = new Pager(url("/blog/em/{$category->uri}/"));
        $pager->pager($blogCategory->count(), 9, $page);

        $head = $this->seo->render(
            "Artigos em {$category->title} - " . CONF_SITE_NAME,
            $category->description,
            url("/blog/em/{$category->uri}/{$page}"),
            ($category->cover ? image($category->cover, 1200, 628) : theme("/assets/images/sharer.jpg"))
        );

        echo $this->view->render("blog", [
            "head" => $head,
            "title" => "Artigos em {$category->title}",
            "desc" => $category->description,
            "blog" => $blogCategory
                ->limit($pager->limit())
                ->offset($pager->offset())
                ->order("post_at DESC")
                ->fetch(true),
            "paginator" => $pager->render()
        ]);
    }

    /**
     * SITE BLOG SEARCH
     * @param array $data
     */
    public function blogSearch(array $data): void
    {
        if (!empty($data['s'])) {
            $search = str_search($data['s']);
            echo json_encode(["redirect" => url("/blog/buscar/{$search}/1")]);
            return;
        }

        $search = str_search($data['search']);
        $page = (filter_var($data['page'], FILTER_VALIDATE_INT) >= 1 ? $data['page'] : 1);

        if ($search == "all") {
            redirect("/blog");
        }

        $head = $this->seo->render(
            "Pesquisa por {$search} - " . CONF_SITE_NAME,
            "Confira os resultados de sua pesquisa para {$search}",
            url("/blog/buscar/{$search}/{$page}"),
            theme("/assets/images/sharer.jpg")
        );

        $blogSearch = (new Post())->findPost("MATCH(title, subtitle) AGAINST(:s)", "s={$search}");

        if (!$blogSearch->count()) {
            echo $this->view->render("blog", [
                "head" => $head,
                "title" => "PESQUISA POR:",
                "search" => $search
            ]);
            return;
        }

        $pager = new Pager(url("/blog/buscar/{$search}/"));
        $pager->pager($blogSearch->count(), 9, $page);

        echo $this->view->render("blog", [
            "head" => $head,
            "title" => "PESQUISA POR:",
            "search" => $search,
            "blog" => $blogSearch->limit($pager->limit())->offset($pager->offset())->fetch(true),
            "paginator" => $pager->render()
        ]);
    }

    /**
     * SITE BLOG POST
     * @param array $data
     */
    public function blogPost(array $data): void
    {
        $post = (new Post())->findByUri($data['uri']);
        if (!$post) {
            redirect("/404");
        }

        $user = Auth::user();
        if (!$user || $user->level < 5) {
            $post->views += 1;
            $post->save();
        }

        $head = $this->seo->render(
            "{$post->title} - " . CONF_SITE_NAME,
            $post->subtitle,
            url("/blog/{$post->uri}"),
            ($post->cover ? image($post->cover, 1200, 628) : theme("/assets/images/sharer.jpg"))
        );

        echo $this->view->render("blog-post", [
            "head" => $head,
            "post" => $post,
            "category" => (new Category())->find("id >= :id", "id={$post->category}")->fetch(),
            "author" => (new User())->find("id >= :id", "id={$post->author}")->fetch(),
            "pageTitle" => (object)[
                "title" => $post->title,
                "subtitle" => $post->subtitle,
                "image" => url("images/slide-bg.jpg"),

            ],"breadcrumb" => (object)[
                [$post->category()->title, "#"],[$post->title,"#"]
            ],
            "relatedA" => (new Post())
                ->findPost("category = :c AND id != :i", "c={$post->category}&i={$post->id}")
                ->order("post_at DESC")
                ->limit(3)->offset(0)
                ->fetch(true),
            "relatedB" => (new Post())
                ->findPost("category = :c AND id != :i", "c={$post->category}&i={$post->id}")
                ->order("post_at DESC")
                ->limit(2)->offset(2)
                ->fetch(true),
            "gallery" => (new Gallery())
                ->find("gallery_link = :g", "g={$post->gallery_link}")
                ->fetch(true),
        ]);
    }

    /**
     * SITE LOGIN
     * @param null|array $data
     */
    public function login(?array $data): void
    {


//            if (!csrf_verify_alt($data)) {
//                $json['message'] = $this->message->error("Erro ao enviar, favor use o formulário")->render();
//                echo json_encode($json);
//                return;
//            }

        if (request_limit("weblogin", 5, 60 * 3)) {
            $json['message'] = $this->message->error("Você já efetuou 5 tentativas, esse é o limite. Por favor, aguarde 3 minutos para tentar novamente!")->render();
            echo json_encode($json);
            return;
        }

        if (empty($data['email']) || empty($data['password'])) {
            $json['message'] = $this->message->warning("Informe seu email e senha para entrar")->render();
            echo json_encode($json);
            return;
        }

        $save = (!empty($data['save']) ? true : false);
        $auth = new Auth();
        $login = $auth->login($data['email'], $data['password'], $save);

        if ($login) {
            $this->message->success("Seja bem-vindo(a) de volta " . Auth::user()->first_name . "!")->flash();
            $json['redirect'] = $data['destino'] ? url($data['destino']) : url("/restrito");


        } else {
            $json['message'] = $auth->message()->before("Ooops! ")->render();
        }

        echo json_encode($json);
        return;

    }

    /**
     * SITE PASSWORD FORGET
     * @param null|array $data
     */
    public function forget(?array $data)
    {
        if (Auth::user()) {
            redirect("/");
        }

        if (!empty($data['csrf'])) {
            if (!csrf_verify($data)) {
                $json['message'] = $this->message->error("Erro ao enviar, favor use o formulário")->render();
                echo json_encode($json);
                return;
            }

            if (empty($data["email"])) {
                $json['message'] = $this->message->info("Informe seu e-mail para continuar")->render();
                echo json_encode($json);
                return;
            }

            if (request_repeat("webforget", $data["email"])) {
                $json['message'] = $this->message->error("Ooops! Você já tentou este e-mail antes")->render();
                echo json_encode($json);
                return;
            }

            $auth = new Auth();
            if ($auth->forget($data["email"])) {
                $json["message"] = $this->message->success("Acesse seu e-mail para recuperar a senha")->render();
            } else {
                $json["message"] = $auth->message()->before("Ooops! ")->render();
            }

            echo json_encode($json);
            return;
        }

        $head = $this->seo->render(
            "Recuperar Senha - " . CONF_SITE_NAME,
            CONF_SITE_DESC,
            url("/recuperar"),
            theme("/assets/images/sharer.jpg")
        );

        echo $this->view->render("auth-forget", [
            "head" => $head,
            "pageTitle" => (object)[
                "title" => "Recuperar Senha",
                "subtitle" => "Qual seu email cadastrado?",
            ],"breadcrumb" => (object)[
                ["Recuperar Senha", "#"]
            ]
        ]);
    }

    /**
     * SITE FORGET RESET
     * @param array $data
     */
    public function reset(array $data): void
    {
        if (Auth::user()) {
            redirect("/app");
        }

        if (!empty($data['csrf'])) {
            if (!csrf_verify($data)) {
                $json['message'] = $this->message->error("Erro ao enviar, favor use o formulário")->render();
                echo json_encode($json);
                return;
            }

            if (empty($data["password"]) || empty($data["password_re"])) {
                $json["message"] = $this->message->info("Informe e repita a senha para continuar")->render();
                echo json_encode($json);
                return;
            }

            list($email, $code) = explode("|", $data["code"]);
            $auth = new Auth();

            if ($auth->reset($email, $code, $data["password"], $data["password_re"])) {
                $this->message->success("Senha alterada com sucesso. Vamos controlar?")->flash();
                $json["reload"] = true;
            } else {
                $json["message"] = $auth->message()->before("Ooops! ")->render();
            }

            echo json_encode($json);
            return;
        }

        $head = $this->seo->render(
            "Crie sua nova senha no " . CONF_SITE_NAME,
            CONF_SITE_DESC,
            url("/recuperar"),
            theme("/assets/images/sharer.jpg")
        );

        echo $this->view->render("auth-reset", [
            "head" => $head,
            "code" => $data["code"],
            "pageTitle" => (object)[
                "title" => "Nova Senha",
                "subtitle" => "Cadastre uma nova senha",
            ],"breadcrumb" => (object)[
                ["Nova Senha", "#"]
            ]
        ]);
    }

    /**
     * SITE REGISTER
     * @param null|array $data
     */
    public function register(?array $data): void
    {
        if (Auth::user()) {
            redirect("/");
        }

        if (!empty($data['csrf'])) {
            if (!csrf_verify($data)) {
                $json['message'] = $this->message->error("Erro ao enviar, favor use o formulário")->render();
                echo json_encode($json);
                return;
            }

            if ($data["password"] != $data["verify_password"]) {
                $json['message'] = $this->message->warning("Senhas devem ser iguais")->render();
                echo json_encode($json);
                return;
            }

            $auth = new Auth();
            $user = new User();
            $user->bootstrap($data["first_name"], $data["last_name"], $data["email"],$data["password"],$data["document"],$data["phone"],$data["datebirth"],$data["celular"]);

            if ($auth->register($user)) {
                $login = $auth->login($data['email'], $data['password'], false);

                if ($login) {
                    $this->message->success("Seja bem-vindo " . Auth::user()->first_name . "!")->flash();
                    $json['redirect'] = url($data["destino"]);
                } else {
                    $json['message'] = $auth->message()->before("Ooops! ")->render();
                }
                echo json_encode($json);
                return;

            } else {
                $json['message'] = $auth->message()->before("Ooops! ")->render();
            }

            echo json_encode($json);
            return;
        }

        $head = $this->seo->render(
            "Criar Conta - " . CONF_SITE_NAME,
            CONF_SITE_DESC,
            url("/cadastrar"),
            theme("/assets/images/sharer.jpg")
        );

        echo $this->view->render("auth-register", [
            "head" => $head,
            "pageTitle" => (object)[
                "title" => "Cadastrar",
                "subtitle" => "Faça seu cadastro",
            ],"breadcrumb" => (object)[
                ["Cadastro", "#"]
            ]
        ]);

    }

    /**
     * SITE RESTRICTED
     * @param null|array $data
     */
    public function restricted(?array $data): void
    {
        

        if (!Auth::user()) {
            redirect("/");
        }
        $variableData = null;
        $page = filter_var($data["page"], FILTER_SANITIZE_STRIPPED);
        if($page == ""){
            $render = "views/restricted/home";
            $title = "Bem Vinda(o) ".user()->fullName();
            $breadcrumb = (object)[["Minha Conta", "#"]];
            $selected = "restrito/";
        }
        if($page == "perfil"){
            $render = "views/restricted/profile";
            $title = "Seu Perfil";
            $breadcrumb = (object)[["Minha Conta", url("restrito")], ["Perfil", "#"]];
            $selected = "restrito/perfil";
        }
        if($page == "login"){
            $render = "views/restricted/login";
            $title = "Dados de Login";
            $breadcrumb = (object)[["Minha Conta", url("restrito")], ["Segurança", "#"]];
            $selected = "restrito/login";
        }
        if($page == "enderecos"){
            $render = "views/restricted/adress";
            $title = "Meus Endereços";
            $breadcrumb = (object)[["Minha Conta", url("restrito")], ["Endereços", "#"]];
            $selected = "restrito/enderecos";
            $variableData = new Address();
            $uid = \user()->data()->id;
            $variableData = $variableData->find("user_id = :uid", "uid={$uid}")->fetch(true);
        }
        if($page == "pedidos"){
            $render = "views/restricted/invoices";
            $title = "Meus Pedidos";
            $breadcrumb = (object)[["Minha Conta", url("restrito")], ["Pedidos", "#"]];
            $variableData = new Orders();
            $uid = \user()->data()->id;
            $variableData = $variableData->find("user_id = :uid", "uid={$uid}")->fetch(true);
            $selected = "restrito/pedidos";
        }
        if($page == "cartoes"){
            $render = "views/restricted/billing";
            $title = "Cartões";
            $breadcrumb = (object)[["Minha Conta", url("restrito")], ["Cartões", "#"]];
            $selected = "restrito/cartoes";
            $variableData = new CreditCard();
            $uid = \user()->data()->id;
            $variableData = $variableData->find("user_id = :uid", "uid={$uid}")->fetch(true);
        }


        $head = $this->seo->render(
            "Meu Perfil - " . CONF_SITE_NAME,
            CONF_SITE_DESC,
            url("/restrito"),
            theme("/assets/images/sharer.jpg")
        );

        echo $this->view->render("user-area", [
            "head" => $head,
            "selected" => $selected,
            "render" => $render,
            "variableData" => $variableData,
            "pageTitle" => (object)[
                "title" => $title,
                "subtitle" => user()->fullName(),
            ],"breadcrumb" => $breadcrumb
        ]);

    }

    /**
     * @param array $data
     */
    public function order(array $data) : void
    {
        if (!Auth::user()) {
            redirect("/");
        }
        $order_id = filter_var($data["order_id"], FILTER_SANITIZE_STRIPPED);
        $order = (new Orders())->findById($order_id);
        $itens = (new OrderItens())->find("order_id = :order_id", "order_id={$order->id}")->fetch(true);

        $head = $this->seo->render(
            "Pedido - [#" . order_id($order->id) . "] | " . CONF_SITE_NAME,
            CONF_SITE_DESC,
            url("/restrito/"),
            theme("/assets/images/sharer.jpg")
        );

        echo $this->view->render("order", [
            "head" => $head,
            "selected" => "restrito/pedidos",
            "itens" => $itens,
            "order" => $order,
            "pageTitle" => (object)[
                "title" => "Pedido",
                "subtitle" => user()->fullName(),
            ],"breadcrumb" => (object)[["Minha Conta", url("restrito")], ["Pedidos", "#"]]
        ]);

    }

    /**
     * @param array $data
     */
    public function profile(array $data) : void
    {

        if (!empty($data['csrf'])) {
            if (!csrf_verify($data)) {
                $json['message'] = $this->message->error("Erro ao enviar, favor use o formulário")->render();
                echo json_encode($json);
                return;
            }
            if (isset($data) AND $data["action"] == "profile") {

                $data = filter_var_array($data, FILTER_SANITIZE_STRIPPED);
                $userUpdate = (new User())->findById($data["id"]);
                if (!$userUpdate) {
                    $this->message->error("Você tentou gerenciar um usuário que não existe")->flash();
                    echo json_encode(["redirect" => url("/")]);
                    return;
                }
                $userUpdate->first_name = $data["first_name"];
                $userUpdate->last_name = $data["last_name"];
                $userUpdate->email = $userUpdate->email;
                $userUpdate->password = (!empty($data["password"]) ? $data["password"] : $userUpdate->password);
                //$userUpdate->genre = $data["genre"];
                $userUpdate->datebirth = date_fmt_back($data["datebirth"]);
                $userUpdate->document = preg_replace("/[^0-9]/", "", $data["document"]);
                $userUpdate->about = $data["about"];
                $userUpdate->phone = $data["phone"];
                $userUpdate->celular = $data["celular"];
                //upload photo
                if (!empty($_FILES["photo"])) {
                    if ($userUpdate->photo && file_exists(__DIR__ . "/../../../" . CONF_UPLOAD_DIR . "/{$userUpdate->photo}")) {
                        unlink(__DIR__ . "/../../../" . CONF_UPLOAD_DIR . "/{$userUpdate->photo}");
                        (new Thumb())->flush($userUpdate->photo);
                    }
                    $files = $_FILES["photo"];
                    $upload = new Upload();
                    $image = $upload->image($files, $userUpdate->fullName(), 600);
                    if (!$image) {
                        $json["message"] = $upload->message()->render();
                        echo json_encode($json);
                        return;
                    }
                    $userUpdate->photo = $image;
                }
                if (!$userUpdate->save()) {
                    $json["message"] = $userUpdate->message()->render();
                    echo json_encode($json);
                    return;
                }
                $this->message->success("Usuário atualizado com sucesso...")->flash();
                echo json_encode(["redirect" => url("restrito/perfil")]);
                return;
            }

            if (isset($data) AND $data["action"] == "login") {

                $data = filter_var_array($data, FILTER_SANITIZE_STRIPPED);
                $userUpdate = (new User())->findById($data["id"]);
                if (!$userUpdate) {
                    $this->message->error("Você tentou gerenciar um usuário que não existe")->flash();
                    echo json_encode(["redirect" => url("/")]);
                    return;
                }
                if(!isset($data["password"]) OR $data["password"] == "" OR !isset($data["re_password"]) OR $data["re_password"] == ""){
                    $json['message'] = $this->message->error("Você Precisa digitar uma senha e confirmar a mesma")->render();
                    echo json_encode($json);
                    return;
                }
                if($data["re_password"] != $data["password"]){
                    $json['message'] = $this->message->error("As senha digitadas não são iguais")->render();
                    echo json_encode($json);
                    return;
                }
                $userUpdate->first_name = $userUpdate->first_name;
                $userUpdate->last_name =  $userUpdate->last_name;
                $userUpdate->email = $userUpdate->email;
                $userUpdate->password = $data["password"];
                $userUpdate->datebirth = $userUpdate->datebirth;
                $userUpdate->document = $userUpdate->document;
                $userUpdate->phone = $userUpdate->phone;
                //upload photo

                if (!$userUpdate->save()) {
                    $json["message"] = $userUpdate->message()->render();
                    echo json_encode($json);
                    return;
                }
                $this->message->success("Usuário atualizado com sucesso...")->flash();
                echo json_encode(["redirect" => url("restrito")]);
                return;
            }
        }
        return;
    }

    /**
     * @param $data
     */
    public function address($data) : void
    {

        if(isset($data) AND $data["action"] == "search"){
            $data = filter_var_array($data, FILTER_SANITIZE_STRIPPED);
            $zipcode = new ViaCEP();
            $json["callback"] = (object)$zipcode->findByZipCode($data['zipcode'])->toArray();

            echo json_encode($json);
            return;
        }
        if(isset($data) AND $data["action"] == "complete"){
            $data = filter_var_array($data, FILTER_SANITIZE_STRIPPED);
            $complete = (new Address())->findById($data['id']);
            $json["zipcode"] = $complete->zipcode;
            $json["street"] = $complete->street;
            $json["number"] = $complete->number;
            $json["complement"] = $complete->complement;
            $json["neighborhood"] = $complete->neighborhood;
            $json["city"] = $complete->city;
            $json["state"] = $complete->state;
            $json["type"] = $complete->type;

            echo json_encode($json);
            return;
        }
        if(isset($data) AND $data["action"] == "add"){
            $data = filter_var_array($data, FILTER_SANITIZE_STRIPPED);
            if (!csrf_verify($data)) {
                $json['message'] = $this->message->error("Erro ao enviar, favor use o formulário")->render();
                echo json_encode($json);
                return;
            }
            $addressCreate = new Address();
            $addressCreate->user_id = $data["user_id"];
            $addressCreate->zipcode = $data["zipcode"];
            $addressCreate->street = $data["street"];
            $addressCreate->number = $data["number"];
            $addressCreate->complement = $data["complement"] ? $data["complement"] : "";
            $addressCreate->neighborhood = $data["neighborhood"];
            $addressCreate->city = $data["city"];
            $addressCreate->state = $data["state"];
            $addressCreate->type = $data["type"];
            $addressCreate->ibge = $data["ibge"] ? $data["ibge"] : "vazio";
            if (!$addressCreate->save()) {
                $json["message"] = $addressCreate->message()->render();
                echo json_encode($json);
                return;
            }
            if(isset($data["destino"])){
                $json['message'] = $this->message->success("Endereço Cadastrado com Sucesso")->flash();
                echo json_encode(["redirect" => url($data["destino"])]);
                $session = new Session();
                $session->set("cep",
                    [   "cep"=>$data["zipcode"],
                        "endereco" => $addressCreate->data()->street,
                        "numero" => $addressCreate->data()->number,
                        "bairro"=>$addressCreate->neighborhood,
                        "complemento"=>$addressCreate->complement,
                        "cidade"=>$addressCreate->city,
                        "estado"=>$addressCreate->state
                    ]);
                return;
            }
            $json['message'] = $this->message->success("Endereço Cadastrado com Sucesso")->flash();
            echo json_encode(["redirect" => url("restrito/enderecos")]);
            return;

        }

        if(isset($data) AND $data["action"] == "update"){
            $data = filter_var_array($data, FILTER_SANITIZE_STRIPPED);

            if (!csrf_verify_alt($data)) {
                $json['message'] = $this->message->error("Erro ao enviar, favor use o formulário")->render();
                echo json_encode($json);
                return;
            }
            $addressUpdate = (new Address())->findById($data["id"]);
            if (!$addressUpdate) {
                $this->message->error("Você tentou atualizar um endereço que não existe ou foi removido")->flash();
                echo json_encode(["redirect" => url("/restrito")]);
                return;
            }
            $addressUpdate->user_id = $data["user_id"];
            $addressUpdate->zipcode = $data["zipcode"];
            $addressUpdate->street = $data["street"];
            $addressUpdate->number = $data["number"];
            $addressUpdate->complement = $data["complement"] ? $data["complement"] : "";
            $addressUpdate->neighborhood = $data["neighborhood"];
            $addressUpdate->city = $data["city"];
            $addressUpdate->state = $data["state"];
            $addressUpdate->type = $data["type"];
            $addressUpdate->ibge = $data["ibge"] ? $data["ibge"] : "";
            if (!$addressUpdate->save()) {
                $json["message"] = $addressUpdate->message()->render();
                echo json_encode($json);
                return;
            }
            $json['message'] = $this->message->success("Endereço Atualizado com Sucesso")->flash();
            echo json_encode(["redirect" => url("restrito/enderecos")]);
            return;
        }
        if(isset($data) AND $data["action"] == "delete"){
            $data = filter_var_array($data, FILTER_SANITIZE_STRIPPED);
            $addressDelete = (new Address())->findById($data["id"]);
            if (!$addressDelete) {
                $this->message->error("Você tentou excluir um endereço que não existe ou já foi removido")->flash();
                echo json_encode(["reload" => true]);
                return;
            }
            $addressDelete->destroy();
            $json['message'] = $this->message->success("Endereço Deletado com Sucesso")->flash();
            echo json_encode(["redirect" => url("restrito/enderecos")]);
            return;
        }
    }


    /**
     * @param array $data
     */
    public function cart(array $data) : void
    {

        if(verifyAddress()){
            $frete = new \stdClass();
            $calcula = new Frete();
            $frete->pac = $calcula->pac();
            $frete->sedex = $calcula->sedex();
        }

        $head = $this->seo->render(
            "Carrinho de produtos - " . CONF_SITE_NAME,
            CONF_SITE_DESC,
            url("/produtos/carrinho"),
            theme("/assets/images/sharer.jpg")
        );
        echo $this->view->render("cart", [
            "active" => "carrinho",
            "head" => $head,
            "frete" => $frete,
            "pageTitle" => (object)[
                "title" => "Carrinho",
                "subtitle" => "Carrinho de Produtos",
            ],"breadcrumb" => (object)[
                ["Carrinho", "#"]
            ]
        ]);
    }

    /**
     * @param array|null $data
     */
    public function checkOut(?array $data) : void
    {

        $shipping = null;
        $frete = new Session();
        $cart = new Cart(CARRINHO);
        $variableData = null;
        $cCard = null;
        if($cart->count() < 1){
            redirect("/carrinho");
        }
        $page = filter_var($data["page"], FILTER_SANITIZE_STRIPPED);

        if($page == "entrar"){
            if (Auth::user() AND $cart->count() >= 1) {
                redirect("/fechar/endereco");
            }
            $active = "fechar/entrar";
            $render = "views/checkout-login";
            $title = "Login";
            $subtitle = "Efetue o Login";
            $breadcrumb = (object)[["Fechar Pedido", "#"]];

        }
        if($page == "endereco"){
            if(!Auth::user()){
                redirect("/fechar/entrar");
            }
            if($cart->count() < 1){
                redirect("/carrinho");
            }
            $frete->unset("frete");
            if(verifyAddress()){
                $shipping = new \stdClass();
                $calcula = new Frete();
                $shipping->pac = $calcula->pac();
                $shipping->sedex = $calcula->sedex();
            }

            $active = "fechar/endereco";
            $render = "views/checkout-address";
            $title = "Finalize o Pedido";
            $subtitle = "Confira seus dados";
            $variableData = new Address();
            $uid = \user()->data()->id;
            $variableData = $variableData->find("user_id = :uid", "uid={$uid}")->fetch(true);
            $breadcrumb = (object)[["Fechar Pedido", url("fechar")], ["Endereço", "#"]];
        }

        // INCLUI PAGINA DE PAGAR
        if($page == "pagar"){
            if(!Auth::user()){
                redirect("/fechar/entrar");
            }
            if($cart->count() < 1){
                redirect("/carrinho");
            }
            if(!$frete->has("frete")){
                redirect("/fechar/endereco");
            }
            $active = "fechar/pagar";
            $render = "views/checkout-payment";
            $title = "Pagamento";
            $subtitle = "Confira os dados do Pedido";

            $variableData = $frete;
            $breadcrumb = (object)[["Fechar pedido", url("fechar")], ["Pagar", "#"]];

            $card = new CreditCard();
            $uid = \user()->data()->id;
            $cCard = $card->find("user_id = :uid", "uid={$uid}")->fetch(true);
        }



        //CONTROLA VIA POST O CONTROLE DE FRETE
        if($data['action'] == "frete"){
            $data = filter_var_array($data, FILTER_SANITIZE_STRIPPED);

            if(!isset($data["type"])){
                $json['message'] = $this->message->error("Frete não selecionado")->flash();
                $json['redirect'] = url("fechar/endereco");
                echo json_encode($json);
                return;
            }
            if($frete->has("frete")){
                $frete->unset("frete");
            }

            if($data["type"] == "Retirada"){
                $frete->set("frete", ["type"=>$data["type"], "price"=>0.00]);
                $json['redirect'] = url("fechar/pagar");

                echo json_encode($json);
                return;
            }
            if($data["type"] == "Sedex"){
                $frete->set("frete", ["type"=>$data["type"], "price"=>(new Frete())->sedex()->price]);
                $json['redirect'] = url("fechar/pagar");
                echo json_encode($json);
                return;
            }
            if($data["type"] == "PAC"){
                $frete->set("frete", ["type"=>$data["type"], "price"=>(new Frete())->pac()->price]);
                $json['redirect'] = url("fechar/pagar");
                echo json_encode($json);
                return;
            }
            $json['message'] = $this->message->error("Não conseguimos calcular seu pedido, favor entrar em contato com nossa equipe")->flash();
            $json['redirect'] = url("carrinho");
            echo json_encode($json);
            return;
        }


        if($page == "deslogar"){
            Auth::logout();
            redirect("/fechar/entrar");
        }

        $head = $this->seo->render(
            "Finalizar Compras - " . CONF_SITE_NAME,
            CONF_SITE_DESC,
            url("/checkout"),
            theme("/assets/images/sharer.jpg")
        );


        echo $this->view->render("checkout", [
            "active" => $active,
            "head" => $head,
            "shipping" => $shipping,
            "variableData" => $variableData,
            "cCard" => $cCard,
            "render" => $render,
            "pageTitle" => (object)[
                "title" => $title,
                "subtitle" => $subtitle,
            ],"breadcrumb" => $breadcrumb
        ]);
    }


    /**
     * FINALIZAÇÃO DO PEDIDO
     */
    public function receipt(array $data): void
    {
        $order = (new Orders())->findByIntegrationOrder($data["order_id"]);
        if(\user()->data()->id != $order->user_id ){
            redirect("/");
        }



        $sesion = new Session();
        $sesion->unset("frete");
        $cart = new Cart(CARRINHO);
        $cart->clear();
        $head = $this->seo->render(
            "Pedido Concluído - " . CONF_SITE_NAME,
            CONF_SITE_DESC,
            url("/finalizar/$order->id"),
            theme("/assets/images/sharer.jpg")
        );

        echo $this->view->render("checkout-end", [
            "head" => $head,
            "order" => $order,
            "active" => "finalizar",
            "pageTitle" => (object)[
                "title" => "Obrigado por comprar conosco",
                "subtitle" => "Pedido [#" . order_id($order->id)."]",
            ],"breadcrumb" => (object)[
                ["Obrigado", "#"]
            ]
        ]);
    }

    /**
     * SITE OPT-IN CONFIRM
     */
    public function confirm(): void
    {
        $head = $this->seo->render(
            "Confirme Seu Cadastro - " . CONF_SITE_NAME,
            CONF_SITE_DESC,
            url("/confirma"),
            theme("/assets/images/sharer.jpg")
        );

        echo $this->view->render("optin", [
            "head" => $head,
            "data" => (object)[
                "title" => "Falta pouco! Confirme seu cadastro.",
                "desc" => "Enviamos um link de confirmação para seu e-mail. Acesse e siga as instruções para concluir seu cadastro e comece a controlar com o CaféControl",
                "image" => theme("/assets/images/optin-confirm.jpg")
            ]
        ]);
    }

    /**
     * SITE OPT-IN SUCCESS
     * @param array $data
     */
    public function success(array $data): void
    {
        $email = base64_decode($data["email"]);
        $user = (new User())->findByEmail($email);

        if ($user && $user->status != "confirmed") {
            $user->status = "confirmed";
            $user->save();
        }

        $head = $this->seo->render(
            "Bem-vindo(a) ao " . CONF_SITE_NAME,
            CONF_SITE_DESC,
            url("/obrigado"),
            theme("/assets/images/sharer.jpg")
        );

        echo $this->view->render("optin", [
            "head" => $head,
            "data" => (object)[
                "title" => "Tudo pronto. Você já pode controlar :)",
                "desc" => "Bem-vindo(a) ao seu controle de contas, vamos tomar um café?",
                "image" => theme("/assets/images/optin-success.jpg"),
                "link" => url("/entrar"),
                "linkTitle" => "Fazer Login"
            ],
            "track" => (object)[
                "fb" => "Lead",
                "aw" => "AW-953362805/yAFTCKuakIwBEPXSzMYD"
            ]
        ]);
    }

    /**
     * SITE TERMS
     */
    public function terms(): void
    {
        $head = $this->seo->render(
            CONF_SITE_NAME . " - Termos de uso",
            CONF_SITE_DESC,
            url("/termos"),
            theme("/assets/images/sharer.jpg")
        );

        echo $this->view->render("terms", [
            "head" => $head,
            "pageTitle" => (object)[
            "title" => "Termos e condições",
            "subtitle" => "Confira nossos termos e condições"],
            "breadcrumb" => (object)[
                ["Termos e Condições", "#"]]
            ]);
    }

    /**
     * SITE TERMS
     */
    public function newsletter(array $data): void
    {
        if(isset($data["action"]) AND $data["action"] == "newsletter"){
            $data = filter_var_array($data, FILTER_SANITIZE_STRIPPED);
            if (request_limit("newsletter", 5, 60*3)) {
                $json['message'] = $this->message->error("Você já efetuou 5 tentativas de cadastro, esse é o limite. Por favor, aguarde 3 minutos para tentar novamente!")->render();
                echo json_encode($json);
                return;
            }

            if(in_array("", $data)){
                $json['message'] = $this->message->warning("Você deve preencher seu email")->render();
                echo json_encode($json);
                return;
            }

            if(!is_email($data['email'])){
                $json['message'] = $this->message->info("Formato de email inválido")->render();
                echo json_encode($json);
                return;
            }

            $newsletter = (new Newsletter())->findByEmail($data["email"]);

            if($newsletter){
                $json['message'] = $this->message->info("Seu email já está em nossa newsletter")->render();
                echo json_encode($json);
                return;
            }
            $newsCreate = new Newsletter();

            $newsCreate->email = $data["email"];
            $newsCreate->save();

            $json['message'] = $this->message->success("Inscrição Efetuada com sucesso {$newsletter->email}")->render();
            echo json_encode($json);
            return;

        }

    }

    /**
     *
     */
    public function logout(): void
    {
        $this->message->info("Você saiu com sucesso " . Auth::user()->first_name . ". Volte logo :)")->flash();

        Auth::logout();
        redirect("/");
    }



    public function ctaDownload(array $data) : void
    {

        if(isset($data["action"]) AND ($data["action"] == "catalogo" OR $data["action"] == "perfil")){
            $data = filter_var_array($data, FILTER_SANITIZE_STRIPPED);


            if (request_limit("cta", 5, 60*3)) {
                $json['message'] = $this->message->error("Você já efetuou 5 tentativas, esse é o limite. Por favor, aguarde 3 minutos para tentar novamente!")->render();
                echo json_encode($json);
                return;
            }

            if(in_array("", $data)){
                $json['message'] = $this->message->warning("Você deve preencher seu email")->render();
                echo json_encode($json);
                return;
            }

            if(!is_email($data['email'])){
                $json['message'] = $this->message->info("Formato de email inválido")->render();
                echo json_encode($json);
                return;
            }
            $prod = (new Product())->findById($data["id"]);
            $cta = new \stdClass();

            $cta->url = $data["action"] == "catalogo" ? url("storage/".$prod->manual) : url("storage/".$prod->perfil);
            $cta->text = $data["action"] == "catalogo" ? "Catálogo <b>{$prod->title}</b>" : "Perfil <b>{$prod->title}</b>";
            $view = new View(__DIR__ . "/../../shared/views/email");
            $message = $view->render("cta-download", [
                "cta" => $cta
            ]);

            (new Email())->bootstrap(
                "Seu arquivo está pronto para download! " . CONF_SITE_NAME,
                $message,
                $data["email"], $data["email"]
            )->send(CONF_EMAIL, CONF_SITE_NAME);

            $newsletter = (new Newsletter())->findByEmail($data["email"]);
            if($newsletter){
                $json['message'] = $this->message->success("Arquivo enviado com sucesso para {$data["email"]}! Caso não receba verifique seu SPAM")->render();
                echo json_encode($json);
                return;
            }
            $newsCreate = new Newsletter();

            $newsCreate->email = $data["email"];
            $newsCreate->origin = "Arquivos";
            $newsCreate->save();

            $json['message'] = $this->message->success("Arquivo enviado com sucesso para {$data["email"]}! Caso não receba verifique seu SPAM")->render();
            echo json_encode($json);
            return;

        }


    }


    /**
     * SITE NAV ERROR
     * @param array $data
     */
    public function error(array $data): void
    {
        

        $error = new \stdClass();

        switch ($data['errcode']) {
            case "problemas":
                $error->code = "OPS";
                $error->title = "Estamos enfrentando problemas!";
                $error->message = "Parece que nosso serviço não está diponível no momento. Já estamos vendo isso mas caso precise, envie um e-mail :)";
                $error->linkTitle = "ENVIAR E-MAIL";
                $error->link = "mailto:" . CONF_MAIL_SUPPORT;
                break;

            case "manutencao":
                $error->code = "OPS";
                $error->title = "Desculpe. Estamos em manutenção!";
                $error->message = "Voltamos logo! Por hora estamos trabalhando para melhorar nosso conteúdo para você controlar melhor as suas contas :P";
                $error->linkTitle = null;
                $error->link = null;
                break;

            default:
                $error->code = $data['errcode'];
                $error->title = "Ooops. Conteúdo indisponível :/";
                $error->message = "Sentimos muito, mas o conteúdo que você tentou acessar não existe, está indisponível no momento ou foi removido :/";
                $error->linkTitle = "Continue navegando!";
                $error->link = url_back();
                break;
        }

        $head = $this->seo->render(
            "{$error->code} | {$error->title}",
            $error->message,
            url("/ops/{$error->code}"),
            theme("/assets/images/sharer.jpg"),
            false
        );

        echo $this->view->render("error", [
            "head" => $head,
            "error" => $error,
            "pageTitle" => (object)[
                "title" => "",
                "subtitle" => "Erro na requisição!",
                "bg" => theme("/assets/recipes/images/recipe-single.jpg"),
            ],"breadcrumb" => (object)[
                ["Erro", "#"]
            ]

        ]);
    }
}