<?php

final class GaleriaPage extends GaleriaPageUtils
{

    public function getProduto($mktplace_id)
    {
        $prodwbs = $this->getProduct($mktplace_id);

        if ($prodwbs) {
            $pricemkt = $prodwbs->data->skuPrice->pricePer > 0 ? $prodwbs->data->skuPrice->pricePer : $prodwbs->data->skuPrice->priceOf;
            $statusmkt = $prodwbs->data->enabled ? TypeGaleriaPage_Status::Tp_Habilitado : TypeGaleriaPage_Status::Tp_Desabilitado;
            $produto = new MktProdutoRetorno();
            $produto->setmktIntegrationId($prodwbs->data->id);
            $produto->setmktName($prodwbs->data->name);
            $produto->setmktLink('');
            $produto->setmktTipo(Type_MarketPlace::Tp_Galeriapage);
            $produto->setmktPrice($pricemkt);
            $produto->setmktQuantity($prodwbs->data->stock);
            $produto->setmktStatus($statusmkt);
            $produto->setProductType(Type_ProdutoMkt::Tp_MktProd_Normal);

            return $produto;
        } else {
            throw new exception($this->error);
        }
    }

    public function setAtualizarEstoqueFromProdutos(MktProduto $produto, $produtoRetorno)
    {
        $retorno = $this->setAtualizarEstoque($produto);

        $produto->setMktRetorno($retorno);
        return $produto;
    }

    public function setAtualizarEstoquePrecoStatus(MktProduto $produto)
    {
        $hasPromocionalPrice = (($produto->getPromotional_price() > 0) && ($produto->getPromotional_price() != $produto->getPrice()));
        $priceOf = $hasPromocionalPrice ? $produto->getPrice() : 0;
        $pricePer = $hasPromocionalPrice ? $produto->getPromotional_price() : $produto->getPrice();

        $enabled = $produto->getStatus() == TypeProduct_Status::Tp_Habilitado ? true : false;

        if (!$this->updateProductStock($produto->getSku(), $produto->getQuantity())) {
            throw new exception($this->error);
        }
        if (!$this->updateProductPrice($produto->getSku(), $pricePer, $priceOf)) {
            throw new exception($this->error);
        }
        $retorno = $this->updateProductEnable($produto->getSku(), $enabled);

        if ($retorno) {
            $result = $this->getProduto($produto->getSku());
            $produto->setMktRetorno($result);
            return $produto;
        } else {
            throw new exception($this->error);
        }
    }

    public function setAtualizarEstoque(MktProduto $produto)
    {
        $retorno = $this->updateProductStock($produto->getSku(), $produto->getQuantity());

        if ($retorno) {
            return $this->getProduto($produto->getSku());
        } else {
            throw new exception($this->error);
        }
    }

    public function setAtualizarProduto(MktProduto $produto, $data = array())
    {
        $this->load->helper('ftr_geral');
        $this->load->model('setting/setting');

        $keyAccess = $this->keyAccess;
        $idClient = $this->idClient;

        $title = $produto->getCustomTitle();
        if ((!isset($title)) || (empty($title))) {
            $title = $produto->getName();
        }

        $initial_description = $this->config->get('galeriapage_initial_description') ?? '';
        $final_description = $this->config->get('galeriapage_final_description') ?? '';

        trim($initial_description) != '' ? $initial_description = trim($initial_description) . "\n\n" : $initial_description = '';
        trim($final_description) != '' ? $final_description = trim($final_description) : $final_description = '';
        if (!empty($final_description) && !empty($produto->getDescription())) {
            $final_description = "\n\n" . $final_description;
        }

        $description = $initial_description . $produto->getDescription() . $final_description;

        $jsonSend = array();

        $enviado = true;

        if (isset($data['variation_data']) && $data['variation_data']) {
            $variacao = $data['variation_data'];

            $priceOf = 0;
            $pricePer = $variacao->getValor();

            $properties = array();
            if ($variacao->getCor()) {
                if (empty($produto->getMktId())) {
                    $title .= ' - ' . $variacao->getCor();
                }
                $properties[] = array('id' => 1,
                    'name' => $variacao->getTemplateCor(),
                    'value' => $variacao->getCor());
            }
            if ($variacao->getTamanho()) {
                if (empty($produto->getMktId())) {
                    $title .= ' - ' . $variacao->getTamanho();
                }
                $properties[] = array('id' => 2,
                    'name' => $variacao->getTemplateTamanho(),
                    'value' => $variacao->getTamanho());
            }
            if ($variacao->getEspecificacao()) {
                if (empty($produto->getMktId())) {
                    $title .= ' - ' . $variacao->getEspecificacao();
                }
                $properties[] = array('id' => 3,
                    'name' => $variacao->getTemplateEspecificacao(),
                    'value' => $variacao->getEspecificacao());
            }

            $imagesProd = $variacao->getImagens()->getImagens();
            $list_images = array();
            if (Count($imagesProd) > 0) {
                foreach ($imagesProd as $key => $img) {
                    $imageLink = $img->getLinkSemMd5();
                    $list_images[] =
                        array(
                            'position' => $key + 1,
                            'bigImage' => $imageLink,
                            'mediumImage' => $imageLink,
                            'smallImage' => $imageLink,
                            'description' => '',
                            'createdAt' => date("Y-m-d"),
                            'updatedAt' => date("Y-m-d"),
                            'enabled' => true
                        );
                }
            }

            $jsonSend = array(
                'storeId' => $idClient,
                'keyAcess' => $keyAccess,
                'productCode' => $variacao->getSku(),
                'brand' => $produto->getMarca() ?? '',
                'manufacturer' => $produto->getMarca() ?? '',
                'subCategoryId' => $produto->getParam('gp_subcategory_id') ?? 0,
                'ean' => $variacao->getCodigoBarra() ?? '',
                'name' => $title,
                'smallDescription' => '',
                'description' => $description,
                'weight' => $produto->getWeight(),
                'width' => $produto->getWidth(),
                'length' => $produto->getLength(),
                'height' => $produto->getHeight(),
                'enable' => $variacao->getStatus() == TypeProduct_Status::Tp_Habilitado ? true : false,
                'priceOf' => $priceOf,
                'pricePer' => $pricePer,
                'stock' => $variacao->getQuantity() < 0 ? 0 : $variacao->getQuantity(),
                'offer' => true,
                'available' => $variacao->getStatus() == TypeProduct_Status::Tp_Habilitado ? true : false,
                'installments' => 0,
                'properties' => $properties,
                'productImage' => $list_images
            );

            if ($produto->getMktId() != null) {

                $enabled = $produto->getStatus() == TypeProduct_Status::Tp_Habilitado ? true : false;
                $this->updateProductEnable($variacao->getSku(), $enabled);

                if (!$this->updateProductStock($variacao->getSku(), $variacao->getQuantity())) {
                    throw new exception($this->error);
                }
                if (!$this->updateProductPrice($variacao->getSku(), $pricePer, $priceOf)) {
                    throw new exception($this->error);
                }

                $retorno = $this->updateProduct($produto->getMktId(), $jsonSend);

            } else {
                if ($variacao->getStatus() == TypeProduct_Status::Tp_Habilitado) {
                    $retorno = $this->addProduct($jsonSend);
                } else {
                    $enviado = false;
                }
            }

            if ($enviado) {
                if ($retorno) {
                    $mktRetorno = $this->getProduto($variacao->getSku());
                    $produto->setMktRetorno($mktRetorno);
                    return $produto;
                } else {
                    throw new exception($this->error->message ?? $this->error);
                }
            } else {
                return false;
            }
        } else {

            if ($produto->getPrice() <= 0) {
                throw new exception("Não é possivel sincronizar produtos com o preço negativo ou igual a 0!");
            }

            $hasPromocionalPrice = (($produto->getPromotional_price() > 0) && ($produto->getPromotional_price() != $produto->getPrice()));
            $priceOf = $hasPromocionalPrice ? $produto->getPrice() : 0;
            $pricePer = $hasPromocionalPrice ? $produto->getPromotional_price() : $produto->getPrice();

            $imagesProd = $produto->getPictures()->getImagens();
            $list_images = array();
            if (Count($imagesProd) > 0) {
                foreach ($imagesProd as $key => $img) {
                    $imageLink = $img->getLinkSemMd5();
                    $list_images[] =
                        array(
                            'position' => $key + 1,
                            'bigImage' => $imageLink,
                            'mediumImage' => $imageLink,
                            'smallImage' => $imageLink,
                            'description' => '',
                            'createdAt' => date("Y-m-d"),
                            'updatedAt' => date("Y-m-d"),
                            'enabled' => true
                        );
                }
            }

            $jsonSend = array(
                'storeId' => $idClient,
                'keyAcess' => $keyAccess,
                'productCode' => $produto->getSku(),
                'brand' => $produto->getMarca() ?? '',
                'manufacturer' => $produto->getMarca() ?? '',
                'subCategoryId' => $produto->getParam('gp_subcategory_id') ?? 0,
                'ean' => $produto->getCodigoBarra() ?? '',
                'name' => $title,
                'smallDescription' => '',
                'description' => $description,
                'weight' => $produto->getWeight(),
                'width' => $produto->getWidth(),
                'length' => $produto->getLength(),
                'height' => $produto->getHeight(),
                'enable' => $produto->getStatus() == TypeProduct_Status::Tp_Habilitado ? true : false,
                'priceOf' => $priceOf,
                'pricePer' => $pricePer,
                'stock' => $produto->getQuantity() < 0 ? 0 : $produto->getQuantity(),
                'offer' => true,
                'available' => $produto->getStatus() == TypeProduct_Status::Tp_Habilitado ? true : false,
                'installments' => 0,
                'properties' => array(),
                'productImage' => $list_images
            );

            if ($produto->getMktId() != null) {

                $enabled = $produto->getStatus() == TypeProduct_Status::Tp_Habilitado ? true : false;
                $this->updateProductEnable($produto->getSku(), $enabled);

                if (!$this->updateProductStock($produto->getSku(), $produto->getQuantity())) {
                    throw new exception($this->error);
                }
                if (!$this->updateProductPrice($produto->getSku(), $pricePer, $priceOf)) {
                    throw new exception($this->error);
                }

                $retorno = $this->updateProduct($produto->getMktId(), $jsonSend);

            } else {
                $retorno = $this->addProduct($jsonSend);
            }

            if ($retorno) {
                $mktRetorno = $this->getProduto($produto->getSku());
                $produto->setMktRetorno($mktRetorno);
                return $produto;
            } else {
                throw new exception($this->error->message ?? $this->error);
            }
        }
    }

    public function setEnviarNFE($mktOrderId, $fiscalKey, $qty_vols = 1, $nfe_number = "")
    {
        $data = array(
            'numero_nfe' => $nfe_number,
            'keyNumber'  => $fiscalKey
        );
        return $this->updateOrderStatus($mktOrderId, TypeGaleriaPageOrder_ApiStatus::Tp_invoiced, $data);
    }

    public function setPedidoEnvio($mktOrderId, $datasend)
    {
        return $this->updateOrderStatus($mktOrderId, TypeGaleriaPageOrder_ApiStatus::Tp_sent, $datasend);
    }

    public function setDesincronizarProduto($marketId, $id)
    {
        // Comecamos a fazer, mas deixamos pra fazer em outro momento, comentado pra caso seja possivel aproveitar a logica
//        $this->load->dmodel('marketplace/mktproduto');
//        $oc_mktproduct = $this->dmodel_marketplace_mktproduto->getMarketPlaceFromMarketId($marketId, Type_MarketPlace::Tp_Galeriapage);
//
//        $result = $this->updateProductEnable($oc_mktproduct['product_key_id'], false);
//
//        if (!$result->sucess) {
//            throw new exception($this->error);
//        } else {
//            return true;
//        }
    }
}
