<?php

namespace App\Http\Controllers;

use App\Models\Produto;
use App\Models\Empresa;
use App\Models\CategoriaProduto;
use App\Models\UnidadeMedida;
use App\Models\TamanhoPizza;
use App\Models\PadraoTributacaoProduto;
use App\Models\ProdutoPizzaValor;
use App\Models\ProdutoCombo;
use App\Models\IfoodConfig;
use App\Models\CategoriaWoocommerce;
use App\Models\MovimentacaoProduto;
use App\Models\ProdutoIbpt;
use Illuminate\Http\Request;
use App\Utils\UploadUtil;
use App\Utils\IfoodUtil;
use App\Imports\ProdutoImport;
use App\Models\Marca;
use App\Models\ModeloEtiqueta;
use App\Models\ConfigGeral;
use App\Models\ProdutoUnico;
use App\Models\Estoque;
use App\Models\ProdutoLocalizacao;
use App\Models\GaleriaProduto;
use App\Models\ProdutoVariacao;
use App\Models\VariacaoModelo;
use App\Models\VariacaoModeloItem;
use App\Models\CategoriaProdutoIfood;
use App\Models\ListaPreco;
use App\Models\VendiZapConfig;
use App\Models\ItemListaPreco;
use Maatwebsite\Excel\Facades\Excel;
use Illuminate\Support\Str;
use Illuminate\Support\Facades\DB;
use App\Models\MercadoLivreConfig;
use App\Utils\MercadoLivreUtil;
use App\Utils\NuvemShopUtil;
use App\Utils\EstoqueUtil;
use App\Utils\WoocommerceUtil;
use App\Rules\ValidaReferenciaBalanca;
use App\Rules\ValidaCodigoBarrasUnico;
use App\Exports\ProdutoExport;
use App\Services\IbptService;

class ProdutoController extends Controller
{

    protected $util;
    protected $utilMercadoLivre;
    protected $utilEstoque;
    protected $utilNuvemShop;
    protected $utilWocommerce;
    protected $utilIfood;

    public function __construct(UploadUtil $util, MercadoLivreUtil $utilMercadoLivre,
        EstoqueUtil $utilEstoque, NuvemShopUtil $utilNuvemShop, WoocommerceUtil $utilWocommerce, IfoodUtil $utilIfood)
    {
        $this->util = $util;
        $this->utilMercadoLivre = $utilMercadoLivre;
        $this->utilEstoque = $utilEstoque;
        $this->utilNuvemShop = $utilNuvemShop;
        $this->utilWocommerce = $utilWocommerce;
        $this->utilIfood = $utilIfood;

        $this->middleware('permission:produtos_create', ['only' => ['create', 'store']]);
        $this->middleware('permission:produtos_edit', ['only' => ['edit', 'update']]);
        $this->middleware('permission:produtos_view', ['only' => ['show', 'index']]);
        $this->middleware('permission:produtos_delete', ['only' => ['destroy']]);
    }

    private function insertUnidadesMedida($empresa_id){
        $unidade = UnidadeMedida::where('empresa_id', $empresa_id)->first();
        if($unidade == null){
            foreach(UnidadeMedida::unidadesMedidaPadrao() as $u){
                UnidadeMedida::create([
                    'empresa_id' => $empresa_id,
                    'status' => 1,
                    'nome' => $u
                ]);
            }
        }
    }

    private function setNumeroSequencial(){
        $produtos = Produto::where('empresa_id', request()->empresa_id)
        ->where('numero_sequencial', null)
        ->get();

        $numero = __getUltimoNumeroSequencial(request()->empresa_id, 'produtos');
        // $numero++;

        foreach($produtos as $produto){
            $numero++;
            $produto->numero_sequencial = $numero;
            $produto->save();
        }

        __setUltimoNumeroSequencial(request()->empresa_id, 'produtos', $numero);
    }

    public function index(Request $request)
    {   
        $this->setNumeroSequencial();
        $this->insertUnidadesMedida($request->empresa_id);
        $locais = __getLocaisAtivoUsuario();
        $locais = $locais->pluck(['id']);
        $tipo = $request->tipo;
        $local_id = $request->get('local_id');
        $start_date = $request->get('start_date');
        $end_date = $request->get('end_date');
        $com_variacao = $request->get('com_variacao');
        $ordem = $request->get('ordem');
        $com_imagem = $request->get('com_imagem');
        $status = $request->get('status');
        $gerenciar_estoque = $request->get('gerenciar_estoque');
        $sem_custo = $request->get('sem_custo');
        $parados_90 = $request->get('parados_90');

        $produtosParados = null;

        if($parados_90 == 1){

            $dataLimite = now()->subDays(90);

            $produtosParados = DB::table('produtos')
            ->leftJoin('estoques', 'estoques.produto_id', '=', 'produtos.id')
            ->select('produtos.id')
            ->leftJoin(DB::raw("
                (
                SELECT produto_id, MAX(created_at) AS ultima_venda
                FROM (
                SELECT produto_id, created_at FROM item_nves
                UNION ALL
                SELECT produto_id, created_at FROM item_nfces
                ) vendas
                GROUP BY produto_id
                ) ultimas_vendas
                "), 'ultimas_vendas.produto_id', '=', 'produtos.id')

            ->where('produtos.empresa_id', $request->empresa_id)
            ->where('produtos.status', 1)
            ->where('produtos.gerenciar_estoque', 1)
            ->where('estoques.quantidade', '>', 0)

            ->where(function ($q) use ($dataLimite) {
                $q->whereNull('ultimas_vendas.ultima_venda')
                ->orWhere('ultimas_vendas.ultima_venda', '<', $dataLimite);
            })
            ->get();
            $produtosParados = $produtosParados->pluck('id')->toArray();
        }

        $data = Produto::where('empresa_id', request()->empresa_id)
        ->select('produtos.*')
        ->when(!empty($start_date), function ($query) use ($start_date) {
            return $query->whereDate('produtos.created_at', '>=', $start_date);
        })
        ->when(!empty($end_date), function ($query) use ($end_date) {
            return $query->whereDate('produtos.created_at', '<=', $end_date);
        })
        ->when(!empty($request->nome), function ($q) use ($request) {
            return $q->where('nome', 'LIKE', "%$request->nome%");
        })
        ->when(!empty($request->codigo_barras), function ($q) use ($request) {
            return $q->where('codigo_barras', 'LIKE', "%$request->codigo_barras%");
        })
        ->when(!empty($request->marca_id), function ($q) use ($request) {
            return $q->where('marca_id', $request->marca_id);
        })
        ->when(!empty($request->categoria_id), function ($q) use ($request) {
            return $q->where(function($t) use ($request) 
            {
                $t->where('categoria_id', $request->categoria_id)->orWhere('sub_categoria_id', $request->categoria_id);
            });
        })
        ->when(!empty($com_variacao), function ($q) use ($com_variacao) {
            return $q->where('variacao_modelo_id', $com_variacao);
        })
        ->when(!empty($status), function ($q) use ($status) {
            return $q->where('status', $status);
        })
        ->when(!empty($gerenciar_estoque), function ($q) use ($gerenciar_estoque) {
            return $q->where('gerenciar_estoque', $gerenciar_estoque == 1 ? 1 : 0);
        })
        ->when($com_imagem != '', function ($q) use ($com_imagem) {
            if($com_imagem == 1){
                return $q->where('imagem', '!=', '');
            }else{
                // return $q->where('imagem', '')->orWhere('imagem', null);
                return $q->where(function($t)
                {
                    $t->where('imagem', '')->orWhere('imagem', null);
                });
            }
        })
        ->when(!empty($tipo), function ($q) use ($tipo) {
            if($tipo == 'composto'){
                return $q->where('composto', 1);
            }
            if($tipo == 'variavel'){
                return $q->where('variacao_modelo_id', '!=', null);
            }
            if($tipo == 'combo'){
                return $q->where('combo', 1);
            }
        })
        ->when($local_id, function ($query) use ($local_id) {
            return $query->join('produto_localizacaos', 'produto_localizacaos.produto_id', '=', 'produtos.id')
            ->where('produto_localizacaos.localizacao_id', $local_id);
        })
        ->when(!$local_id, function ($query) use ($locais) {
            return $query->join('produto_localizacaos', 'produto_localizacaos.produto_id', '=', 'produtos.id')
            ->whereIn('produto_localizacaos.localizacao_id', $locais);
        })
        ->when(!$ordem, function ($query) {
            return $query->orderBy('nome');
        })
        ->when($ordem, function ($query) use ($ordem) {
            return $query->orderBy($ordem, $ordem == 'created_at' ? 'desc' : 'asc');
        })
        ->when($sem_custo == 1, function ($q) use ($request) {
            return $q->where('valor_compra', 0)->where('status', 1)
            ->where('gerenciar_estoque', 1);
        })
        ->when($parados_90 == 1, function ($q) use ($produtosParados) {
            return $q->whereIn('produto_id', $produtosParados);
        })
        ->distinct('produtos.id')
        ->paginate(__itensPagina());

        $categorias = CategoriaProduto::where('empresa_id', request()->empresa_id)
        ->orderBy('nome')
        ->where('status', 1)->get();

        $marcas = Marca::where('empresa_id', request()->empresa_id)
        ->orderBy('nome')->get();

        $empresa = Empresa::findOrFail(request()->empresa_id);

        $configGeral = ConfigGeral::where('empresa_id', $request->empresa_id)
        ->first();
        $tipoExibe = $configGeral && $configGeral->produtos_exibe_tabela == 0 
        ? 'card' 
        : 'tabela';
        
        $usarDropdown = 0;
        if($configGeral){
            $usarDropdown = $configGeral->usar_dropdown_acoes;
        }

        return view('produtos.index', compact('data', 'categorias', 'empresa', 'tipoExibe', 'marcas', 'usarDropdown'));
    }

    public function create(Request $request)
    {
        $this->insertUnidadesMedida($request->empresa_id);
        $empresa = Empresa::findOrFail(request()->empresa_id);

        $listaCTSCSOSN = Produto::listaCSOSN();
        if ($empresa->tributacao == 'Regime Normal') {
            $listaCTSCSOSN = Produto::listaCST();
        }

        $padroes = PadraoTributacaoProduto::where('empresa_id', request()->empresa_id)->get();
        $categorias = CategoriaProduto::where('empresa_id', request()->empresa_id)
        ->where('categoria_id', null)
        ->where('status', 1)->get();
        $cardapio = 0;
        if (isset($request->cardapio)) {
            $cardapio = 1;
        }

        $delivery = 0;
        if (isset($request->delivery)) {
            $delivery = 1;
        }

        $ecommerce = 0;
        if (isset($request->ecommerce)) {
            $ecommerce = 1;
        }

        $mercadolivre = 0;
        if (isset($request->mercadolivre)) {
            $mercadolivre = 1;
        }

        $nuvemshop = 0;
        if (isset($request->nuvemshop)) {
            $nuvemshop = 1;
        }

        $reserva = 0;
        if (isset($request->reserva)) {
            $reserva = 1;
        }

        $woocommerce = 0;
        if (isset($request->woocommerce)) {
            $woocommerce = 1;
        }

        $ifood = 0;
        if (isset($request->ifood)) {
            $ifood = 1;
        }

        $vendizap = 0;
        if (isset($request->vendizap)) {
            $vendizap = 1;
        }

        $marcas = Marca::where('empresa_id', request()->empresa_id)->get();

        $variacoes = VariacaoModelo::where('empresa_id', $request->empresa_id)
        ->where('status', 1)->get();

        $padraoTributacao = PadraoTributacaoProduto::where('empresa_id', request()->empresa_id)->where('padrao', 1)
        ->first();

        $configMercadoLivre = MercadoLivreConfig::where('empresa_id', $request->empresa_id)
        ->first();

        $configGeral = ConfigGeral::where('empresa_id', $request->empresa_id)
        ->first();

        $categoriasWoocommerce = CategoriaWoocommerce::where('empresa_id', request()->empresa_id)->get();
        $categoriasProdutoIfood = CategoriaProdutoIfood::where('empresa_id', request()->empresa_id)->get();

        $unidades = UnidadeMedida::where('empresa_id', request()->empresa_id)
        ->where('status', 1)->get();
        return view('produtos.create', 
            compact('listaCTSCSOSN', 'padroes', 'categorias', 'cardapio', 'marcas', 'delivery', 'variacoes', 
                'padraoTributacao', 'ecommerce', 'configMercadoLivre', 'mercadolivre', 'configGeral', 'nuvemshop',
                'reserva', 'woocommerce', 'categoriasWoocommerce', 'unidades', 'ifood', 'categoriasProdutoIfood', 'vendizap'));
    }

    public function edit(Request $request, $id)
    {
        $item = Produto::findOrFail($id);
        __validaObjetoEmpresa($item);
        $empresa = Empresa::findOrFail(request()->empresa_id);

        $listaCTSCSOSN = Produto::listaCSOSN();
        if ($empresa->tributacao == 'Regime Normal') {
            $listaCTSCSOSN = Produto::listaCST();
        }
        $padroes = PadraoTributacaoProduto::where('empresa_id', request()->empresa_id)->get();
        $categorias = CategoriaProduto::where('empresa_id', request()->empresa_id)
        ->where('categoria_id', null)
        ->where('status', 1)->get();
        $cardapio = 0;
        if (isset($request->cardapio)) {
            $cardapio = 1;
        }

        $delivery = 0;
        if (isset($request->delivery)) {
            $delivery = 1;
        }

        $ecommerce = 0;
        if (isset($request->ecommerce)) {
            $ecommerce = 1;
        }

        $mercadolivre = 0;
        if (isset($request->mercadolivre)) {
            $mercadolivre = 1;
        }

        $marcas = Marca::where('empresa_id', request()->empresa_id)->get();
        $variacoes = VariacaoModelo::where('empresa_id', $request->empresa_id)
        ->where('status', 1)->get();

        $configMercadoLivre = MercadoLivreConfig::where('empresa_id', $request->empresa_id)
        ->first();

        $categoriasWoocommerce = CategoriaWoocommerce::where('empresa_id', request()->empresa_id)->get();

        $unidades = UnidadeMedida::where('empresa_id', request()->empresa_id)
        ->where('status', 1)->get();

        $configGeral = ConfigGeral::where('empresa_id', $request->empresa_id)
        ->first();
        $categoriasProdutoIfood = CategoriaProdutoIfood::where('empresa_id', request()->empresa_id)->get();

        return view('produtos.edit', 
            compact('item', 'listaCTSCSOSN', 'padroes', 'categorias', 'cardapio', 'marcas', 'delivery', 'variacoes',
                'ecommerce', 'mercadolivre', 'configMercadoLivre', 'categoriasWoocommerce', 'unidades', 'configGeral', 
                'categoriasProdutoIfood'));
    }

    public function store(Request $request)
    {
        $this->__validate($request);
        $produto = null;
        try {
            $file_name = '';
            if ($request->hasFile('image')) {
                $file_name = $this->util->uploadImage($request, '/produtos');
            }
            $categorias_woocommerce = [];
            if($request->categorias_woocommerce){
                for($i=0; $i<sizeof($request->categorias_woocommerce); $i++){
                    array_push($categorias_woocommerce, $request->categorias_woocommerce[$i]);
                }
            }

            // $last = Produto::where('empresa_id', $request->empresa_id)
            // ->orderBy('numero_sequencial', 'desc')
            // ->where('numero_sequencial', '>', 0)->first();
            // $numeroSequencial = $last != null ? $last->numero_sequencial : 0;
            $numeroSequencial = __getUltimoNumeroSequencial($request->empresa_id, 'produtos');
            $numeroSequencial++;
            $request->merge([
                'woocommerce_valor' => $request->woocommerce_valor > 0 ? __convert_value_bd($request->woocommerce_valor) : __convert_value_bd($request->valor_unitario),
                'valor_unitario' => __convert_value_bd($request->valor_unitario),
                'valor_prazo' => __convert_value_bd($request->valor_prazo),
                'valor_compra' => $request->valor_compra ? __convert_value_bd($request->valor_compra) : 0,
                'valor_minimo_venda' => $request->valor_minimo_venda ? __convert_value_bd($request->valor_minimo_venda) : 0,
                'imagem' => $file_name,
                'codigo_anp' => $request->codigo_anp ?? '',
                'perc_glp' => $request->perc_glp ? __convert_value_bd($request->perc_glp) : 0,
                'perc_gnn' => $request->perc_gnn ? __convert_value_bd($request->perc_gnn) : 0,
                'perc_gni' => $request->perc_gni ? __convert_value_bd($request->perc_gni) : 0,
                'valor_partida' => $request->valor_partida ? __convert_value_bd($request->valor_partida) : 0,
                'unidade_tributavel' => $request->unidade_tributavel ?? '',
                'quantidade_tributavel' => $request->quantidade_tributavel ? __convert_value_bd($request->quantidade_tributavel) : 0,
                'adRemICMSRet' => $request->adRemICMSRet ? __convert_value_bd($request->adRemICMSRet) : 0,
                'pBio' => $request->pBio ? __convert_value_bd($request->pBio) : 0,
                'pOrig' => $request->pOrig ? __convert_value_bd($request->pOrig) : 0,
                'estoque_inicial' => $request->estoque_inicial ? __convert_value_bd($request->estoque_inicial) : 0,
                'indImport' => $request->indImport ?? '',
                'cUFOrig' => $request->cUFOrig ?? '',
                'cardapio' => $request->cardapio ? 1 : 0,
                'delivery' => $request->delivery ? 1 : 0,
                'ecommerce' => $request->ecommerce ? 1 : 0,
                'reserva' => $request->reserva ? 1 : 0,
                'texto_delivery' => $request->texto_delivery ?? '',
                'texto_nuvem_shop' => $request->texto_nuvem_shop ?? '',
                'mercado_livre_descricao' => $request->mercado_livre_descricao ?? '',
                'estoque_minimo' => $request->estoque_minimo ? __convert_value_bd($request->estoque_minimo) : 0,
                'mercado_livre_valor' => $request->mercado_livre_valor ? __convert_value_bd($request->mercado_livre_valor) : 0,
                'perc_icms' => $request->perc_icms ?? 0,
                'perc_pis' => $request->perc_pis ?? 0,
                'perc_cofins' => $request->perc_cofins ?? 0,
                'perc_ipi' => $request->perc_ipi ?? 0,
                'perc_ibs_uf' => $request->perc_ibs_uf ?? 0,
                'perc_ibs_mun' => $request->perc_ibs_mun ?? 0,
                'perc_cbs' => $request->perc_cbs ?? 0,
                'perc_dif' => $request->perc_dif ?? 0,
                
                'cfop_estadual' => $request->cfop_estadual ?? '',
                'cfop_outro_estado' => $request->cfop_outro_estado ?? '',
                'sub_categoria_id' => $request->sub_categoria_id ?? null,
                'valor_combo' => $request->valor_combo ? __convert_value_bd($request->valor_combo) : 0,
                'margem_combo' => $request->margem_combo ? __convert_value_bd($request->margem_combo) : 0,
                'valor_atacado' => $request->valor_atacado ? __convert_value_bd($request->valor_atacado) : 0,
                'categorias_woocommerce' => json_encode($categorias_woocommerce),

                'woocommerce_descricao' => $request->woocommerce_descricao ?? '',
                'numero_sequencial' => $numeroSequencial
            ]);

            __setUltimoNumeroSequencial($request->empresa_id, 'produtos', $numeroSequencial);

            if ($request->cardapio) {
                $request->merge([
                    'valor_cardapio' => $request->valor_cardapio ? __convert_value_bd($request->valor_cardapio) :
                    $request->valor_unitario
                ]);
            }

            if ($request->delivery) {
                $request->merge([
                    'valor_delivery' => $request->valor_delivery ? __convert_value_bd($request->valor_delivery) :
                    $request->valor_unitario,
                    'hash_delivery' => Str::random(50),
                ]);
            }

            if ($request->ecommerce) {
                $request->merge([
                    'valor_ecommerce' => $request->valor_ecommerce ? __convert_value_bd($request->valor_ecommerce) :
                    $request->valor_unitario,
                    'hash_ecommerce' => Str::random(50),
                    'texto_ecommerce' => $request->texto_ecommerce ?? ''
                ]);
                // dd($request->all());
            }else{
                $request->merge([
                    'texto_ecommerce' => ''
                ]);
            }

            $locais = isset($request->locais) ? $request->locais : [];

            $produto = DB::transaction(function () use ($request, $locais) {
                $produto = Produto::create($request->all());

                if($request->combo == 1 && $request->produto_combo_id){
                    for($i=0; $i<sizeof($request->produto_combo_id); $i++){
                        ProdutoCombo::create([
                            'produto_id' => $produto->id,
                            'item_id' => $request->produto_combo_id[$i],
                            'quantidade' => $request->quantidade_combo[$i],
                            'valor_compra' => __convert_value_bd($request->valor_compra_combo[$i]),
                            'sub_total' => __convert_value_bd($request->subtotal_combo[$i])
                        ]);
                    }
                }
                // dd($request->all());
                if($request->variavel){
                    for($i=0; $i<sizeof($request->valor_venda_variacao); $i++){
                        $file_name = '';
                        if(isset($request->imagem_variacao[$i])){
                        // requisição com imagem
                            $imagem = $request->imagem_variacao[$i];
                            $file_name = $this->util->uploadImageArray($imagem, '/produtos');
                        }

                        $dataVariacao = [
                            'produto_id' => $produto->id,
                            'descricao' => $request->descricao_variacao[$i],
                            'valor' => __convert_value_bd($request->valor_venda_variacao[$i]),
                            'codigo_barras' => $request->codigo_barras_variacao[$i],
                            'referencia' => $request->referencia_variacao[$i],
                            'imagem' => $file_name,
                            'variacao_modelo_item_id' => $request->variacao_modelo_item_id[$i]
                        ];
                        $variacao = ProdutoVariacao::create($dataVariacao);

                        if($request->estoque_variacao[$i] && sizeof($locais) <= 1){
                            $qtd = __convert_value_bd($request->estoque_variacao[$i]);
                            $this->utilEstoque->incrementaEstoque($produto->id, $qtd, $variacao->id);
                            $transacao = Estoque::where('produto_id', $produto->id)->orderBy('id', 'desc')->first();
                            $tipo = 'incremento';
                            $codigo_transacao = $transacao->id;
                            $tipo_transacao = 'alteracao_estoque';
                            $this->utilEstoque->movimentacaoProduto($produto->id, $qtd, $tipo, $codigo_transacao, $tipo_transacao, \Auth::user()->id, $variacao->id);      
                        }
                    }
                }else{

                    if($request->estoque_inicial && sizeof($locais) <= 1){

                        $this->utilEstoque->incrementaEstoque($produto->id, $request->estoque_inicial, null);
                        $transacao = Estoque::where('produto_id', $produto->id)->orderBy('id', 'desc')->first();

                        $tipo = 'incremento';
                        if($transacao != null){
                            $codigo_transacao = $transacao->id;
                            $tipo_transacao = 'alteracao_estoque';
                            $this->utilEstoque->movimentacaoProduto($produto->id, $request->estoque_inicial, $tipo, $codigo_transacao, $tipo_transacao, \Auth::user()->id);
                        }else{
                            // combo
                            foreach($produto->itensDoCombo as $c){
                                $transacao = Estoque::where('produto_id', $c->item_id)->orderBy('id', 'desc')->first();
                                $codigo_transacao = $transacao->id;
                                $tipo_transacao = 'alteracao_estoque';
                                $this->utilEstoque->movimentacaoProduto($c->item_id, $request->estoque_inicial, $tipo, $codigo_transacao, $tipo_transacao, \Auth::user()->id);
                            }
                        }
                    }
                }

                $this->insereEmListaDePrecos($produto);

                if($request->mercadolivre){
                    $resp = $this->criaAnuncio($request, $produto);
                    if(isset($resp['erro'])){
                        DB::rollBack();
                        return [
                            'erro' => 1,
                            'msg' => $resp['msg']
                        ];
                    }else{
                        $resp = $resp['retorno'];
                        $produto->mercado_livre_link = $resp->permalink;
                        $produto->mercado_livre_id = $resp->id;
                        $produto->save();
                    }
                }

                if($request->woocommerce){
                    $resp = $this->criaProdutoWoocommerce($request, $produto);
                    if(isset($resp['erro'])){
                        DB::rollBack();
                        return [
                            'erro' => 1,
                            'msg' => $resp['msg']
                        ];
                    }else{
                        $produto->woocommerce_id = $resp['product_id'];
                        $produto->save();
                    }
                }

                if($request->ifood){
                    $resp = $this->criaProdutoIfood($request, $produto);
                    if(isset($resp->id)){
                        session()->flash("flash_success", "Produto Ifood");
                    }
                }

                if($request->vendizap){
                    $resp = $this->criaProdutoVendiZap($request, $produto);
                }

                if($request->nuvemshop){
                    $resp = $this->utilNuvemShop->create($request, $produto); 
                }


                return $produto;
            });



if(isset($produto['erro'])){
    session()->flash("flash_error", $produto['msg']);
    return redirect()->back();
}
session()->flash("flash_success", "Produto cadastrado!");

if(sizeof($locais) >= 2){
    for($i=0; $i<sizeof($locais); $i++){
        ProdutoLocalizacao::updateOrCreate([
            'produto_id' => $produto->id, 
            'localizacao_id' => $locais[$i]
        ]);
    }
    session()->flash("flash_success", "Produto cadastrado, informe o estoque de cada localização!");
    return redirect()->route('estoque-localizacao.define', [$produto->id]);
}else{

    if(sizeof($locais) == 1){
        ProdutoLocalizacao::updateOrCreate([
            'produto_id' => $produto->id, 
            'localizacao_id' => $locais[0]
        ]);
    }else{
        ProdutoLocalizacao::updateOrCreate([
            'produto_id' => $produto->id, 
            'localizacao_id' => $request->local_id
        ]);
    }
}

__createLog($request->empresa_id, 'Produto', 'cadastrar', $produto->nome);
if ($request->composto == true) {
    session()->flash("flash_success", "Produto cadastrado, informe a composição!");
    return redirect()->route('produto-composto.create', [$produto->id]);
}
} catch (\Exception $e) {
    // echo $e->getMessage() . "<br>";
    // echo $e->getLine() . "<br>";
    // die;
    __createLog($request->empresa_id, 'Produto', 'erro', $e->getMessage());
    session()->flash("flash_error", "Algo deu errado: " . $e->getMessage());
    return redirect()->back();
}

if ($produto->categoria && $produto->categoria->tipo_pizza) {
    return redirect()->route('produtos.tamanho-pizza', [$produto->id]);
}

if (isset($request->redirect_cardapio)) {
    return redirect()->route('produtos-cardapio.index');
}

if (isset($request->redirect_delivery)) {
    return redirect()->route('produtos-delivery.index');
}
if (isset($request->redirect_reserva)) {
    return redirect()->route('produtos-reserva.index');
}

if (isset($request->redirect_nuvemshop)) {
    return redirect()->route('nuvem-shop-produtos.index');
}

if (isset($request->redirect_ecommerce)) {
    return redirect()->route('produtos-ecommerce.index');
}
if (isset($request->redirect_mercadolivre)) {
    return redirect()->route('mercado-livre-produtos.index');
}

if (isset($request->redirect_mercadolivre)) {
    return redirect()->route('mercado-livre-produtos.index');
}

if (isset($request->redirect_vendizap) && $produto->vendizap_id != null) {
    session()->flash("swal_success", "Produto cadastrado na plataforma, você pode continuar preenchendo os campos restantes!");

    return redirect()->route('vendizap-produtos.edit', [$produto->vendizap_id]);
}

if($request->adicionar_outro){
    return redirect()->route('produtos.duplicar',[$produto->id]);
}

if($request->ifood){
    return redirect()->route('ifood-produtos.index');
}

return redirect()->route('produtos.index', ['status=1']);
}

private function insereEmListaDePrecos($produto){
    $listas = ListaPreco::where('empresa_id', $produto->empresa_id)
    ->get();
    foreach($listas as $l){
        $valor = 0;
        if($l->ajuste_sobre == 'valor_venda'){
            if($l->tipo == 'incremento'){
                if($l->percentual_alteracao > 0){
                    $valor = $produto->valor_unitario + ($produto->valor_unitario*($l->percentual_alteracao/100));
                }else{
                    $valor = $produto->valor_unitario + $l->valor_alteracao;
                }
            }else{
                if($l->percentual_alteracao > 0){
                    $valor = $produto->valor_unitario - ($produto->valor_unitario*($l->percentual_alteracao/100));
                }else{
                    $valor = $produto->valor_unitario - $l->valor_alteracao;
                }
            }

        }else{
            if($l->tipo == 'incremento'){
                if($l->percentual_alteracao > 0){
                    $valor = $produto->valor_compra + ($produto->valor_compra*($l->percentual_alteracao/100));
                }else{
                    $valor = $produto->valor_compra + $l->valor_alteracao;
                }
            }else{
                if($l->percentual_alteracao > 0){
                    $valor = $produto->valor_compra - ($produto->valor_compra*($l->percentual_alteracao/100));
                }else{
                    $valor = $produto->valor_compra - $l->valor_alteracao;
                }
            }
        }
        ItemListaPreco::create([
            'lista_id' => $l->id,
            'produto_id' => $produto->id,
            'valor' => $valor,
            'percentual_lucro' => $l->percentual_alteracao
        ]);
    }
}

public function update(Request $request, $id)
{
    $item = Produto::findOrFail($id);
    __validaObjetoEmpresa($item);
    try {
        $file_name = $item->imagem;

        if ($request->hasFile('image')) {
            $this->util->unlinkImage($item, '/produtos');
            $file_name = $this->util->uploadImage($request, '/produtos');
        }

        $categorias_woocommerce = [];
        if($request->categorias_woocommerce){
            for($i=0; $i<sizeof($request->categorias_woocommerce); $i++){
                array_push($categorias_woocommerce, $request->categorias_woocommerce[$i]);
            }
        }
        $request->merge([
            'valor_unitario' => __convert_value_bd($request->valor_unitario),
            'valor_prazo' => __convert_value_bd($request->valor_prazo),
            'valor_compra' => $request->valor_compra ? __convert_value_bd($request->valor_compra) : 0,
            'valor_minimo_venda' => $request->valor_minimo_venda ? __convert_value_bd($request->valor_minimo_venda) : 0,
            'imagem' => $file_name,
            'codigo_anp' => $request->codigo_anp ?? '',
            'perc_glp' => $request->perc_glp ? __convert_value_bd($request->perc_glp) : 0,
            'perc_gnn' => $request->perc_gnn ? __convert_value_bd($request->perc_gnn) : 0,
            'perc_gni' => $request->perc_gni ? __convert_value_bd($request->perc_gni) : 0,
            'valor_partida' => $request->valor_partida ? __convert_value_bd($request->valor_partida) : 0,
            'unidade_tributavel' => $request->unidade_tributavel ?? '',
            'quantidade_tributavel' => $request->quantidade_tributavel ? __convert_value_bd($request->quantidade_tributavel) : 0,
            'adRemICMSRet' => $request->adRemICMSRet ? __convert_value_bd($request->adRemICMSRet) : 0,
            'pBio' => $request->pBio ? __convert_value_bd($request->pBio) : 0,
            'pOrig' => $request->pOrig ? __convert_value_bd($request->pOrig) : 0,
            'indImport' => $request->indImport ?? '',
            'cUFOrig' => $request->cUFOrig ?? '',
            'cardapio' => $request->cardapio ? 1 : 0,
            'delivery' => $request->delivery ? 1 : 0,
            'ecommerce' => $request->ecommerce ? 1 : 0,
            'reserva' => $request->reserva ? 1 : 0,
            'texto_delivery' => $request->texto_delivery ?? '',
            'texto_nuvem_shop' => $request->texto_nuvem_shop ?? '',
            'mercado_livre_descricao' => $request->mercado_livre_descricao ?? '',
            'estoque_minimo' => $request->estoque_minimo ? __convert_value_bd($request->estoque_minimo) : 0,
            'mercado_livre_valor' => $request->mercado_livre_valor ? __convert_value_bd($request->mercado_livre_valor) : 0,

            'perc_icms' => $request->perc_icms ?? 0,
            'perc_pis' => $request->perc_pis ?? 0,
            'perc_cofins' => $request->perc_cofins ?? 0,
            'perc_ipi' => $request->perc_ipi ?? 0,
            'cfop_estadual' => $request->cfop_estadual ?? '',
            'cfop_outro_estado' => $request->cfop_outro_estado ?? '',
            'valor_combo' => $request->valor_combo ? __convert_value_bd($request->valor_combo) : 0,
            'margem_combo' => $request->margem_combo ? __convert_value_bd($request->margem_combo) : 0,
            'valor_atacado' => $request->valor_atacado ? __convert_value_bd($request->valor_atacado) : 0,
            'categorias_woocommerce' => json_encode($categorias_woocommerce),
            'woocommerce_descricao' => $request->woocommerce_descricao ?? '',

        ]);

        if ($request->cardapio) {
            $request->merge([
                'valor_cardapio' => $request->valor_cardapio ? __convert_value_bd($request->valor_cardapio) :
                $request->valor_unitario,
            ]);
        }

        if ($request->delivery) {
            $request->merge([
                'valor_delivery' => $request->valor_delivery ? __convert_value_bd($request->valor_delivery) :
                $request->valor_unitario,
                'hash_delivery' => $item->hash_delivery != null ? $item->hash_delivery : Str::random(50),
            ]);
        }

        if ($request->ecommerce) {
            $request->merge([
                'valor_ecommerce' => $request->valor_ecommerce ? __convert_value_bd($request->valor_ecommerce) :
                $request->valor_ecommerce,
                'hash_ecommerce' => $item->hash_ecommerce != null ? $item->hash_ecommerce : Str::random(50),
                'texto_ecommerce' => $request->texto_ecommerce ?? ''
            ]);
        }

        $item->fill($request->all())->save();

        if($request->variavel){

            // $item->variacoes()->delete();
            $variacaoDelete = [];
            $locais = isset($request->locais) ? $request->locais : [];

            for($i=0; $i<sizeof($request->valor_venda_variacao); $i++){
                $dataVariacao = [
                    'produto_id' => $item->id,
                    'descricao' => $request->descricao_variacao[$i],
                    'valor' => __convert_value_bd($request->valor_venda_variacao[$i]),
                    'codigo_barras' => $request->codigo_barras_variacao[$i],
                    'referencia' => $request->referencia_variacao[$i],        
                ];
                if(isset($request->variacao_id[$i])){
                    $variacao = ProdutoVariacao::findOrfail($request->variacao_id[$i]);

                    $file_name = $variacao->imagem;

                    if(isset($request->imagem_variacao[$i])){

                        if($file_name != null){
                            $this->util->unlinkImage($variacao, '/produtos');
                        }
                        // requisição com imagem
                        $imagem = $request->imagem_variacao[$i];
                        $file_name = $this->util->uploadImageArray($imagem, '/produtos');

                    }
                    $dataVariacao['imagem'] = $file_name;

                    $variacao->fill($dataVariacao)->save();
                    $variacaoDelete[] = $request->variacao_id[$i];
                }else{

                    $file_name = '';
                    if(isset($request->imagem_variacao[$i])){
                            // requisição com imagem
                        $imagem = $request->imagem_variacao[$i];
                        $file_name = $this->util->uploadImageArray($imagem, '/produtos');
                    }
                    $dataVariacao['imagem'] = $file_name;
                    $variacao = ProdutoVariacao::create($dataVariacao);

                    if($request->estoque_variacao[$i] && sizeof($locais) <= 1){
                        $qtd = __convert_value_bd($request->estoque_variacao[$i]);
                        $this->utilEstoque->incrementaEstoque($item->id, $qtd, $variacao->id);
                        $transacao = Estoque::where('produto_id', $item->id)->orderBy('id', 'desc')->first();
                        $tipo = 'incremento';
                        $codigo_transacao = $transacao->id;
                        $tipo_transacao = 'alteracao_estoque';
                        $this->utilEstoque->movimentacaoProduto($item->id, $qtd, $tipo, $codigo_transacao, $tipo_transacao, \Auth::user()->id, $variacao->id);      
                    }
                    $variacaoDelete[] = $variacao->id;
                }
            }

            foreach($item->variacoes as $v){
                if(!in_array($v->id, $variacaoDelete)){
                    //verifica

                    $itemNfce = \App\Models\ItemNfce::where('variacao_id', $v->id)
                    ->first();
                    $itemNfe = \App\Models\ItemNfe::where('variacao_id', $v->id)
                    ->first();
                    if($itemNfce == null && $itemNfe == null){
                        if($v->estoque){
                            $v->estoque->delete();
                        }
                        if($v->movimentacaoProduto){
                            $v->movimentacaoProduto->delete();
                        }
                        $v->delete();
                    }else{
                        session()->flash("flash_error", "Esta variação $v->descricao já possui vendas ou compras não é possivel remover");
                        return redirect()->back();
                    }
                }
            }
            // dd($variacaoDelete);
        }else{
            ProdutoVariacao::where('produto_id', $item->id)->delete();
        }

        if($request->combo == 1 && $request->produto_combo_id){
            $item->itensDoCombo()->delete();
            for($i=0; $i<sizeof($request->produto_combo_id); $i++){
                ProdutoCombo::create([
                    'produto_id' => $item->id,
                    'item_id' => $request->produto_combo_id[$i],
                    'quantidade' => $request->quantidade_combo[$i],
                    'valor_compra' => __convert_value_bd($request->valor_compra_combo[$i]),
                    'sub_total' => __convert_value_bd($request->subtotal_combo[$i])
                ]);
            }
        }

        if($request->mercadolivre){
            if($item->mercado_livre_id == null){
                $resp = $this->criaAnuncio($request, $item);
            }else{
                $resp = $this->atualizaAnuncio($request, $item);
            }
            if(isset($resp['erro'])){
                session()->flash("flash_error", $resp['msg']);

            }else{
                $resp = $resp['retorno'];
                $item->mercado_livre_link = $resp->permalink;
                $item->mercado_livre_id = $resp->id;
                $item->save();
                session()->flash("flash_success", "Produto atualizado!");
            }
        }else{
            session()->flash("flash_success", "Produto atualizado!");
        }

        if($request->woocommerce){
            if($item->woocommerce_id == null){
                $resp = $this->criaProdutoWoocommerce($request, $item);
            }else{
                $resp = $this->atualizaProdutoWoocommerce($request, $item);
            }
            if(isset($resp['erro'])){
                session()->flash("flash_error", $resp['msg']);

            }else{
                $item->woocommerce_id = $resp['product_id'];
                $item->save();
                session()->flash("flash_success", "Produto atualizado!");

            }
        }else{
            session()->flash("flash_success", "Produto atualizado!");
        }

        if(isset($request->locais)){

            $locais = __getLocaisAtivoUsuario();
            $locais = $locais->pluck(['id'])->toArray();

            foreach($item->locais as $l){
                if(in_array($l->localizacao_id, $locais)){
                    $l->delete();
                }
            }
            for($i=0; $i<sizeof($request->locais); $i++){
                ProdutoLocalizacao::updateOrCreate([
                    'produto_id' => $item->id, 
                    'localizacao_id' => $request->locais[$i]
                ]);
            }
        }

        __createLog($request->empresa_id, 'Produto', 'editar', $item->nome);
        if ($request->composto == true) {
            session()->flash("flash_success", "Produto atualizado, informe a composição!");
            return redirect()->route('produto-composto.create', [$item->id]);
        }
    } catch (\Exception $e) {
        __createLog($request->empresa_id, 'Produto', 'erro', $e->getMessage());
        session()->flash("flash_error", "Algo deu errado: " . $e->getMessage());
    }

    if (isset($request->redirect_cardapio)) {
        return redirect()->route('produtos-cardapio.index');
    }
    if (isset($request->redirect_delivery)) {
        return redirect()->route('produtos-delivery.index');
    }
    if (isset($request->redirect_reserva) || $item->reserva) {
        return redirect()->route('produtos-reserva.index');
    }
    if (isset($request->redirect_ecommerce)) {
        return redirect()->route('produtos-ecommerce.index');
    }
    if (isset($request->redirect_mercadolivre)) {
        return redirect()->route('mercado-livre-produtos.index');
    }
    return redirect()->route('produtos.index', ['status=1']);
}

public function destroy($id)
{
    $item = Produto::findOrFail($id);
    __validaObjetoEmpresa($item);
    try {
        $descricaoLog = $item->nome;

        $itemNfe = \App\Models\ItemNfe::where('produto_id', $item->id)
        ->first();

        if($itemNfe){
            session()->flash("flash_warning", "Não é possivel remover produto que foi comprado ou vendido!");
            return redirect()->back();
        }
        DB::transaction(function () use ($item) {

            if($item->estoque){
                $item->estoque->delete();
            }
            $item->movimentacoes()->delete();
            $item->variacoes()->delete();
            $item->variacoesMercadoLivre()->delete();
            $item->itemLista()->delete();
            $item->ibpt()->delete();
            // $item->itemNfe()->delete();
            // $item->estoque()->delete();
            $item->galeria()->delete();
            
            // $item->itemNfce()->delete();
            $item->itemCarrinhos()->delete();
            $item->composicao()->delete();
            $item->itemPreVenda()->delete();
            $item->itensDoCombo()->delete();
            $item->fornecedores()->delete();
            $item->locais()->delete();

            \App\Models\EstoqueAtualProduto::where('produto_id', $item->id)->delete();
            \App\Models\ImpressoraPedidoProduto::where('produto_id', $item->id)->delete();

            if($item->woocommerce_id){
                $woocommerceClient = $this->utilWocommerce->getConfig($item->empresa_id);
                $woocommerceClient->delete("products/$item->woocommerce_id", ['force' => true]);
            }

            $item->delete();
        });

        $this->util->unlinkImage($item, '/produtos');
        __createLog(request()->empresa_id, 'Produto', 'excluir', $descricaoLog);
        session()->flash("flash_success", "Produto removido!");
    } catch (\Exception $e) {
        __createLog(request()->empresa_id, 'Produto', 'erro', $e->getMessage());
        session()->flash("flash_error", "Algo deu Errado: " . $e->getMessage());
    }
    return redirect()->back();
}

public function destroySelecet(Request $request)
{
    $removidos = 0;
    for($i=0; $i<sizeof($request->item_delete); $i++){
        $item = Produto::findOrFail($request->item_delete[$i]);
        $woocommerceClient = $this->utilWocommerce->getConfig($item->empresa_id);
        $descricaoLog = $item->nome;

        try {
            $item->variacoes()->delete();
            $item->variacoesMercadoLivre()->delete();
            $item->itemLista()->delete();
            $item->itemNfe()->delete();
            $item->itemNfce()->delete();
            $item->movimentacoes()->delete();
            $item->composicao()->delete();
            $item->itemPreVenda()->delete();
            $item->locais()->delete();
            \App\Models\ImpressoraPedidoProduto::where('produto_id', $item->id)->delete();
            \App\Models\EstoqueAtualProduto::where('produto_id', $item->id)->delete();
            
            if($item->estoque){
                $item->estoque->delete();
            }

            if($item->woocommerce_id){
                $woocommerceClient->delete("products/$item->woocommerce_id", ['force' => true]);
            }
            $item->delete();
            $this->util->unlinkImage($item, '/produtos');

            $removidos++;
            __createLog(request()->empresa_id, 'Produto', 'excluir', $descricaoLog);

        } catch (\Exception $e) {
            __createLog(request()->empresa_id, 'Produto', 'erro', $e->getMessage());
            session()->flash("flash_error", 'Algo deu errado: '. $e->getMessage());
            return redirect()->route('produtos.index');
        }
    }

    session()->flash("flash_success", "Total de itens removidos: $removidos!");
    return redirect()->route('produtos.index');
}

public function desactiveSelecet(Request $request)
{
    $alterados = 0;
    for($i=0; $i<sizeof($request->item_delete); $i++){
        $item = Produto::findOrFail($request->item_delete[$i]);
        $descricaoLog = $item->nome;

        try {
            $item->status = 0;
            $item->save();
            $alterados++;
            __createLog(request()->empresa_id, 'Produto', 'editar', $descricaoLog);

        } catch (\Exception $e) {
            __createLog(request()->empresa_id, 'Produto', 'erro', $e->getMessage());
            session()->flash("flash_error", 'Algo deu errado: '. $e->getMessage());
        }
    }

    session()->flash("flash_success", "Total de itens alterados: $alterados");
    return redirect()->back();
}

private function __validate(Request $request)
{
    $rules = [
        'nome' => 'required',
            // 'codigo_barras' => 'required',
            // 'ncm' => 'required',
        'descricao' => 'max:255',
        'descricao_en' => 'max:255',
        'descricao_es' => 'max:255',
        'unidade' => 'required',
        'cst_csosn' => 'required',
        'cst_pis' => 'required',
        'cst_cofins' => 'required',
        'cst_ipi' => 'required',
        'valor_unitario' => 'required',
        'codigo_barras' => [new ValidaCodigoBarrasUnico($request->empresa_id)],
        'referencia_balanca' => [new ValidaReferenciaBalanca($request->empresa_id)],

    ];

    $messages = [
        'nome.required' => 'Campo Obrigatório',
        'codigo_barras.required' => 'Campo Obrigatório',
        'ncm.required' => 'Campo Obrigatório',
        'cest.required' => 'Campo Obrigatório',
        'unidade.required' => 'Campo Obrigatório',
        'perc_icms.required' => 'Campo Obrigatório',
        'perc_pis.required' => 'Campo Obrigatório',
        'perc_cofins.required' => 'Campo Obrigatório',
        'perc_ipi.required' => 'Campo Obrigatório',
        'cst_csosn.required' => 'Campo Obrigatório',
        'cst_pis.required' => 'Campo Obrigatório',
        'cst_cofins.required' => 'Campo Obrigatório',
        'cst_ipi.required' => 'Campo Obrigatório',
        'valor_unitario.required' => 'Campo Obrigatório',
        'descricao.max' => 'Máximo de 255 caracteres',
        'descricao_es.max' => 'Máximo de 255 caracteres',
        'descricao_en.max' => 'Máximo de 255 caracteres',
    ];
    $this->validate($request, $rules, $messages);
}

public function import()
{
    return view('produtos.import');
}

public function export(){
    $data = Produto::where('empresa_id', request()->empresa_id)
    ->orderBy('nome')
    ->get();

    $file = new ProdutoExport($data);
    return Excel::download($file, 'produtos.xlsx');

}

public function downloadModelo()
{
    return response()->download(public_path('files/') . 'import_products_csv_template.xlsx');
}

public function storeModelo(Request $request)
{
    if ($request->hasFile('file')) {
        ini_set('max_execution_time', 0);
        ini_set('memory_limit', -1);

        $rows = Excel::toArray(new ProdutoImport, $request->file);
        $retornoErro = $this->validaArquivo($rows);
        $cont = 0;
        $contDuplicados = 0;
        if(isset($request->locais)){
            $locais = isset($request->locais) ? $request->locais : [];
        }

        if ($retornoErro == "") {
            foreach ($rows as $row) {
                foreach ($row as $key => $r) {

                    if ($r[0] != 'NOME' && isset($r[0])) {

                        try {
                            $data = $this->preparaObjeto($r, $request->empresa_id);

                            $produtoDuplicado = Produto::where('empresa_id', $request->empresa_id)
                            ->where('nome', $data['nome'])->first();

                            if($produtoDuplicado == null){
                                $item = Produto::create($data);

                                if(isset($request->locais)){
                                    foreach($locais as $l){
                                        $local = ProdutoLocalizacao::updateOrCreate([
                                            'produto_id' => $item->id, 
                                            'localizacao_id' => $l
                                        ]);

                                        if($data['estoque']){
                                            $this->utilEstoque->incrementaEstoque($item->id, $data['estoque'], null, $local->localizacao_id);

                                            $transacao = Estoque::where('produto_id', $item->id)->orderBy('id', 'desc')->first();
                                            $tipo = 'incremento';
                                            $codigo_transacao = $transacao->id;
                                            $tipo_transacao = 'alteracao_estoque';
                                            $this->utilEstoque->movimentacaoProduto($item->id, $data['estoque'], $tipo, 
                                                $codigo_transacao, $tipo_transacao, \Auth::user()->id);
                                        }
                                    }
                                }else{
                                    $local = ProdutoLocalizacao::updateOrCreate([
                                        'produto_id' => $item->id, 
                                        'localizacao_id' => $request->local_id
                                    ]);

                                    if($data['estoque']){
                                        $this->utilEstoque->incrementaEstoque($item->id, $data['estoque'], null, $local->localizacao_id);

                                        $transacao = Estoque::where('produto_id', $item->id)->orderBy('id', 'desc')->first();
                                        $tipo = 'incremento';
                                        $codigo_transacao = $transacao->id;
                                        $tipo_transacao = 'alteracao_estoque';
                                        $this->utilEstoque->movimentacaoProduto($item->id, $data['estoque'], $tipo, 
                                            $codigo_transacao, $tipo_transacao, \Auth::user()->id);
                                    }
                                }

                                $cont++;
                            }else{
                                // dd($data);
                                $produtoDuplicado->codigo_barras = $data['codigo_barras'];
                                $produtoDuplicado->ncm = $data['ncm'];
                                $produtoDuplicado->unidade = $data['unidade'];
                                $produtoDuplicado->cest = $data['cest'];
                                $produtoDuplicado->perc_icms = $data['perc_icms'];
                                $produtoDuplicado->perc_pis = $data['perc_pis'];
                                $produtoDuplicado->perc_cofins = $data['perc_cofins'];
                                $produtoDuplicado->perc_ipi = $data['perc_ipi'];
                                $produtoDuplicado->perc_red_bc = $data['perc_red_bc'];
                                $produtoDuplicado->cst_csosn = $data['cst_csosn'];
                                $produtoDuplicado->cst_pis = $data['cst_pis'];
                                $produtoDuplicado->cst_cofins = $data['cst_cofins'];
                                $produtoDuplicado->cst_ipi = $data['cst_ipi'];
                                $produtoDuplicado->valor_unitario = $data['valor_unitario'];
                                $produtoDuplicado->cfop_estadual = $data['cfop_estadual'];
                                $produtoDuplicado->cfop_outro_estado = $data['cfop_outro_estado'];
                                $produtoDuplicado->cEnq = $data['cEnq'];
                                $produtoDuplicado->categoria_id = $data['categoria_id'];
                                $produtoDuplicado->gerenciar_estoque = $data['gerenciar_estoque'];
                                $produtoDuplicado->codigo_beneficio_fiscal = $data['codigo_beneficio_fiscal'];
                                $produtoDuplicado->valor_compra = $data['valor_compra'];
                                $produtoDuplicado->cfop_entrada_estadual = $data['cfop_entrada_estadual'];
                                $produtoDuplicado->cfop_entrada_outro_estado = $data['cfop_entrada_outro_estado'];
                                $produtoDuplicado->estoque_minimo = $data['estoque_minimo'];

                                $produtoDuplicado->save();
                                if(isset($request->locais)){
                                    foreach($locais as $l){
                                        $local = ProdutoLocalizacao::updateOrCreate([
                                            'produto_id' => $produtoDuplicado->id, 
                                            'localizacao_id' => $l
                                        ]);
                                    }
                                }
                                $contDuplicados++;
                            }
                        } catch (\Exception $e) {
                            session()->flash('flash_error', __getError($e));
                        }
                    }
                }
            }
            session()->flash('flash_success', 'Total de produtos importados: ' . $cont);
            if($contDuplicados > 0){
                session()->flash('flash_warning', 'Total de produtos duplicados: ' . $contDuplicados);
            }
            return redirect()->back();
        } else {
            session()->flash('flash_error', $retornoErro);
            return redirect()->back();
        }
    } else {
        session()->flash('flash_error', 'Selecione o arquivo modelo para importar!!');
        return redirect()->back();
    }
}

private function mask($val, $mask)
{
    $maskared = '';
    $k = 0;
    for ($i = 0; $i <= strlen($mask) - 1; ++$i) {
        if ($mask[$i] == '#') {
            if (isset($val[$k])) {
                $maskared .= $val[$k++];
            }
        } else {
            if (isset($mask[$i])) {
                $maskared .= $mask[$i];
            }
        }
    }

    return $maskared;
}

private function preparaObjeto($linha, $empresa_id)
{
    $ncm = trim((string)$linha[4]);

    if(!str_contains($ncm, ".")){
        $ncm = __mask($ncm, '####.##.##');
    }
    // dd($ncm);

    $categoria = CategoriaProduto::where('empresa_id', $empresa_id)
    ->where('status', 1)
    ->where('nome', $linha[1])->first();

    $valorUnitario = str_replace("R$", "", $linha[2]);
    $valorCompra = str_replace("R$", "", $linha[3]);
    $valorUnitario = __convert_value_bd($valorUnitario);
    $valorCompra = $valorCompra ? __convert_value_bd($valorCompra) : 1;
    $percentualLucro = 0;

    if($valorUnitario > 0 && $valorCompra > 0){
        $percentualLucro = ($valorUnitario/$valorCompra)*100;
    }

    $data = [
        'empresa_id' => $empresa_id,
        'nome' => $linha[0],
        'codigo_barras' => $linha[5],
        'ncm' => $ncm,
        'cest' => $linha[6],
        'unidade' => $linha[17] != '' ? $linha[17] : 'UN',
        'perc_icms' => $linha[20] != '' ? __convert_value_bd($linha[20]) : 0,
        'perc_pis' => $linha[21] != '' ? __convert_value_bd($linha[21]) : 0,

        'perc_cofins' => $linha[22] != '' ? __convert_value_bd($linha[22]) : 0,
        'perc_ipi' => $linha[23] != '' ? __convert_value_bd($linha[23]) : 0,
        'cst_csosn' => $linha[7],
        'cst_pis' => $linha[8],
        'cst_cofins' => $linha[9],
        'cst_ipi' => $linha[10],
        'valor_unitario' => $valorUnitario,
        'origem' => $linha[12] != '' ? $linha[12] : 1,
        'perc_red_bc' => $linha[11] != '' ? __convert_value_bd($linha[11]) : 0,
        'cfop_estadual' => $linha[14],
        'cfop_outro_estado' => $linha[15],
        'cEnq' => $linha[13],
        'categoria_id' => $categoria != null ? $categoria->id : null,
        'gerenciar_estoque' => $linha[19] != '' ? $linha[19] : 0,
        'codigo_beneficio_fiscal' => $linha[16],
        'valor_compra' => $valorCompra,

        'cfop_entrada_estadual' => $linha[24],
        'cfop_entrada_outro_estado' => $linha[25],
        'estoque' => $linha[26],
        'estoque_minimo' => $linha[27] ?? 0,
        'referencia' => $linha[28] ?? '',
        'percentual_lucro' => $percentualLucro,
        'valor_prazo' => 0
    ];
    return $data;
}

private function validaArquivo($rows)
{
    $cont = 1;
    $msgErro = "";
    foreach ($rows as $row) {
        foreach ($row as $key => $r) {
            if(isset($r[0])){

                $nome = $r[0];
                $valorVenda = $r[2];
                $ncm = $r[4];
                $cstCsosn = $r[7];
                $cstPis = $r[8];
                $cstCofins = $r[9];
                $cstIpi = $r[10];
                $cfopEstado = $r[14];
                $cfopOutroEstado = $r[15];

                // dd($r);

                if ($r[27] == null && $key == 0) {
                    $msgErro .= "O arquivo deve conter 28 colunas";
                }

                if (strlen($nome) == 0) {
                    $msgErro .= "Coluna nome em branco na linha: $cont | ";
                }

                if (strlen($valorVenda) == 0) {
                    $msgErro .= "Coluna valor venda em branco na linha: $cont | ";
                }

                if (strlen($ncm) == 0) {
                    $msgErro .= "Coluna NCM em branco na linha: $cont | ";
                }

                if (strlen($ncm) < 8 && $key > 0) {
                    $msgErro .= "Coluna NCM deve conter 8 caracteres linha: $cont | ";
                }

                if (strlen($cstCsosn) == 0) {
                    $msgErro .= "Coluna CST/CSOSN em branco na linha: $cont | ";
                }
                if (strlen($cstPis) == 0) {
                    $msgErro .= "Coluna CST/PIS em branco na linha: $cont | ";
                }
                if (strlen($cstCofins) == 0) {
                    $msgErro .= "Coluna CST/COFINS em branco na linha: $cont | ";
                }
                if (strlen($cstIpi) == 0) {
                    $msgErro .= "Coluna CST/IPI em branco na linha: $cont | ";
                }

                if (strlen($cfopEstado) == 0) {
                    $msgErro .= "Coluna CFOP estado em branco na linha: $cont | ";
                }
                if (strlen($cfopOutroEstado) == 0) {
                    $msgErro .= "Coluna CFOP outro estado em branco na linha: $cont | ";
                }

                if ($msgErro != "") {
                    return $msgErro;
                }
                $cont++;
            }
        }

    }

    return $msgErro;
}

public function gerarCodigoEan()
{
    try {
        $rand = rand(11111, 99999);
        $code = $this->incluiDigito('7891000' . $rand);
        return response()->json($code, 200);
    } catch (\Exception $e) {
        return response()->json($e->getMessage(), 401);
    }
}

private function incluiDigito($code)
{
    $weightflag = true;
    $sum = 0;
    for ($i = strlen($code) - 1; $i >= 0; $i--) {
        $sum += (int)$code[$i] * ($weightflag ? 3 : 1);
        $weightflag = !$weightflag;
    }
    return $code . (10 - ($sum % 10)) % 10;
}


public function show($id){
    $item = Produto::findOrFail($id);
    __validaObjetoEmpresa($item);
    $data = MovimentacaoProduto::where('produto_id', $id)
    ->orderBy('id', 'desc')
    ->get();

    $produtoUnico = ProdutoUnico::where('produto_id', $id)
    ->get();
    return view('produtos.show', compact('item', 'data', 'produtoUnico'));
}

public function movimentacao($id){
    $item = MovimentacaoProduto::findOrFail($id);
    __validaObjetoEmpresa($item);
    if($item->tipo_transacao == 'venda_nfe'){
        return redirect()->route('nfe.show', [$item->codigo_transacao]);
    }
    if($item->tipo_transacao == 'venda_nfce'){
        return redirect()->route('nfce.show', [$item->codigo_transacao]);
    }
    if($item->tipo_transacao == 'alteracao_estoque'){
        return redirect()->route('estoque.index', ['produto='.$item->produto->nome]);
    }
    if($item->tipo_transacao == 'compra'){
        return redirect()->route('compras.show', [$item->codigo_transacao]);
    }
}

public function removeImagem($id){
    $item = Produto::findOrFail($id);
    try{
        $this->util->unlinkImage($item, '/produtos');
        $item->imagem = '';
        $item->save();
        session()->flash("flash_success", "Imagem removida");
    } catch (\Exception $e) {
        session()->flash("flash_error", "Algo deu errado: " . $e->getMessage());
    }
    return redirect()->back();
}

public function galeria($id){
    $item = Produto::findOrFail($id);
    __validaObjetoEmpresa($item);
    return view('produtos.galeria', compact('item'));
}

public function storeImage(Request $request, $id){
    $item = Produto::findOrFail($id);
    __validaObjetoEmpresa($item);
    if ($request->hasFile('image')) {

        $file_name = $this->util->uploadImage($request, '/produtos');
        GaleriaProduto::create([
            'produto_id' => $id,
            'imagem' => $file_name
        ]);
        session()->flash("flash_success", "Imagem cadastrada!");
    }else{
        session()->flash("flash_error", "Selecione o arquivo!");
    }
    return redirect()->back();
}

public function destroyImage($id){
    $item = GaleriaProduto::findOrFail($id);
    try {
        $item->delete();

        $this->util->unlinkImage($item, '/produtos');

        session()->flash("flash_success", "Imagem removida!");
    } catch (\Exception $e) {
        session()->flash("flash_error", "Algo deu Errado: " . $e->getMessage());
    }
    return redirect()->back();
}

public function duplicar(Request $request, $id)
{
    $item = Produto::findOrFail($id);
    __validaObjetoEmpresa($item);
    $empresa = Empresa::findOrFail(request()->empresa_id);

    $listaCTSCSOSN = Produto::listaCSOSN();
    if ($empresa->tributacao == 'Regime Normal') {
        $listaCTSCSOSN = Produto::listaCST();
    }
    $padroes = PadraoTributacaoProduto::where('empresa_id', request()->empresa_id)->get();
    $categorias = CategoriaProduto::where('empresa_id', request()->empresa_id)
    ->where('status', 1)->get();
    $cardapio = 0;
    if (isset($request->cardapio)) {
        $cardapio = 1;
    }

    $delivery = 0;
    if (isset($request->delivery)) {
        $delivery = 1;
    }

    $ecommerce = 0;
    if (isset($request->ecommerce)) {
        $ecommerce = 1;
    }
    $marcas = Marca::where('empresa_id', request()->empresa_id)->get();
    $variacoes = VariacaoModelo::where('empresa_id', $request->empresa_id)
    ->where('status', 1)->get();

    $configMercadoLivre = MercadoLivreConfig::where('empresa_id', $request->empresa_id)
    ->first();

    $categoriasWoocommerce = CategoriaWoocommerce::where('empresa_id', request()->empresa_id)->get();
    $unidades = UnidadeMedida::where('empresa_id', request()->empresa_id)
    ->where('status', 1)->get();

    $configGeral = ConfigGeral::where('empresa_id', $request->empresa_id)
    ->first();
    $categoriasProdutoIfood = CategoriaProdutoIfood::where('empresa_id', request()->empresa_id)->get();

    return view('produtos.duplicar', 
        compact('item', 'listaCTSCSOSN', 'padroes', 'categorias', 'cardapio', 'marcas', 'delivery', 'variacoes', 
            'ecommerce', 'configMercadoLivre', 'categoriasWoocommerce', 'unidades', 'configGeral', 'categoriasProdutoIfood'));
}

private function __validaToken(){
    $retorno = $this->utilMercadoLivre->refreshToken(request()->empresa_id);
    if($retorno != 'token valido!'){
        if(!isset($retorno->access_token)){
            dd($retorno);
        }
    }
}

private function criaProdutoIfood($request, $produto){

    $data = [
        'name' => $request->nome,
        'serving' => 'SERVES_1',
    ];

    if($request->ifood_descricao){
        $data['description'] = $request->ifood_descricao;
    }
    if($request->codigo_barras){
        $data['ean'] = $request->codigo_barras;
    }
    if($produto->imagem){
        $pathImage = public_path('uploads/produtos/'.$produto->imagem);
        if(file_exists($pathImage)){
            $mimeType = explode(".", $produto->imagem);
            $image = "data:image/$mimeType[1];base64,".base64_encode(file_get_contents($pathImage));
            $data['image'] = $image;
        }
    }

    // dd($data);
    $config = IfoodConfig::
    where('empresa_id', $request->empresa_id)
    ->first();

    $productIfood = $this->utilIfood->storeProduct($config, $data);

    if(isset($productIfood->id)){
        $produto->ifood_id = $productIfood->id;
        $produto->save();
    }

    if(isset($productIfood->error)){
        session()->flash("flash_error", $productIfood->error->details[0]->message);
        return redirect()->back();
    }

    $categoria = CategoriaProdutoIfood::findOrFail($request->ifood_categoria_id);

    $dataAssociation = [
        'status' => 'AVAILABLE',
        'price' => [
            'value' => $request->ifood_valor ? __convert_value_bd($request->ifood_valor) : __convert_value_bd($request->valor_unitario)
        ]
    ];

    if($request->estoque_inicial){
        $dataEstoque = [
            "productId" => $productIfood->id,
            'amount' => (float)$request->estoque_inicial
        ];

        $stock = $this->utilIfood->addStockProduct($config, $dataEstoque);
    }

    $association = $this->utilIfood->associationProductCategory($config, $categoria->ifood_id, $productIfood->id, $dataAssociation);
    return $productIfood;
}

private function criaProdutoVendiZap($request, $produto){
    $config = VendiZapConfig::where('empresa_id', $request->empresa_id)->first();
    $url = "https://app.vendizap.com/api";

    $ch = curl_init();
    $headers = [
        "X-Auth-Id: " . $config->auth_id,
        "X-Auth-Secret: " . $config->auth_secret,
        'Content-Type: application/json'
    ];

    $data = [
        'descricao' => $request->nome,
        'preco' => $request->vendizap_valor ? __convert_value_bd($request->vendizap_valor) : __convert_value_bd($request->valor_unitario)
    ];

    if(sizeof($produto->variacoes) > 0){
        if($data['preco'] <= 0){
            $data['preco'] = $produto->variacoes[0]->valor;
        }

        $variacoes = $this->montaVariaveisVendiZap($produto, $data['preco']);
        $data['variacoes'] = $variacoes;
    }

    if($produto->imagem){
        $image = env('APP_URL') . '/uploads/produtos/'.$produto->imagem;
        $data['imagens'] = [$image];
    }

    // dd($data);

    curl_setopt($ch, CURLOPT_URL, $url . '/produtos');
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));

    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HEADER, false);
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");


    $data = json_decode(curl_exec($ch));
    curl_close($ch);
    // dd($data);
    if(!isset($data->erros)){
        $produto->vendizap_id = $data->id;
        $produto->save();

        $this->setarEstoqueVendiZap($produto, $config);
    }else{
        session()->flash('flash_error', $data->erros[0]);
    }

}

private function setarEstoqueVendiZap($produto, $config){

    if($produto->gerenciar_estoque){
        if($produto->sub_variacao_modelo_id){
            $key1 = [];
            $key2 = [];
            foreach($produto->variacoes as $v){
                if($v->estoque){
                    $nome = explode(" ", $v->descricao);
                    
                    // dd($nome);

                    $variacao_id = null;
                    $variacao_id2 = null;
                    $variavel_id = null;
                    $variavel_id2 = null;
                    $quantidade = 0;
                    foreach($nome as $key => $k){
                        $varicaoModeloItem = VariacaoModeloItem::select('variacao_modelo_items.*')
                        ->join('variacao_modelos', 'variacao_modelos.id', '=', 'variacao_modelo_items.variacao_modelo_id')
                        ->where('variacao_modelo_items.nome', $k)->first();


                        if($key == 0){
                            $variacao_id = $varicaoModeloItem->variacaoModelo->vendizap_id;
                            $variavel_id = $varicaoModeloItem->vendizap_id;
                        }else{
                            $variacao_id2 = $varicaoModeloItem->variacaoModelo->vendizap_id;
                            $variavel_id2 = $varicaoModeloItem->vendizap_id;
                        }
                    }


                    $ch = curl_init();
                    $headers = [
                        "X-Auth-Id: " . $config->auth_id,
                        "X-Auth-Secret: " . $config->auth_secret,
                        'Content-Type: application/json'
                    ];

                    $data = [
                        'quantidade' => $v->estoque->quantidade,
                        'combinacao' => [
                            $variacao_id => $variavel_id,
                            $variacao_id2 => $variavel_id2,
                        ]
                    ];

                    $url = "https://app.vendizap.com/api";

                    curl_setopt($ch, CURLOPT_URL, $url . '/estoque/'.$produto->vendizap_id);
                    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
                    curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));

                    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
                    curl_setopt($ch, CURLOPT_HEADER, false);
                    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT");

                    $data = json_decode(curl_exec($ch));
                    curl_close($ch);
                    // dd($data);
                }
            }
        }else{
            // estoque variacão simples
            foreach($produto->variacoes as $v){
                if($v->estoque){

                    $varicaoModeloItem = VariacaoModeloItem::select('variacao_modelo_items.*')
                    ->join('variacao_modelos', 'variacao_modelos.id', '=', 'variacao_modelo_items.variacao_modelo_id')
                    ->where('variacao_modelo_items.nome', $v->descricao)->first();

                    $variacao_id = $varicaoModeloItem->variacaoModelo->vendizap_id;
                    $variavel_id = $varicaoModeloItem->vendizap_id;

                    $ch = curl_init();
                    $headers = [
                        "X-Auth-Id: " . $config->auth_id,
                        "X-Auth-Secret: " . $config->auth_secret,
                        'Content-Type: application/json'
                    ];

                    $data = [
                        'quantidade' => $v->estoque->quantidade,
                        'combinacao' => [
                            $variacao_id => $variavel_id,
                        ]
                    ];
                    // dd($data);

                    $url = "https://app.vendizap.com/api";

                    curl_setopt($ch, CURLOPT_URL, $url . '/estoque/'.$produto->vendizap_id);
                    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
                    curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));

                    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
                    curl_setopt($ch, CURLOPT_HEADER, false);
                    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT");

                    $data = json_decode(curl_exec($ch));
                    curl_close($ch);

                }
            }
        }
    }
}

private function montaVariaveisVendiZap($produto, $preco){

    $variacoes = [];
    $v = $produto->variacoes[0]->variacao_modelo_item_id;
    $varicaoModeloItem = VariacaoModeloItem::findOrFail($v);
    $vTemp = [];
    $indice = 0;
    if($varicaoModeloItem->variacaoModelo && $varicaoModeloItem->variacaoModelo->vendizap_id){
        $v = $varicaoModeloItem->variacaoModelo->vendizap_id;
        if(!$produto->sub_variacao_modelo_id){

            for($i=0; $i<sizeof($produto->variacoes); $i++){
                if($i == 0){
                    $variacoes[$indice]['id'] = $v;
                }

                if(isset($produto->variacoes[$i])){

                    $v = $produto->variacoes[$i]->variacao_modelo_item_id;
                    $varicaoModeloItem1 = VariacaoModeloItem::findOrFail($v)->variacaoModelo;
                    $v2 = isset($produto->variacoes[$i+1]) ? $produto->variacoes[$i+1]->variacao_modelo_item_id : null;
                    if($v2){
                        $varicaoModeloItem2 = VariacaoModeloItem::findOrFail($v2)->variacaoModelo;
                    }

                    // dd($varicaoModeloItem1);
                    // die;
                    if($varicaoModeloItem2 && $varicaoModeloItem1->vendizap_id != $varicaoModeloItem2->vendizap_id){
                        $variacoes[$indice]['variaveis'] = $vTemp;
                        $indice++;
                    }else{

                        $valor = $produto->variacoes[$i]->valor;
                        if($produto->variacoes[$i]->valor > 0){
                            $valor = $produto->variacoes[$i]->valor - $preco;
                        }

                        $v = $produto->variacoes[$i]->variacao_modelo_item_id;
                        $varicaoModeloItem = VariacaoModeloItem::findOrFail($v);
                        $vTemp[] = [
                            'id' => $varicaoModeloItem->vendizap_id,
                            'preco' => $valor
                        ];
                    }

                    if(!isset($produto->variacoes[$i+1])){
                        $variacoes[$indice]['variaveis'] = $vTemp;
                        $vTemp = [];
                    }
                }
            }
        }else{
            // multi variação
            $variacoes = $this->preparaVariacoesMulti($produto, $preco);
        }
    }

    return $variacoes;
}

private function preparaVariacoesMulti($produto, $preco){
    $key1 = [];
    $key2 = [];
    // $request = request();
    // for($i=0; $i<sizeof($request->variacao_modelo_item_id); $i++){
    //     echo $request->variacao_modelo_item_id[$i] . "<br>";
    // }
    foreach($produto->variacoes as $v){
        $nome = explode(" ", $v->descricao);
        // echo $nome[0];
        if(!in_array($nome[0], $key1)){
            $key1[] = $nome[0];
        }

        if(!in_array($nome[1], $key2)){
            $key2[] = $nome[1];
        }
    }

    $variacoes = [];
    $indice = 0;
    $cont = 0;

    $vTemp = [];
    foreach($key1 as $k){
        $varicaoModeloItem = VariacaoModeloItem::select('variacao_modelo_items.*')
        ->join('variacao_modelos', 'variacao_modelos.id', '=', 'variacao_modelo_items.variacao_modelo_id')
        ->where('variacao_modelo_items.nome', $k)->first();
        // dd($varicaoModeloItem->variacaoModelo);
        $vTemp[] = [
            'id' => $varicaoModeloItem->vendizap_id,
            'preco' => $produto->variacoes[$cont]->valor - $preco
        ];
        $cont++;
    }
    $variacoes[$indice]['id'] = $varicaoModeloItem->variacaoModelo->vendizap_id;
    $variacoes[$indice]['variaveis'] = $vTemp;

    $vTemp = [];
    $indice++;
    foreach($key2 as $k){
        $varicaoModeloItem = VariacaoModeloItem::select('variacao_modelo_items.*')
        ->join('variacao_modelos', 'variacao_modelos.id', '=', 'variacao_modelo_items.variacao_modelo_id')
        ->where('variacao_modelo_items.nome', $k)->first();
        // dd($varicaoModeloItem->variacaoModelo);
        $vTemp[] = [
            'id' => $varicaoModeloItem->vendizap_id,
            'preco' => $produto->variacoes[$cont]->valor - $preco
        ];
        $cont++;
    }

    $variacoes[$indice]['id'] = $varicaoModeloItem->variacaoModelo->vendizap_id;
    $variacoes[$indice]['variaveis'] = $vTemp;

    return $variacoes;
}

private function criaProdutoWoocommerce($request, $produto){
    $woocommerceClient = $this->utilWocommerce->getConfig($request->empresa_id);
    $categorias_woocommerce = json_decode($produto->categorias_woocommerce);
    $categorias = [];

    try{
        $type = 'simple';
        foreach($categorias_woocommerce as $id){
            $c = CategoriaWoocommerce::findOrFail($id);
            $categorias[] = ['id'=> $c->_id];
        }

        if(sizeof($produto->variacoes) > 0){
            $type = 'variable';
        }
        $data = [
            'name' => $request->nome,
            'type' => $type,
            'slug' => $request->woocommerce_slug,
            'status' => $request->woocommerce_status,
            'stock_status' => $request->woocommerce_stock_status,
            'price' => __convert_value_bd($request->woocommerce_valor),
            'description' => $request->woocommerce_descricao,
            'categories' => $categorias,
            'weight' => $request->peso
        ];

        if($request->comprimento){
            $data['dimensions']['length'] = $request->comprimento;
        }
        if($request->largura){
            $data['dimensions']['width'] = $request->largura;
        }
        if($request->altura){
            $data['dimensions']['height'] = $request->altura;
        }

        if($produto->imagem){
            $data['images'][] = 
            [   
                'src' => env('APP_URL') . '/uploads/produtos/'.$produto->imagem
            ];
        }

        if(sizeof($produto->variacoes) > 0){
            $data['attributes'] = [
                [
                    'name' => 'Variação',
                    'position' => 0,
                    'visible' => true,
                    'variation' => true,
                ]
            ];
            foreach($produto->variacoes as $v){
                $data['attributes'][0]['options'][] = $v->descricao;
            }
            // dd($data);

            $data['default_attributes'] = [

                [
                    'name' => 'Variação',
                    'option' => $produto->variacoes[0]->descricao
                ]
            ];

        }
        
        // dd($data);

        $product = $woocommerceClient->post("products", $data);
        // dd($product);
        if(sizeof($produto->variacoes) > 0){
            //salva variações
            foreach($produto->variacoes as $v){

                $dataVariacao = [
                    'regular_price' => $v->valor,
                    'attributes' => [[
                        'name' => 'Variação',
                        'option' => $v->descricao
                    ]]
                ];

                $product_id = $product->id;
                $variation = $woocommerceClient->post("products/$product_id/variations", $dataVariacao);
            }
        }
        // dd($variation);

        // $product = $woocommerceClient->post("products", $data);

        if($product){
            return [
                'sucesso' => 1,
                'product_id' => $product->id
            ];
        }
    }catch(\Exception $e){
        echo $e->getMessage();
        die;
        return [
            'erro' => 1,
            'msg' => $e->getMessage()
        ];
    }

}

private function atualizaProdutoWoocommerce($request, $item){
    $woocommerceClient = $this->utilWocommerce->getConfig($request->empresa_id);
    try{
        $data = [
            'name' => $request->nome,
            'slug' => $request->woocommerce_slug,
            'stock_status' => $request->woocommerce_stock_status,
            'status' => $request->woocommerce_status,
            'price' => __convert_value_bd($request->woocommerce_valor),
            'description' => $request->woocommerce_descricao,
            'weight' => $request->peso
        ];
        if($request->comprimento){
            $data['dimensions']['length'] = $request->comprimento;
        }
        if($request->largura){
            $data['dimensions']['width'] = $request->largura;
        }
        if($request->altura){
            $data['dimensions']['height'] = $request->altura;
        }

        $endPoint = 'products';
        $product = $woocommerceClient->put($endPoint."/$item->woocommerce_id", $data);
            // dd($product);
        if($product){
            return [
                'sucesso' => 1,
                'product_id' => $product->id
            ];
        }
    }catch(\Exception $e){
        // echo $e->getMessage();
        // die;
        return [
            'erro' => 1,
            'msg' => $e->getMessage()
        ];
    }
}

private function criaAnuncio($request, $produto){
    $this->__validaToken();

    $dataMercadoLivre = [
        'title' => $produto->nome,
        'category_id' => $request->mercado_livre_categoria,
        'price' => __convert_value_bd($request->mercado_livre_valor),
        'available_quantity' => __convert_value_bd($request->quantidade_mercado_livre),
        'currency_id' => 'BRL',
        'condition' => $request->condicao_mercado_livre,
        'buying_mode' => 'buy_it_now',
        'listing_type_id' => $request->mercado_livre_tipo_publicacao,
        'video_id' => $request->mercado_livre_youtube,
    ];

    if($request->quantidade_mercado_livre){
        $qtd = __convert_value_bd($request->quantidade_mercado_livre);
        $this->utilEstoque->incrementaEstoque($produto->id, $qtd, null);

        $transacao = Estoque::where('produto_id', $produto->id)->orderBy('id', 'desc')->first();
        $tipo = 'incremento';
        $codigo_transacao = $transacao->id;
        $tipo_transacao = 'alteracao_estoque';

        $this->utilEstoque->movimentacaoProduto($produto->id, $qtd, $tipo, $codigo_transacao, $tipo_transacao, \Auth::user()->id);
    }

    if($request->marca_id){
        $marca = Marca::findOrFail($request->marca_id);
        $dataMercadoLivre['attributes'][] = [
            'id' => 'BRAND',
            'value_name' => $marca->nome
        ];
    }

    if($request->mercado_livre_modelo){
        $dataMercadoLivre['attributes'][] = [
            'id' => 'MODEL',
            'value_name' => $request->mercado_livre_modelo
        ];
    }
        // dd($dataMercadoLivre);

    $configMercadoLivre = MercadoLivreConfig::where('empresa_id', $request->empresa_id)
    ->first();

    if($produto->img){
        $dataMercadoLivre['pictures'][0]['source'] = $configMercadoLivre->url . $produto->img;
    }

    $curl = curl_init();
    curl_setopt($curl, CURLOPT_URL, "https://api.mercadolibre.com/items");
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($curl, CURLOPT_ENCODING, '');
    curl_setopt($curl, CURLOPT_MAXREDIRS, 10);
    curl_setopt($curl, CURLOPT_TIMEOUT, 0);
    curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
    curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'POST');
    curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($dataMercadoLivre));

    curl_setopt($curl, CURLOPT_HTTPHEADER, [
        'Authorization: Bearer ' . $configMercadoLivre->access_token,
        'Content-Type: application/json'
    ]);

    $res = curl_exec($curl);
    $retorno = json_decode($res);
    if($retorno->status == 400){
        $msg = $this->trataErros($retorno);
        return [
            'erro' => 1,
            'msg' => $msg
        ];
    }
        // incluir descricao

    if($request->mercado_livre_descricao){
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL, "https://api.mercadolibre.com/items/$retorno->id/description");
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($curl, CURLOPT_ENCODING, '');
        curl_setopt($curl, CURLOPT_MAXREDIRS, 10);
        curl_setopt($curl, CURLOPT_TIMEOUT, 0);
        curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
        curl_setopt($curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
        curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'POST');
        curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode(
            ['plain_text' => $request->mercado_livre_descricao]
        ));

        curl_setopt($curl, CURLOPT_HTTPHEADER, [
            'Authorization: Bearer ' . $configMercadoLivre->access_token,
            'Content-Type: application/json'
        ]);

        $res = curl_exec($curl);
    }

    return [
        'sucesso' => 1,
        'retorno' => $retorno
    ];

}

private function trataErros($retorno){
    $msg = "";
    foreach($retorno->cause as $c){
        $msg .= $c->message;
    }
    return $msg;
}

private function atualizaAnuncio($request, $produto){

    $configMercadoLivre = MercadoLivreConfig::where('empresa_id', $request->empresa_id)
    ->first();

    $curl = curl_init();

    curl_setopt($curl, CURLOPT_URL, "https://api.mercadolibre.com/items/$produto->mercado_livre_id");
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($curl, CURLOPT_ENCODING, '');
    curl_setopt($curl, CURLOPT_MAXREDIRS, 10);
    curl_setopt($curl, CURLOPT_TIMEOUT, 0);
    curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
    curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'GET');

    curl_setopt($curl, CURLOPT_HTTPHEADER, [
        'Authorization: Bearer ' . $configMercadoLivre->access_token,
        'Content-Type: application/json'
    ]);

    $res = curl_exec($curl);
    $prod = json_decode($res);
        // dd($prod);

    $dataMercadoLivre = [
        'title' => $produto->nome,
            // 'category_id' => $request->mercado_livre_categoria,
            // 'price' => __convert_value_bd($request->mercado_livre_valor),
            // 'available_quantity' => __convert_value_bd($request->quantidade_mercado_livre),
        'currency_id' => 'BRL',
            // 'condition' => $request->condicao_mercado_livre,
            // 'buying_mode' => 'buy_it_now',
        'video_id' => $request->mercado_livre_youtube,
    ];

    if(sizeof($prod->variations) > 0){
        $dataMercadoLivre['variations'][0]['price'] = __convert_value_bd($request->mercado_livre_valor);
    }else{
        $dataMercadoLivre['price'] = __convert_value_bd($request->mercado_livre_valor);
    }

        // dd($dataMercadoLivre);
    $curl = curl_init();
    curl_setopt($curl, CURLOPT_URL, "https://api.mercadolibre.com/items/$produto->mercado_livre_id");
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($curl, CURLOPT_ENCODING, '');
    curl_setopt($curl, CURLOPT_MAXREDIRS, 10);
    curl_setopt($curl, CURLOPT_TIMEOUT, 0);
    curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
    curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'PUT');
    curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($dataMercadoLivre));

    curl_setopt($curl, CURLOPT_HTTPHEADER, [
        'Authorization: Bearer ' . $configMercadoLivre->access_token,
        'Content-Type: application/json',
        'Accept: application/json',
    ]);
    $res = curl_exec($curl);
    $retorno = json_decode($res);

    if($retorno->status == 400){
        $msg = $this->trataErros($retorno);
        return [
            'erro' => 1,
            'msg' => $msg
        ];
    }

    if($request->mercado_livre_descricao){
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL, "https://api.mercadolibre.com/items/$produto->mercado_livre_id/description");
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($curl, CURLOPT_ENCODING, '');
        curl_setopt($curl, CURLOPT_MAXREDIRS, 10);
        curl_setopt($curl, CURLOPT_TIMEOUT, 0);
        curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
        curl_setopt($curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
        curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'POST');
        curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode(
            ['plain_text' => $request->mercado_livre_descricao]
        ));

        curl_setopt($curl, CURLOPT_HTTPHEADER, [
            'Authorization: Bearer ' . $configMercadoLivre->access_token,
            'Content-Type: application/json'
        ]);

        $res = curl_exec($curl);
    }

    return [
        'sucesso' => 1,
        'retorno' => $retorno
    ];
}

public function etiqueta(Request $request, $id)
{
    $item = Produto::findOrFail($id);

    if(!$item->codigo_barras){
        session()->flash('flash_error', 'Produto sem código de barras definido');
        return redirect()->route('produtos.index');
    }
    $modelos = ModeloEtiqueta::where('empresa_id', $item->empresa_id)->get();
    return view('produtos.etiqueta', compact('item', 'modelos'));
}

public function etiquetaStore(Request $request, $id){
    if (!is_dir(public_path('barcode'))) {
        mkdir(public_path('barcode'), 0777, true);
    }
    $files = glob(public_path("barcode/*")); 

    foreach($files as $file){ 
        if(is_file($file)) {
            unlink($file); 
        }
    }

    $item = Produto::findOrFail($id);

    $nome = $item->nome;
    $codigo = $item->codigo_barras;
    $valor = $item->valor_unitario;
    $unidade = $item->unidade;

    if($codigo == "" || $codigo == "SEM GTIN" || $codigo == "sem gtin"){
        session()->flash('flash_error', 'Produto sem código de barras definido');
        return redirect()->back();
    }

    $data = [
        'nome_empresa' => $request->nome_empresa ? true : false,
        'nome_produto' => $request->nome_produto ? true : false,
        'valor_produto' => $request->valor_produto ? true : false,
        'cod_produto' => $request->codigo_produto ? true : false,
        'tipo' => $request->tipo,
        'codigo_barras_numerico' => $request->codigo_barras_numerico ? true : false,
        'nome' => $nome,
        'codigo' => $item->numero_sequencial,
        'valor' => $valor,
        'unidade' => $unidade,
        'valor_atacado' => $item->valor_atacado,
        'referencia' => $item->referencia,
        'empresa' => $item->empresa->nome
    ];
    $generatorPNG = new \Picqer\Barcode\BarcodeGeneratorPNG();

    $adds = [];
    if($request->produto_add_id){
        for($i=0; $i<sizeof($request->produto_add_id); $i++){
            if($request->produto_add_id[$i] && $request->quantidade_add[$i]){
                $prod = Produto::findOrFail($request->produto_add_id[$i]);
                $adds[] = [
                    'nome_empresa' => $request->nome_empresa ? true : false,
                    'nome_produto' => $request->nome_produto ? true : false,
                    'valor_produto' => $request->valor_produto ? true : false,
                    'cod_produto' => $request->codigo_produto ? true : false,
                    'tipo' => $request->tipo,
                    'codigo_barras_numerico' => $request->codigo_barras_numerico ? true : false,
                    'nome' => $prod->nome,
                    'codigo' => $prod->numero_sequencial,
                    'valor' => $prod->valor_unitario,
                    'unidade' => $prod->unidade,
                    'valor_atacado' => $prod->valor_atacado,
                    'referencia' => $prod->referencia,
                    'empresa' => $item->empresa->nome,
                    'quantidade' => $request->quantidade_add[$i],
                ];
            }
        }
    }

    $bar_code = $generatorPNG->getBarcode($codigo, $generatorPNG::TYPE_EAN_13);

    $rand = rand(1000, 9999);
    file_put_contents(public_path("barcode")."/$rand.png", $bar_code);
    $quantidade_por_linhas = $request->etiquestas_por_linha;
    $quantidade = $request->quantidade_etiquetas;
    $altura = $request->altura;
    $largura = $request->largura;
    $distancia_topo = $request->distancia_etiquetas_topo;
    $distancia_lateral = $request->distancia_etiquetas_lateral;
    $tamanho_fonte = $request->tamanho_fonte;
    $distancia_entre_linhas = $request->distancia_entre_linhas;
    $referencia = $request->referencia;
    $valor_atacado = $request->valor_atacado;

    $tamanho_codigo = $request->tamanho_codigo_barras;

    return view('produtos.etiqueta_print', compact('altura', 'largura', 'rand', 'codigo', 'quantidade', 'distancia_topo',
        'distancia_lateral', 'quantidade_por_linhas', 'tamanho_fonte', 'tamanho_codigo', 'data', 'distancia_entre_linhas', 'referencia', 
        'valor_atacado', 'adds'));

}

public function reajuste(Request $request){
    $nome = $request->nome;
    $categoria_id = $request->categoria_id;
    $marca_id = $request->marca_id;
    $cst_csosn = $request->cst_csosn;
    $local_id = $request->local_id;
    $pendentes = $request->pendentes;

    $data = [];
    $locais = __getLocaisAtivoUsuario();
    $locais = $locais->pluck(['id']);

    if($nome || $categoria_id || $cst_csosn || $marca_id || $local_id || $pendentes){
        $data = Produto::where('empresa_id', $request->empresa_id)
        ->select('produtos.*')
        ->when($nome, function ($query) use ($nome) {
            $query->where('nome', 'like', "%$nome%");
        })
        ->when($cst_csosn, function ($query) use ($cst_csosn) {
            $query->where('cst_csosn', $cst_csosn);
        })
        ->when($marca_id, function ($query) use ($marca_id) {
            $query->where('marca_id', $marca_id);
        })
        ->when($categoria_id, function ($query) use ($categoria_id) {
            return $query->where(function($q) use ($categoria_id)
            {
                $q->where('categoria_id', $categoria_id)
                ->orWhere('sub_categoria_id', $categoria_id);
            });
        })
        ->when($local_id, function ($query) use ($local_id) {
            return $query->join('produto_localizacaos', 'produto_localizacaos.produto_id', '=', 'produtos.id')
            ->where('produto_localizacaos.localizacao_id', $local_id);
        })
        ->when(!$local_id, function ($query) use ($locais) {
            return $query->join('produto_localizacaos', 'produto_localizacaos.produto_id', '=', 'produtos.id')
            ->whereIn('produto_localizacaos.localizacao_id', $locais);
        })
        ->when($pendentes, function ($query) {
            return $query->where(function($q)
            {
                $q->where('cst_csosn', null)
                ->orWhere('cst_csosn', '')
                ->orWhere('cst_pis', null)
                ->orWhere('cst_pis', '')
                ->orWhere('cst_cofins', null)
                ->orWhere('cst_cofins', '')
                ->orWhere('cst_ipi', null)
                ->orWhere('cst_ipi', '')
                ->orWhere('cfop_estadual', null)
                ->orWhere('cfop_estadual', '')
                ->orWhere('cfop_outro_estado', null)
                ->orWhere('cfop_outro_estado', '')
                ->orWhere('cfop_entrada_estadual', null)
                ->orWhere('cfop_entrada_estadual', '')
                ->orWhere('cfop_entrada_outro_estado', null)
                ->orWhere('cfop_entrada_outro_estado', '');
            });
        })
        ->get();
    }

    $categorias = CategoriaProduto::where('empresa_id', request()->empresa_id)
    ->where('status', 1)->get();
    $marcas = Marca::where('empresa_id', request()->empresa_id)->get();
    $padroes = PadraoTributacaoProduto::where('empresa_id', request()->empresa_id)->get();

    return view('produtos.reajuste', compact('data', 'categorias', 'marcas', 'padroes'));
}

public function reajusteUpdate(Request $request){
    try{
        for($i=0; $i<sizeof($request->produto_id); $i++){
            $item = Produto::findOrFail($request->produto_id[$i]);

            if(isset($request->locais)){
                $item->locais()->delete();
                for($j=0; $j<sizeof($request->locais); $j++){
                    ProdutoLocalizacao::updateOrCreate([
                        'produto_id' => $item->id, 
                        'localizacao_id' => $request->locais[$j]
                    ]);
                }
            }

            $item->padrao_id = $request->padrao_id;

            $item->valor_unitario = __convert_value_bd($request->valor_unitario[$i]);
            $item->valor_compra = __convert_value_bd($request->valor_compra[$i]);
            $item->cst_csosn = $request->cst_csosn[$i];
            $item->cst_pis = $request->cst_pis[$i];
            $item->cst_cofins = $request->cst_cofins[$i];
            $item->cst_ipi = $request->cst_ipi[$i];

            $item->perc_icms = $request->perc_icms[$i];
            $item->perc_pis = $request->perc_pis[$i];
            $item->perc_cofins = $request->perc_cofins[$i];
            $item->perc_ipi = $request->perc_ipi[$i];
            $item->perc_red_bc = $request->perc_red_bc[$i] ?? '';
            $item->cfop_estadual = $request->cfop_estadual[$i];
            $item->cfop_outro_estado = $request->cfop_outro_estado[$i];

            $item->cfop_entrada_estadual = $request->cfop_entrada_estadual[$i];
            $item->cfop_entrada_outro_estado = $request->cfop_entrada_outro_estado[$i];
            $item->status = $request->status[$i];

            $item->cst_ibscbs = $request->cst_ibscbs[$i];
            $item->cclass_trib = $request->cclass_trib[$i];
            $item->perc_ibs_uf = $request->perc_ibs_uf[$i];
            $item->perc_ibs_mun = $request->perc_ibs_mun[$i];
            $item->perc_cbs = $request->perc_cbs[$i];
            $item->perc_dif = $request->perc_dif[$i];

            $item->codigo_beneficio_fiscal = $request->codigo_beneficio_fiscal[$i];
            $item->modBCST = $request->modBCST[$i];
            $item->pICMSST = $request->pICMSST[$i];
            $item->pMVAST = $request->pMVAST[$i];
            $item->redBCST = $request->redBCST[$i];
            $item->pICMSEfet = $request->pICMSEfet[$i];
            $item->pRedBCEfet = $request->pRedBCEfet[$i];
            
            $item->save();
        }

        session()->flash("flash_success", "Produtos alterados!");
        return redirect()->route('produtos.index');

    } catch (\Exception $e) {
        session()->flash("flash_error", "Algo deu errado: " . $e->getMessage());
        return redirect()->back();
    }
}

public function uploadImagens(){
    return view('produtos.seleciona_imagens');
}

public function uploadMultiple(Request $request){
    if (!is_dir(public_path('upload_temp'))) {
        mkdir(public_path('upload_temp'), 0777, true);
    }
    $this->clearFolder(public_path('upload_temp'));

    if ($request->hasfile('imagens')) {
        foreach ($request->file('imagens') as $file) {
            $ext = $file->getClientOriginalExtension();
            $filename = Str::random(20) .'.'. $ext;
            $file->move(public_path('upload_temp/'), $filename);
        }
    }

    return redirect()->route('produtos.vincula-imagens');
}

public function vinculaImagens(){
    $files = glob(public_path('upload_temp/*'));
    $data = [];

    foreach($files as $file){
        $img = explode("upload_temp", $file);
        $item = [
            'diretorio' => $file,
            'img' => "/upload_temp".$img[1]
        ];
        $data[] = $item;
    }
    return view('produtos.vincula_imagens', compact('data'));

}

public function vincularImagens(Request $request){
    try{
        for($i=0; $i<sizeof($request->produto_id); $i++){
            $produto = Produto::findOrFail($request->produto_id[$i]);
            $img = explode("upload_temp", $request->diretorio[$i]);
            $filename = str_replace("/", "", $img[1]);
            $produto->imagem = $filename;
            $produto->save();
            copy($request->diretorio[$i], public_path("/uploads/produtos/").$filename);
        }

        $this->clearFolder(public_path('upload_temp'));
        session()->flash("flash_success", "Imagens cadastradas!");
        return redirect()->route('produtos.index');
    }catch(\Exception $e){
        session()->flash("flash_error", $e->getMessage());
        return redirect()->back();
    }

}

private function clearFolder($destino){
    $files = glob($destino."/*");
    foreach($files as $file){ 
        if(is_file($file)) unlink($file); 
    }
}

public function ibpt(Request $request){
    $empresa = Empresa::findOrFail($request->empresa_id);
    $ibptService = new IbptService($empresa->token_ibpt, preg_replace('/[^0-9]/', '', $empresa->cpf_cnpj));
    $produtos = Produto::where('empresa_id', $request->empresa_id)
    ->limit(10)
    ->get();

    $contIbpt = 0;
    $totalDeProdutos = sizeof($produtos);
    foreach($produtos as $p){
        if($p->ncm){
            $data = [
                'ncm' => preg_replace('/[^0-9]/', '', $p->ncm),
                'uf' => $empresa->cidade->uf,
                'extarif' => 0,
                'descricao' => $p->nome,
                'unidadeMedida' => $p->unidade,
                'valor' => number_format(0, 2),
                'gtin' => $p->codBarras,
                'codigoInterno' => 0
            ];
            $resp = $ibptService->consulta($data);

            try{
                if($p->ibpt){
                    $ibpt = $p->ibpt;
                    $ibpt->codigo = $resp->Codigo;
                    $ibpt->uf = $resp->UF;
                    $ibpt->descricao = $resp->Descricao;
                    $ibpt->nacional = $resp->Nacional;
                    $ibpt->estadual = $resp->Estadual;
                    $ibpt->importado = $resp->Importado;
                    $ibpt->municipal = $resp->Municipal;
                    $ibpt->vigencia_inicio = $resp->VigenciaInicio;
                    $ibpt->vigencia_fim = $resp->VigenciaFim;
                    $ibpt->chave = $resp->Chave;
                    $ibpt->versao = $resp->Versao;
                    $ibpt->fonte = $resp->Fonte;
                    $ibpt->save();
                }else{
                    $dataIbpt = [
                        'produto_id' => $p->id,
                        'codigo' => $resp->Codigo,
                        'uf' => $resp->UF, 
                        'descricao' => $resp->Descricao,
                        'nacional' => $resp->Nacional,
                        'estadual' => $resp->Estadual,
                        'importado' => $resp->Importado,
                        'municipal' => $resp->Municipal,
                        'vigencia_inicio' => $resp->VigenciaInicio,
                        'vigencia_fim' => $resp->VigenciaFim,
                        'chave' => $resp->Chave,
                        'versao' => $resp->Versao,
                        'fonte' => $resp->Fonte
                    ];

                    ProdutoIbpt::create($dataIbpt);
                }
                $contIbpt++;
            }catch(\Exception $e){


            }
        }
    }

    $msg = "Total de produtos cadastrados: $totalDeProdutos, total de produtos com IBPT: $contIbpt";
    session()->flash("flash_success", $msg);
    return redirect()->back();
}

public function alterarValorEstoque(){
    $categorias = CategoriaProduto::where('empresa_id', request()->empresa_id)
    ->orderBy('nome')
    ->where('status', 1)->get();

    $marcas = Marca::where('empresa_id', request()->empresa_id)
    ->orderBy('nome')->get();

    return view('produtos.alterar_valor_estoque', compact('categorias', 'marcas'));
}

public function buscarAjuste(Request $request){

    $local_id = $request->local_id;
    $query = Produto::query();

    if ($request->nome) {
        $query->where('nome', 'like', "%{$request->nome}%");
    }

    if ($request->codigo_barras) {
        $query->where('codigo_barras', $request->codigo_barras);
    }

    if ($request->categoria_id) {
        $query->where('categoria_id', $request->categoria_id);
    }

    if ($request->marca_id) {
        $query->where('marca_id', $request->marca_id);
    }

    if ($request->local_id) {
        $query->join('estoques', 'estoques.produto_id', '=', 'produtos.id')
        ->where('local_id', $request->local_id);
    }

    $produtos = $query->select('produtos.*')->where('empresa_id', $request->empresa_id)->take(50)->get();

    return view('produtos.partials.tabela_ajuste', compact('produtos', 'local_id'));
}

public function alterarCampo(Request $request)
{
    $produto = Produto::find($request->id);

    if (!$produto) {
        return response()->json(['erro' => 'Produto não encontrado'], 404);
    }

    $campo = $request->campo;
    $valor = $request->valor;
    $local_id = $request->local_id;

    // atualizar
    if($campo == 'valor_venda'){
        $produto->valor_unitario = __convert_value_bd($valor);
    }

    if($campo == 'valor_compra'){
        $produto->valor_compra = __convert_value_bd($valor);
    }

    if($produto->valor_compra > 0 && $produto->valor_unitario > 0){
        $produto->percentual_lucro = ($produto->valor_unitario / $produto->valor_compra)*100;
    }else{
        $produto->percentual_lucro = 100;
    }
    $produto->save();

    if($campo == 'quantidade_estoque'){
        $estoque = $produto->estoque;
        if($estoque == null){

            $this->utilEstoque->incrementaEstoque($produto->id, $valor, null, $local_id);
            $transacao = Estoque::where('produto_id', $produto->id)->orderBy('id', 'desc')->first();
            $tipo = 'incremento';
            $codigo_transacao = $transacao->id;
            $tipo_transacao = 'alteracao_estoque';
            $this->utilEstoque->movimentacaoProduto($produto->id, $valor, $tipo, $codigo_transacao, $tipo_transacao, \Auth::user()->id, $local_id);  
        }else{
            if($local_id){
                $estoque = Estoque::where('produto_id', $produto->id)->where('local_id', $local_id)->first();
            }

            if($estoque){
                // return response()->json($estoque, 401);

                $estoque->quantidade = $valor;
                $estoque->save();
            }
        }
    }


    return response()->json(['sucesso' => true]);
}

}
