<?php

namespace App\Http\Controllers\Ecommerce;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Models\Carrinho;
use App\Models\Cliente;
use App\Models\PedidoEcommerce;
use App\Models\ItemPedidoEcommerce;
use App\Models\EcommerceConfig;
use App\Models\CategoriaProduto;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Str;
use App\Utils\UploadUtil;

class PagamentoController extends Controller
{

    protected $util;

    public function __construct(UploadUtil $util)
    {
        $this->util = $util;
        // Session managed by Laravel
    }

    public function index(Request $request){

        $carrinho = $this->_getCarrinho();

        $config = EcommerceConfig::findOrfail($request->loja_id);
        if($carrinho == []){
            return redirect()->route('loja.index', 'link='.$config->loja_id);
        }
        $categorias = CategoriaProduto::where('ecommerce', 1)->where('status', 1)
        ->where('empresa_id', $config->empresa_id)->get();

        $clienteLogado = $this->_getClienteLogado();
        if(!$clienteLogado){
            session()->flash("flash_error", "Cliente não localizado!");
            return redirect()->route('loja.login', 'link='.$config->loja_id);
        }
        $tiposPagamento = json_decode($config->tipos_pagamento);
        if(sizeof($tiposPagamento) == 0){
            session()->flash("flash_error", "Nenhum tipo de pagamento!");
            return redirect()->back();
        }

        return view('loja.pagamento', compact('carrinho', 'config', 'categorias', 'tiposPagamento'));
    }

    public function novaChavePix(Request $request){

        $item = PedidoEcommerce::where('hash_pedido',$request->hash)->first();
        $clienteLogado = $this->_getClienteLogado();

        if($item == null){
            session()->flash("flash_error", "Algo deu errado");
            return redirect()->back();
        }
        if($item->cliente_id != $clienteLogado){
            session()->flash("flash_error", "Algo deu errado");
            return redirect()->back();
        }
        $config = EcommerceConfig::findOrfail($request->loja_id);
        
        $categorias = CategoriaProduto::where('ecommerce', 1)->where('status', 1)
        ->where('empresa_id', $config->empresa_id)->get();

        return view('loja.pagamento_pix', compact('config', 'categorias', 'item'));

    }

    private function _getClienteLogado(){
        if(isset($_SESSION['cliente_ecommerce'])){
            return $_SESSION['cliente_ecommerce'];
        }
        return null;
    }

    private function _getCarrinho(){
        $data = [];
        if(isset($_SESSION["session_cart"])){
            $data = Carrinho::where('session_cart', $_SESSION["session_cart"])
            ->first();
        }
        return $data;
    }

    public function pagamentoNovoPix(Request $request){
        try{
            $config = EcommerceConfig::findOrfail($request->loja_id);
            $pedido = PedidoEcommerce::findOrfail($request->pedido_id);
            $result = DB::transaction(function () use ($request, $config, $pedido) {

                \MercadoPago\SDK::setAccessToken($config->mercadopago_access_token);
                $payment = new \MercadoPago\Payment();
                $payment->transaction_amount = $pedido->valor_total;
                $payment->description = "Pedido $pedido->hash_pedido, loja " . $config->nome;
                $payment->payment_method_id = "pix";

                $cep = str_replace("-", "", $config->cep);
                $payment->payer = array(
                    "email" => $request->payerEmail,
                    "first_name" => $request->payerFirstName,
                    "last_name" => $request->payerLastName,
                    "identification" => array(
                        "type" => $request->docType,
                        "number" => preg_replace('/[^0-9]/', '', $request->docNumber)
                    ),
                    "address"=>  array(
                        "zip_code" => $cep,
                        "street_name" => $config->rua,
                        "street_number" => $config->numero,
                        "neighborhood" => $config->bairro,
                        "city" => $config->cidade->nome,
                        "federal_unit" => $config->cidade->uf
                    )
                );

                $payment->save();

                if($payment->transaction_details){
                    $pedido->status_pagamento = $payment->status;
                    $pedido->qr_code_base64 = $payment->point_of_interaction->transaction_data->qr_code_base64;
                    $pedido->qr_code = $payment->point_of_interaction->transaction_data->qr_code;
                    $pedido->transacao_id = (string)$payment->id;
                    $pedido->tipo_pagamento = 'pix';
                    $pedido->save();

                    session()->flash("flash_success", "PIX gerado!");
                    return [
                        'sucesso' => 1,
                        'transacao_id' => $pedido->transacao_id
                    ];
                }else{

                    session()->flash("flash_error", $payment->error);
                    return [
                        'erro' => $payment->error
                    ];
                }
            });

            if(isset($result['sucesso'])){

                return redirect()->route('loja.finalizar', 'link='.$config->loja_id .'&transacao_id='.$result['transacao_id'].'&hash_pedido='.$pedido->hash_pedido);
            }else{
                return redirect()->back();
            }
        }catch(\Exception $e){
            session()->flash("flash_error", $e->getMessage());
            return redirect()->back();
        }
    }

    public function pagamentoPix(Request $request){
        try{
            $config = EcommerceConfig::findOrfail($request->loja_id);
            $result = DB::transaction(function () use ($request, $config) {

                $pedido = $this->createPedido($request);
                $carrinho = $this->_getCarrinho();

                \MercadoPago\SDK::setAccessToken($config->mercadopago_access_token);
                $payment = new \MercadoPago\Payment();
                $payment->transaction_amount = $pedido->valor_total;
                $payment->description = "Pedido $pedido->hash_pedido, loja " . $config->nome;
                $payment->payment_method_id = "pix";

                $cep = str_replace("-", "", $config->cep);
                $payment->payer = array(
                    "email" => $request->payerEmail,
                    "first_name" => $request->payerFirstName,
                    "last_name" => $request->payerLastName,
                    "identification" => array(
                        "type" => $request->docType,
                        "number" => preg_replace('/[^0-9]/', '', $request->docNumber)
                    ),
                    "address"=>  array(
                        "zip_code" => $cep,
                        "street_name" => $config->rua,
                        "street_number" => $config->numero,
                        "neighborhood" => $config->bairro,
                        "city" => $config->cidade->nome,
                        "federal_unit" => $config->cidade->uf
                    )
                );
                $payment->save();

                if($payment->transaction_details){
                    $pedido->status_pagamento = $payment->status;
                    $pedido->qr_code_base64 = $payment->point_of_interaction->transaction_data->qr_code_base64;
                    $pedido->qr_code = $payment->point_of_interaction->transaction_data->qr_code;
                    $pedido->transacao_id = (string)$payment->id;
                    $pedido->tipo_pagamento = 'pix';
                    $pedido->save();

                    session()->flash("flash_success", "PIX gerado!");
                    return [
                        'sucesso' => 1,
                        'transacao_id' => $pedido->transacao_id,
                        'hash_pedido' => $pedido->hash_pedido
                    ];
                }else{

                    session()->flash("flash_error", $payment->error);
                    return [
                        'erro' => $payment->error
                    ];
                }
            });

            if(isset($result['sucesso'])){
                return redirect()->route('loja.finalizar', 'link='.$config->loja_id .'&transacao_id='.$result['transacao_id'].'&hash_pedido='.$result['hash_pedido']);
            }else{
                return redirect()->back();
            }
        }catch(\Exception $e){
            session()->flash("flash_error", $e->getMessage());
            return redirect()->back();
        }
    }

    public function pagamentoBoleto(Request $request){
        try{
            $config = EcommerceConfig::findOrfail($request->loja_id);

            $result = DB::transaction(function () use ($request, $config) {

                $pedido = $this->createPedido($request);
                $carrinho = $this->_getCarrinho();

                \MercadoPago\SDK::setAccessToken($config->mercadopago_access_token);
                $payment = new \MercadoPago\Payment();
                $payment->transaction_amount = $pedido->valor_total;
                $payment->description = "Pedido $pedido->hash_pedido, loja " . $config->nome;
                $payment->payment_method_id = "bolbradesco";

                $cep = str_replace("-", "", $config->cep);
                $payment->payer = array(
                    "email" => $request->payerEmail,
                    "first_name" => $request->payerFirstName,
                    "last_name" => $request->payerLastName,
                    "identification" => array(
                        "type" => $request->docType,
                        "number" => preg_replace('/[^0-9]/', '', $request->docNumber)
                    ),
                    "address"=>  array(
                        "zip_code" => $cep,
                        "street_name" => $config->rua,
                        "street_number" => $config->numero,
                        "neighborhood" => $config->bairro,
                        "city" => $config->cidade->nome,
                        "federal_unit" => $config->cidade->uf
                    )
                );
                $payment->save();

                if($payment->transaction_details){
                    $pedido->status_pagamento = $payment->status;
                    $pedido->transacao_id = (string)$payment->id;
                    $pedido->link_boleto = $payment->transaction_details->external_resource_url;
                    $pedido->tipo_pagamento = 'boleto';
                    $pedido->save();

                    session()->flash("flash_success", "Boleto gerado!");
                    return [
                        'sucesso' => 1,
                        'transacao_id' => $pedido->transacao_id,
                        'hash_pedido' => $pedido->hash_pedido
                    ];
                }else{

                    session()->flash("flash_error", $payment->error);
                    return [
                        'erro' => $payment->error
                    ];
                }
            });

            if(isset($result['sucesso'])){
                return redirect()->route('loja.finalizar', 'link='.$config->loja_id .'&transacao_id='.$result['transacao_id'].'&hash_pedido='.$result['hash_pedido']);
            }else{
                session()->flash("flash_error", $result['erro']);
                return redirect()->back();
            }
        }catch(\Exception $e){
            session()->flash("flash_error", $e->getMessage());
            return redirect()->back();
        }
    }

    public function pagamentoDeposito(Request $request){
        try{
            $config = EcommerceConfig::findOrfail($request->loja_id);
            $pedido = DB::transaction(function () use ($request, $config) {

                $pedido = $this->createPedido($request);
                $carrinho = $this->_getCarrinho();
                $pedido->tipo_pagamento = 'deposito';
                $pedido->save();
                session()->flash("flash_success", "Pedido gerado!");
                return $pedido;
            });

            return redirect()->route('loja.finalizar-deposito', 'link='.$config->loja_id.'&hash='.$pedido->hash_pedido);
        }catch(\Exception $e){
            session()->flash("flash_error", $e->getMessage());
            return redirect()->back();
        }
    }

    // private function trataErros($arr){
    //     $cause = $arr->causes[0];
    //     $errorCode = $cause->code;
    //     $arrCode = $this->arrayErros($arr);
    //     return $arrCode[$errorCode];
    // }

    // private function arrayErros($arr){
    //     return [
    //         '2067' => 'Número documento inválido!',
    //         '13253' => 'Ative o QR code do cadastro!'
    //     ];
    // }

    private function createPedido($request){
        $carrinho = $this->_getCarrinho();

        $config = EcommerceConfig::findOrfail($request->loja_id);

        $clienteLogado = $this->_getClienteLogado();

        $cliente = Cliente::findOrFail($clienteLogado);
        // $cliente->email = $request->payerEmail;
        $cliente->cpf_cnpj = $request->docNumber;
        // $cliente->rua = $request->rua;
        // $cliente->numero = $request->numero;
        // $cliente->bairro = $request->bairro;
        // $cliente->cep = $request->cep;
        $cliente->save();


        $pedido = PedidoEcommerce::create([
            'cliente_id' => $clienteLogado,
            'empresa_id' => $config->empresa_id,
            'endereco_id' => $carrinho->endereco_id,
            'estado' => 'novo',
            'observacao' => $request->observacao ?? '',
            'hash_pedido' => Str::random(12),
            'valor_total' => $carrinho->valor_total,
            'valor_frete' => $carrinho->valor_frete,
            'desconto' => 0,
            'link_boleto' => '',
            'qr_code_base64' => '',
            'qr_code' => '',
            'tipo_frete' => $carrinho->tipo_frete,
            'rua_entrega' => $carrinho->endereco ? $carrinho->endereco->rua : '',
            'cidade_entrega' => $carrinho->endereco ? $carrinho->endereco->cidade->info : '',
            'numero_entrega' => $carrinho->endereco ? $carrinho->endereco->numero : '',
            'referencia_entrega' => $carrinho->endereco ? $carrinho->endereco->referencia : '',
            'bairro_entrega' => $carrinho->endereco ? $carrinho->endereco->bairro : '',
            'cep_entrega' => $carrinho->endereco ? $carrinho->endereco->cep : '',
            'nome' => $request->payerFirstName ?? '',
            'sobre_nome' => $request->payerLastName ?? '',
            'email' => $request->payerEmail ?? '',
            'tipo_documento' => $request->docType ?? '',
            'numero_documento' => $request->docNumber ?? ''
        ]);

        foreach($carrinho->itens as $item){
            $item = ItemPedidoEcommerce::create([
                'pedido_id' => $pedido->id,
                'produto_id' => $item->produto_id,
                'variacao_id' => $item->variacao_id,
                'quantidade' => $item->quantidade,
                'valor_unitario' => $item->valor_unitario,
                'sub_total' => $item->sub_total
            ]);
        }

        return $pedido;
    }

    public function finalizar(Request $request){
        $pedido = PedidoEcommerce::where('hash_pedido', $request->hash_pedido)
        ->first();
        $_SESSION["session_cart"] = null;
        $config = EcommerceConfig::where('empresa_id', $pedido->empresa_id)->first();
        
        if($pedido == null){
            session()->flash("flash_error", "Algo deu errado!");
            return redirect()->route('loja.index', ['link='.$config->loja_id]);
        }

        $categorias = CategoriaProduto::where('ecommerce', 1)->where('status', 1)
        ->where('empresa_id', $config->empresa_id)->get();
        return view('loja.finalizar', compact('pedido', 'config', 'categorias'));
    }

    public function finalizarDeposito(Request $request){

        $pedido = PedidoEcommerce::where('hash_pedido', $request->hash)
        ->first();
        $_SESSION["session_cart"] = null;

        if($pedido == null){
            session()->flash("flash_error", "Algo deu errado!");
            return redirect()->back();
        }
        $config = EcommerceConfig::findOrfail($request->loja_id);
        $categorias = CategoriaProduto::where('ecommerce', 1)->where('status', 1)
        ->where('empresa_id', $config->empresa_id)->get();
        return view('loja.finalizar', compact('pedido', 'config', 'categorias'));
    }

    public function pagamentoCartao(Request $request){
        try{
            $config = EcommerceConfig::findOrfail($request->loja_id);
            $result = DB::transaction(function () use ($request, $config) {

                $pedido = $this->createPedido($request);
                $carrinho = $this->_getCarrinho();
                
                //teste
                // $pedido->status_pagamento = 'approved';
                // $pedido->transacao_id = "123";
                // $pedido->tipo_pagamento = 'cartao';
                // $pedido->save();

                // session()->flash("flash_success", "Pagamento concluído com sucesso!");
                // return [
                //     'sucesso' => 1,
                //     'hash_pedido' => $pedido->hash_pedido
                // ];
                //teste

                \MercadoPago\SDK::setAccessToken($config->mercadopago_access_token);

                $payment = new \MercadoPago\Payment();
                $payment->transaction_amount = (float)$request->transactionAmount;
                $payment->token = $request->token;
                $payment->description = "Pagamento do pedido #" . $pedido->hash_pedido;
                $payment->installments = (int)$request->installments;
                $payment->payment_method_id = $request->paymentMethodId;

                $payer = new \MercadoPago\Payer();
                $payer->email = $request->email;
                $payer->identification = array(
                    "type" => $request->docType,
                    "number" => $request->docNumber
                );
                $payment->payer = $payer;
                // dd($payment);
                $payment->save();

                // dd($request->all());

                if($payment->error){
                    // dd($payment);
                    session()->flash("flash_error", $payment->error);
                    return [
                        'erro' => $payment->error
                    ];
                }else{
                    $pedido->status_pagamento = $payment->status;
                    $pedido->transacao_id = (string)$payment->id;
                    $pedido->tipo_pagamento = 'cartao';
                    $pedido->save();

                    // dd($payment);
                    session()->flash("flash_success", "Pagamento concluído com sucesso!");
                    return [
                        'sucesso' => 1,
                        'hash_pedido' => $pedido->hash_pedido
                    ];
                }
            });

            if(isset($result['sucesso'])){
                return redirect()->route('loja.finalizar', 'link='.$config->loja_id .'&hash_pedido='.$result['hash_pedido']);
            }else{
                return redirect()->back();
            }
        }catch(\Exception $e){
            session()->flash("flash_error", $e->getMessage());
            return redirect()->back();
        }
    }

    public function enviarComprovante(Request $request){
        $pedido = PedidoEcommerce::findOrfail($request->pedido_id);
        if ($request->hasFile('file')) {
            $config = EcommerceConfig::where('empresa_id', $pedido->empresa_id)->first();

            $file_name = $this->util->uploadImage($request, '/comprovantes', 'file');

            session()->flash("flash_success", "Comprovante enviado com sucesso!");
            $pedido->comprovante = $file_name;
            $pedido->save();
            return redirect()->route('loja.index', 'link='.$config->loja_id);
        }else{
            session()->flash("flash_error", "Selecione o arquivo!");
            return redirect()->back();
        }
    }

}
