<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\Empresa;
use App\Models\CategoriaProduto;
use App\Models\Produto;
use App\Models\Cliente;
use App\Models\Nfce;

use App\Models\NaturezaOperacao;
use App\Models\Transportadora;

use App\Models\VendaSuspensa;
use App\Models\ConfigGeral;
use App\Models\Pedido;
use App\Models\ConfiguracaoCardapio;
use Illuminate\Support\Facades\DB;

class PdvMoboController extends Controller
{
    public function index(Request $request){

        if (!file_exists(public_path('style_pdv_mobo.css'))) {
            die;
        }

        $config = Empresa::findOrFail(request()->empresa_id);
        if($config == null){
            session()->flash("flash_warning", "Configure antes de continuar!");
            return redirect()->route('config.index');
        }

        if (!__isCaixaAberto()) {
            session()->flash("flash_warning", "Abrir caixa antes de continuar!");
            return redirect()->route('caixa.create');
        }

        $caixa = __isCaixaAberto();
        $categorias = CategoriaProduto::where('empresa_id', request()->empresa_id)->where('status', 1)
        ->where('categoria_id', null)
        ->get();

        $mes = date('m');
        $ano = date('Y');

        $produtos = Produto::where('produtos.empresa_id', $request->empresa_id)
        ->leftJoin('item_nfces', function($join) use ($mes, $ano){
            $join->on('item_nfces.produto_id', '=', 'produtos.id')
            ->whereMonth('item_nfces.created_at', $mes)
            ->whereYear('item_nfces.created_at', $ano);
        })
        ->leftJoin('estoques', 'estoques.produto_id', '=', 'produtos.id')
        ->select(
            'produtos.id',
            DB::raw('COALESCE(FLOOR(estoques.quantidade), 0) as estoque_atual'),
            'produtos.numero_sequencial',
            'produtos.codigo_barras',
            'produtos.referencia',
            'produtos.referencia_balanca',
            'produtos.valor_unitario',
            'produtos.nome',
            'produtos.categoria_id',
            'produtos.imagem',
            'produtos.gerenciar_estoque',
            'produtos.valor_atacado',
            'produtos.valor_minimo_venda',
            'produtos.quantidade_atacado',
            DB::raw('COALESCE(SUM(item_nfces.quantidade), 0) as total_vendido_mes')
        )
        ->where('produtos.status', 1)
        ->groupBy(
            'produtos.id',
            'produtos.numero_sequencial',
            'produtos.codigo_barras',
            'produtos.referencia',
            'produtos.referencia_balanca',
            'produtos.valor_unitario',
            'produtos.nome',
            'produtos.categoria_id',
            'produtos.imagem',
            'produtos.gerenciar_estoque',
            'produtos.valor_atacado',
            'produtos.valor_minimo_venda',
            'produtos.quantidade_atacado'
        )
        ->orderByDesc('total_vendido_mes')
        ->orderBy('produtos.nome')
        ->with('adicionais', 'categoria')
        ->limit(50)
        ->get();

        $clientes = Cliente::where('empresa_id', request()->empresa_id)
        ->select('razao_social', 'cpf_cnpj', 'id', 'telefone')
        ->orderBy('razao_social')
        ->where('status', 1)
        ->get();

        $config = ConfigGeral::where('empresa_id', request()->empresa_id)->first();
        $tiposPagamento = Nfce::tiposPagamento();

        if($config != null){
            $config->tipos_pagamento_pdv = $config != null && $config->tipos_pagamento_pdv ? json_decode($config->tipos_pagamento_pdv) : [];
            $temp = [];
            if(sizeof($config->tipos_pagamento_pdv) > 0){
                foreach($tiposPagamento as $key => $t){
                    if(in_array($t, $config->tipos_pagamento_pdv)){
                        if($t == 'Pagamento Instantâneo (PIX)'){
                            $t = 'PIX';
                        }
                        $temp[$key] = $t;
                    }
                }
                $tiposPagamento = $temp;
            }
        }

        $item = null;
        $itens = [];
        $isVendaSuspensa = 0;
        $title = 'Nova Venda - PDV';

        if(isset($request->venda_suspensa)){
            $item = VendaSuspensa::findOrfail($request->venda_suspensa);
            $isVendaSuspensa = 1;
            $title = 'Venda Suspensa';
            foreach($item->itens as $i){
                $itens[] = [
                    'id' => $i->produto_id,
                    'nome' => $i->produto->nome,
                    'valor_unitario' => $i->valor_unitario,
                    'subtotal' => $i->sub_total,
                    'quantidade' => (int)$i->quantidade,
                    'referencia' => $i->produto->referencia,
                    'codigo_barras' => $i->produto->codigo_barras,
                    'categoria_id' => $i->produto->categoria_id,
                    'img' => $i->produto->imgApp,
                    'observacao' => $i->observacao,
                ];
            }
        }

        $isComanda = 0;
        if(isset($request->pedido_id)){
            $item = Pedido::findOrfail($request->pedido_id);
            $isComanda = 1;
            $title = 'Comanda';
            if($item->status == 0){
                session()->flash("flash_warning", "Esta comanda já esta finalizada!");
                return redirect()->route('pdv-mobo.index');
            }
            foreach($item->itens as $i){
                $itens[] = [
                    'id' => $i->produto_id,
                    'nome' => $i->produto->nome,
                    'valor_unitario' => $i->valor_unitario,
                    'quantidade' => (int)$i->quantidade,
                    'subtotal' => $i->sub_total,
                    'referencia' => $i->produto->referencia,
                    'codigo_barras' => $i->produto->codigo_barras,
                    'categoria_id' => $i->produto->categoria_id,
                    'img' => $i->produto->imgApp,
                    'observacao' => $i->observacao,
                ];
            }
        }

        if(isset($request->comanda)){
            $item = Pedido::where('comanda', $request->comanda)
            ->where('status', 1)
            ->where('empresa_id', $request->empresa_id)->first();
            if($item == null){
                $data = [
                    'cliente_nome' => '',
                    'cliente_fone' => '',
                    'comanda' => $request->comanda,
                    'total' => 0,
                    'empresa_id' => $request->empresa_id,
                    'local_pedido' => 'PDV'
                ];
                $item = Pedido::create($data);
            }

            $isComanda = 1;
            $title = 'Comanda';

            foreach($item->itens as $i){
                $itens[] = [
                    'id' => $i->produto_id,
                    'nome' => $i->produto->nome,
                    'valor_unitario' => $i->valor_unitario,
                    'quantidade' => (int)$i->quantidade,
                    'subtotal' => $i->sub_total,
                    'referencia' => $i->produto->referencia,
                    'codigo_barras' => $i->produto->codigo_barras,
                    'categoria_id' => $i->produto->categoria_id,
                    'img' => $i->produto->imgApp,
                    'observacao' => $i->observacao,
                ];
            }
        }

        $modelo = '';
        $transportadoras = Transportadora::where('empresa_id', request()->empresa_id)
        ->orderBy('razao_social')
        ->get();
        $naturezas = [];
        $naturezaPadrao = null;
        if(isset($request->modelo)){
            $title = 'Nova Venda';
            $modelo = $request->modelo;
            $naturezas = NaturezaOperacao::where('empresa_id', request()->empresa_id)->get();
            if (sizeof($naturezas) == 0) {
                session()->flash("flash_warning", "Primeiro cadastre um natureza de operação!");
                return redirect()->route('natureza-operacao.create');
            }

            $naturezaPadrao = NaturezaOperacao::where('empresa_id', request()->empresa_id)
            ->where('padrao', 1)->first();
        }

        $configCardapio = ConfiguracaoCardapio::where('empresa_id', $request->empresa_id)->first();

        return view('pdv_mobo.create', compact('config', 'categorias', 'caixa', 'produtos', 'clientes', 'tiposPagamento', 'isVendaSuspensa', 
            'item', 'itens', 'title', 'isComanda', 'configCardapio', 'modelo', 'transportadoras', 'naturezas', 'naturezaPadrao'));
    }
}
