<?php
$loader = $this->registry->get('load');
$loader->controller('marketplace/mktjobs');

class Controllerskyhubskyjobs extends ControllerMarketplaceMktJobs
{

    public function __construct($registry)
    {
        parent::__construct($registry);

    }

    public function atualizarPedidos()
    {
        $this->load->dmodel('setting/task');
        $this->ftrgeralregistry->permissaoAcessoUrl($this->dmodel_setting_task->getTaskByType(Type_TaskUrl::Tp_TaskSkyHubPedido));

        if ($this->config->get('skyhub_status')) {

            $data = array(
                'date_last_acting' => $this->db->dataAtual(),
                'type' => Type_TaskUrl::Tp_TaskSkyHubPedido
            );
            $this->dmodel_setting_task->editDateTaskByType($data);

            $minutos = Type_ExecTimeTask::Tp_ExecTime_3min / 60;
            $tempoLimite = (new DateTime($this->db->dataAtual()))->add(new DateInterval('PT' . $minutos . 'M'));

            $this->load->dmodel('marketplace/mktpedido');
            $this->load->dmodel('skyhub/skypedido');
            $this->dmodel_skyhub_skypedido->proccessOrder($tempoLimite);
        } else {
            throw new Exception('Configuração de verificação de pedidos do SkyHub desabilitada!');
        }
    }


    public function atualizarProdutos()
    {


        if ($this->config->get('skyhub_status') && (isset($this->request->get['update']))) {

            //$this->load->dmodel('skyhub/mktprodutoskyhub');
            $this->load->dmodel('marketplace/mktproduto');
            $this->load->dmodel('marketplace/mktprodutoskyhub');
            $this->load->dmodel('setting/task');
            $this->load->type('tipocomum');

            ini_set('memory_limit', '32M');

            if (isset($this->request->get['update'])) {
                switch ($this->request->get['update']) {
                    case 'estoque':
                        $this->ftrgeralregistry->permissaoAcessoUrl($this->dmodel_setting_task->getTaskByType(Type_TaskUrl::Tp_TaskSkyHubEstoque));
                        $result = $this->dmodel_setting_task->getTaskByType(['type' => Type_TaskUrl::Tp_TaskSkyHubEstoque]);

                        $dataTask = array(
                            'date_last_acting' => $this->db->dataAtual(),
                            'type' => Type_TaskUrl::Tp_TaskSkyHubEstoque
                        );
                        $this->dmodel_setting_task->editDateTaskByType($dataTask);

                        $minutos = Type_ExecTimeTask::Tp_ExecTime_5min / 60;
                        $tempoLimite = (new DateTime($this->db->dataAtual()))->add(new DateInterval('PT' . $minutos . 'M'));

                        $data = array(
                            'date_estoque' => (isset($this->request->get['update']) && ($this->request->get['update'] == 'estoque')) ? true : false
                        );
                        $results = $this->dmodel_marketplace_mktprodutoskyhub->getMktProdutos($data);

                        if (count($results) > 0) {
                            $skyproducts = array_chunk($results, 10);
                            foreach ($skyproducts as $key => $values) {

                                $productReturnList = array();
                                $productType = array();
                                $dataAtt = $this->db->dataAtual();//sempre pegar a data aqui pra não correr o risco de perder informação...

                                foreach ($values as $key => $value) {
                                    try {
                                        $productReturn = $this->dmodel_marketplace_mktproduto->synchronizeProductEstoque($value['product_key_id'], $value['marketId'], Type_MarketPlace::Tp_SkyHub, $value['tipo_produto'], false, true);
                                        if ($productReturn) {
                                            $productReturnList[$value['product_key_id']][Type_MarketPlace::Tp_SkyHub] = $productReturn;
                                            $productType[$value['product_key_id']][Type_MarketPlace::Tp_SkyHub] = $value['tipo_produto'];
                                        }
                                    } catch (ExceptionProductNotExists $e) {
                                        $this->dmodel_marketplace_mktproduto->deleteMktProduct($value['product_key_id'], $value['tipo_produto'], Type_MarketPlace::Tp_SkyHub);
                                    } catch (Exception $e) {
                                        $this->dmodel_marketplace_mktproduto->UpdateProductMarketPlace($value['product_key_id'], null, Type_MarketPlace::Tp_SkyHub, $value['tipo_produto']);
                                        $this->dmodel_marketplace_mktproduto->setError($e->getMessage(), $value['product_key_id'], Type_MarketPlace::Tp_SkyHub, $value['tipo_produto']);
                                    }
                                }

                                foreach ($productReturnList as $product_id => $return) {
                                    $dataUpdate = [
                                        'marketplace_price_id' => (int)$return[Type_MarketPlace::Tp_SkyHub]->getMarketplacePriceId(),
                                        'marketplaceprice_config_md5' => $return[Type_MarketPlace::Tp_SkyHub]->getMarketplacepriceConfigMd5(),
                                        'date_att_price' => $dataAtt
                                    ];

                                    $this->dmodel_marketplace_mktproduto->saveProductMarketPlaceFromProd($return[Type_MarketPlace::Tp_SkyHub], $product_id, $productType[$product_id][Type_MarketPlace::Tp_SkyHub], $dataAtt, null, $dataUpdate);
                                }

                                if (($tempoLimite) && (new DateTime($this->db->dataAtual()) > $tempoLimite)) {
                                    break;
                                }
                            }
                        }
                        break;
                    case 'produto':
                        $this->ftrgeralregistry->permissaoAcessoUrl($this->dmodel_setting_task->getTaskByType(Type_TaskUrl::Tp_TaskSkyHubProduto));
                        $result = $this->dmodel_setting_task->getTaskByType(['type' => Type_TaskUrl::Tp_TaskSkyHubProduto]);

                        $dataTask = array(
                            'date_last_acting' => $this->db->dataAtual(),
                            'type' => Type_TaskUrl::Tp_TaskSkyHubProduto
                        );
                        $this->dmodel_setting_task->editDateTaskByType($dataTask);

                        $minutos = Type_ExecTimeTask::Tp_ExecTime_3min / 60;
                        $tempoLimite = (new DateTime($this->db->dataAtual()))->add(new DateInterval('PT' . $minutos . 'M'));

                        $config_md5 = $this->config->get('skyhub_configs_md5');
                        $config_md5_mktfield = 'marketplace_config_md5';

                        $data = array(
                            'date_produto' => (isset($this->request->get['update']) && ($this->request->get['update'] == 'produto')) ? true : false,
                            'config_md5' => $config_md5,
                            'config_md5_mktfield' => $config_md5_mktfield,
                        );

                        $dataUpdate = array($config_md5_mktfield => $config_md5);

                        $results = $this->dmodel_marketplace_mktprodutoskyhub->getMktProdutos($data);
                        if (count($results) > 0) {
                            $skyproducts = array_chunk($results, 10);
                            foreach ($skyproducts as $key => $values) {
                                //pego a data sempre aqui, pra n ocorrer de atualizar um produto pela replicacao
                                //no momento em que sincroniza o produto, como salva a data no final, se não fizer
                                //assim, da problema... byMatheus
                                $dataAtt = $this->db->dataAtual();
                                $productReturnList = array();
                                $productType = array();
                                foreach ($values as $key => $value) {
                                    try {
                                        $productReturn = $this->dmodel_marketplace_mktproduto->synchronizeProduct($value['product_key_id'], $value['tipo_produto'], Type_MarketPlace::Tp_SkyHub, false, true);

                                        $productReturnList[$value['product_key_id']][Type_MarketPlace::Tp_SkyHub] = $productReturn;
                                        $productType[$value['product_key_id']][Type_MarketPlace::Tp_SkyHub] = $value['tipo_produto'];
                                    } catch (ExceptionProductNotExists $e) {
                                        $this->dmodel_marketplace_mktproduto->deleteMktProduct($value['product_key_id'], $value['tipo_produto'], Type_MarketPlace::Tp_SkyHub);
                                    } catch (Exception $e) {
                                        $saveInfos[Type_MarketPlace::Tp_SkyHub] = $this->marketplace->getProduto(Type_MarketPlace::Tp_SkyHub, $value['marketId']);
                                        $this->dmodel_marketplace_mktproduto->UpdateProductMarketPlace($value['product_key_id'], null, Type_MarketPlace::Tp_SkyHub, $value['tipo_produto']);
                                        $this->dmodel_marketplace_mktproduto->setError($e->getMessage(), $value['product_key_id'], Type_MarketPlace::Tp_SkyHub, $value['tipo_produto']);
                                    }
                                }
                                foreach ($productReturnList as $product_id => $return) {

                                    $dataUpdate = array_merge($dataUpdate, [
                                        'marketplace_price_id' => (int)$return[Type_MarketPlace::Tp_SkyHub]->getMarketplacePriceId(),
                                        'marketplaceprice_config_md5' => $return[Type_MarketPlace::Tp_SkyHub]->getMarketplacepriceConfigMd5()
                                    ]);

                                    $this->dmodel_marketplace_mktproduto->saveProductMarketPlaceFromProd($return[Type_MarketPlace::Tp_SkyHub], $product_id, $productType[$product_id][Type_MarketPlace::Tp_SkyHub],
                                        null, $dataAtt, $dataUpdate);
                                }

                                if (($tempoLimite) && (new DateTime($this->db->dataAtual()) > $tempoLimite)) {
                                    break;
                                }
                            }
                        }
                        break;
                }
            }
        } else {
            throw new Exception('Configuração de verificação de informações do produto desabilitada!');
        }
    }

    public function sincronizaAtributos()
    {
        if ($this->config->get('skyhub_status')) {
            $this->load->dmodel('catalog/productgrid');
            $this->load->dmodel('setting/task');
            $this->ftrgeralregistry->permissaoAcessoUrl($this->dmodel_setting_task->getTaskByType(Type_TaskUrl::Tp_TaskSkyHubAttributo));
            $atrributesList = $this->dmodel_catalog_productgrid->getGridTemplateList();

            $dataTask = array(
                'date_last_acting' => $this->db->dataAtual(),
                'type' => Type_TaskUrl::Tp_TaskSkyHubAttributo
            );
            $this->dmodel_setting_task->editDateTaskByType($dataTask);

            $skyhub = new SkyHub($this->registry);
            $skyhub->sincAttributes($atrributesList);
        } else {
            throw new Exception('Configuração de sincronia de atributos desabilitada!');
        }
    }


    public function getinformation()
    {
        if ($this->config->get('skyhub_status')) {

            $this->load->dmodel('setting/task');
            $this->load->dmodel('marketplace/mktprodutoskyhub');
            $this->load->dmodel('skyhub/skyproduto');
            $this->load->helper('Ftr_sql');

            $this->ftrgeralregistry->permissaoAcessoUrl($this->dmodel_setting_task->getTaskByType(Type_TaskUrl::TP_TaskSkyhubMKtInfos));

            $dataTask = array(
                'date_last_acting' => $this->db->dataAtual(),
                'type' => Type_TaskUrl::TP_TaskSkyhubMKtInfos
            );

            $this->dmodel_setting_task->editDateTaskByType($dataTask);

            $data = array(
                'date_att_info_skyhub' => $this->db->dataAtual(),
                'start' => 0,
                'limit' => 200
            );

            $skyhub_products = $this->dmodel_marketplace_mktprodutoskyhub->getMktProdutos($data);
            $skyhub_products_group = array_chunk($skyhub_products, 50);

            $skyhub = new SkyHub($this->registry);

            foreach ($skyhub_products_group as $skyhub_products) {
                foreach ($skyhub_products as $skyhub_product) {

                    if (isset($skyhub_product['marketId']) && !empty($skyhub_product['marketId'])) {
                        try {

                            $product_info = $skyhub->getProduct($skyhub_product['marketId']);

                            if ($product_info) {

                                if (property_exists($product_info, 'associations') && $product_info->associations) {

                                    $dataAssociation = array();

                                    foreach ($product_info->associations as $association) {
                                        $dataAssociation[] = array(
                                            'platform' => $association->platform,
                                            'status' => $association->status
                                        );
                                    }

                                    $this->dmodel_skyhub_skyproduto->addSkyhubPlatforms($skyhub_product['product_key_id'], $skyhub_product['tipo_produto'], $dataAssociation);
                                }

                                $dataUrl = array();
                                $product_url = $skyhub->getMktUrl($skyhub_product['marketId']);
                                if (is_object($product_url)) {

                                    if ($skyhub_product['tipo_produto'] == Type_ProdutoMkt::Tp_MktProd_Grade) {
                                        if (isset($product_url->variations))
                                            foreach ($product_url->variations->channels as $channel) {
                                                $dataUrl[$channel->name] = $channel->href;
                                            }
                                    } else {
                                        if (isset($product_url->channels))
                                            foreach ($product_url->channels as $channel) {
                                                $dataUrl[$channel->name] = $channel->href;
                                            }
                                    }

                                }

                                $dataUpdate = array(
                                    'url' => ($dataUrl) ? json_encode($dataUrl) : '',
                                    'date_att_info_skyhub' => $data['date_att_info_skyhub']
                                );
                                $sqlUpdate = Ftr_sql::generateUpdate('oc_marketplace_product',
                                    ['url', 'date_att_info_skyhub'], 'product_key_id = ' . $skyhub_product['product_key_id'] . ' and tipo_integracao = ' . Type_MarketPlace::Tp_SkyHub);
                                $this->db->executeSql($sqlUpdate, $dataUpdate);


                            } else {
                                throw new exception('Erro ao buscar produto marktid ' . $skyhub_product['marketId'] . ' não foi encontrado no skyhub');
                            }

                        } catch (Exception $e) {
                            echo $e->getMessage();
                            $this->db->rollback();
                        }

                    }

                }
            }

        } else {
            throw new Exception('Busca de informações dos produtos no skyhub desabilitada!');
        }
    }


}