package br.com.codetec.saudesabor.ui.login.ui.notifications;

import android.content.DialogInterface;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.RecyclerView;

import com.google.gson.Gson;
import com.paypal.checkout.approve.Approval;
import com.paypal.checkout.approve.OnApprove;
import com.paypal.checkout.cancel.OnCancel;
import com.paypal.checkout.createorder.CreateOrder;
import com.paypal.checkout.createorder.CreateOrderActions;
import com.paypal.checkout.createorder.CurrencyCode;
import com.paypal.checkout.createorder.OrderIntent;
import com.paypal.checkout.createorder.UserAction;
import com.paypal.checkout.error.ErrorInfo;
import com.paypal.checkout.error.OnError;
import com.paypal.checkout.order.Amount;
import com.paypal.checkout.order.AppContext;
import com.paypal.checkout.order.CaptureOrderResult;
import com.paypal.checkout.order.OnCaptureComplete;
import com.paypal.checkout.order.Order;
import com.paypal.checkout.order.PurchaseUnit;
import com.paypal.checkout.paymentbutton.PaymentButton;

import org.jetbrains.annotations.NotNull;

import java.io.IOException;
import java.util.ArrayList;

import br.com.codetec.saudesabor.R;
import br.com.codetec.saudesabor.model.Cabecalho;
import br.com.codetec.saudesabor.model.DadosRegistrarVenda;
import br.com.codetec.saudesabor.model.EnderecoUsuario;
import br.com.codetec.saudesabor.model.Formas;
import br.com.codetec.saudesabor.model.Formas_pagamento;
import br.com.codetec.saudesabor.model.RespostaRegistraVenda;
import br.com.codetec.saudesabor.service.CarrinhoComprasGlobal;
import br.com.codetec.saudesabor.service.CarrinhoService;
import br.com.codetec.saudesabor.service.PedidoComprasService;
import br.com.codetec.saudesabor.ui.login.EnderecoActivity;
import br.com.codetec.saudesabor.ui.login.LoginActivity;
import br.com.codetec.saudesabor.ui.login.ui.adapter.ProdutoAdapter;
import br.com.codetec.saudesabor.ui.login.ui.dashboard.DashboardFragment;
import br.com.codetec.saudesabor.utils.UtilsActivity;
import br.com.codetec.saudesabor.utils.components.alert.CustomAlert;
import retrofit2.Response;


public class CarrinhoFragment extends Fragment {

    private RecyclerView recyclerView;
    private TextView textView;
    private TextView txtTotalProdutos;
    private TextView txtPontosDisponiveis;
    private Button btnFinalizar;
    private LinearLayout linearLayoutFinalizarPedido;
    private Spinner spinnerListaEnderecos;
    private Spinner spinnerFormaDeEnvio;
    private Spinner spinnerData;
    private Spinner spinnerHorario;
    private Spinner spinnerFormaPagamento;
    private EditText pontos;
    private EditText cupom;

    private Button btnAdicionarEndereco;
    private PaymentButton payPalButton;

    private int PAYPAL_REQ_CODE = 12;

    private CarrinhoService carrinhoService;

    private View.OnClickListener clickAdicionarEndereco = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            UtilsActivity.getInstance().startActivity(CarrinhoFragment.this.getActivity(), EnderecoActivity.class);
        }
    };

    public View onCreateView(@NonNull LayoutInflater inflater,
                             ViewGroup container, Bundle savedInstanceState) {
        View root = inflater.inflate(R.layout.fragment_carrinho, container, false);
        textView = root.findViewById(R.id.text_notifications);
        txtTotalProdutos = root.findViewById(R.id.txtTotalProdutos);
        btnFinalizar = root.findViewById(R.id.btnFinalizar);
        txtPontosDisponiveis = root.findViewById(R.id.txtPontosDisponiveis);
        linearLayoutFinalizarPedido = root.findViewById(R.id.linearLayoutFinalizarPedido);
        spinnerListaEnderecos =  root.findViewById(R.id.spinnerZone);
        spinnerFormaDeEnvio =  root.findViewById(R.id.spinnerFormasEnvio);
        spinnerData =  root.findViewById(R.id.spinnerData);
        spinnerHorario =  root.findViewById(R.id.spinnerHorario);
        spinnerFormaPagamento =  root.findViewById(R.id.spinnerFormaPagamento);
        pontos =  root.findViewById(R.id.pontos);
        cupom =  root.findViewById(R.id.cupom);
        payPalButton = root.findViewById(R.id.payPalButton);
        btnAdicionarEndereco = root.findViewById(R.id.btnAdicionarEndereco);
        txtPontosDisponiveis.setText(DashboardFragment.responseDashboard.getPts_acumulados());

        pontos.setOnFocusChangeListener(new View.OnFocusChangeListener() {
            @Override
            public void onFocusChange(View view, boolean b) {
                String digitado = pontos.getText().toString().trim();
                if(!digitado.equals("")){
                    Integer p = Integer.parseInt(digitado);
                    Integer pontosAcumulados = Integer.parseInt(DashboardFragment.responseDashboard.getPts_acumulados());

                    if(p > pontosAcumulados){
                        CustomAlert.getInstance().show(getContext(), "Você pode usar somente até " + pontosAcumulados + " pontos." );
                        pontos.setText("");
                    }else{
                        CustomAlert.getInstance().show(getContext(), "Serão utilizados " + p + " pontos." );
                    }
                }
//
//                getCalculoTotalComPontos();
            }
        });

        carrinhoService = new CarrinhoService(getContext());

        btnFinalizar.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                CustomAlert.getInstance().show(
                        getContext(), getString(R.string.app_name),
                        "Confirma o pedido?",
                        "Realizar Pedido",
                        "Não",
                        new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                if(validarPedido()){
                                    gravarCheckPedido();
                                    PedidoComprasService.checkPedido(CarrinhoFragment.this);
                                }
                            }
                        },
                      null
                );
            }
        });

        payPalButton.setup(
                        new CreateOrder() {
                            @Override
                            public void create(@NotNull CreateOrderActions createOrderActions) {
                                if(validarPedido()) {
                                    ArrayList purchaseUnits = new ArrayList<>();
                                    purchaseUnits.add(
                                            new PurchaseUnit.Builder()
                                                    .amount(
                                                            new Amount.Builder()
                                                                    .currencyCode(CurrencyCode.JPY)
                                                                    .value(CarrinhoFragment.this.getCalculoTotalComPontos())
                                                                    .build()
                                                    )
                                                    .build()
                                    );
                                    Order order = new Order(
                                            OrderIntent.CAPTURE,
                                            new AppContext.Builder()
                                                    .userAction(UserAction.PAY_NOW)
                                                    .build(),
                                            purchaseUnits
                                    );
                                    createOrderActions.create(order, (CreateOrderActions.OnOrderCreated) null);
                                }
                            }
                        },
                        new OnApprove() {
                            @Override
                            public void onApprove(@NotNull Approval approval) {
                                approval.getOrderActions().capture(new OnCaptureComplete() {
                                    @Override
                                    public void onCaptureComplete(@NotNull CaptureOrderResult result) {
                                        Toast.makeText(getContext(),"Pagamento Paypal realizado com sucesso!", Toast.LENGTH_LONG).show();
                                        gravarPedido();
                                        PedidoComprasService.enviarPedido(CarrinhoFragment.this);
                                        payPalButton.setVisibility(View.VISIBLE);
                                    }
                                });
                            }
                        },
                        new OnCancel() {
                                    @Override
                                    public void onCancel() {
                                        PedidoComprasService.limparPedido(getContext());
                                        Toast.makeText(getContext(),"Pagamento Paypal cancelado", Toast.LENGTH_LONG).show();
                                        payPalButton.setVisibility(View.VISIBLE);
                                    }
                                },
                        new OnError() {
                                    @Override
                                    public void onError(@NotNull ErrorInfo errorInfo) {
                                        PedidoComprasService.limparPedido(getContext());
                                        Toast.makeText(getContext(),errorInfo.getReason(), Toast.LENGTH_LONG).show();
                                        payPalButton.setVisibility(View.VISIBLE);
                                    }
                                }
                );

        btnAdicionarEndereco.setOnClickListener(clickAdicionarEndereco);

        spinnerFormaPagamento.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                if(position == 1){
                    payPalButton.setVisibility(View.VISIBLE);
                    btnFinalizar.setVisibility(View.GONE);
                    txtTotalProdutos.setText("");
                }else{
                    payPalButton.setVisibility(View.GONE);
                    btnFinalizar.setVisibility(View.VISIBLE);

                }
            }

            @Override
            public void onNothingSelected(AdapterView<?> parent) {
                payPalButton.setVisibility(View.INVISIBLE);
                btnFinalizar.setVisibility(View.VISIBLE);
            }
        });
        recyclerView = root.findViewById(R.id.recyclerView);

        atualizarLista();

        carrinhoService.carregarListaEnderecos(spinnerListaEnderecos);
        carrinhoService.carregarFormasDeEnvio(spinnerFormaDeEnvio, spinnerData, spinnerHorario);
        carrinhoService.carregarFormasDePagamento(spinnerFormaPagamento, this);

        return root;
    }

    private boolean validarPedido() {
        Formas formas = (Formas)spinnerFormaDeEnvio.getSelectedItem();
        if(formas==null || formas.getId()==null){
            CustomAlert.getInstance().show(CarrinhoFragment.this.getActivity(), "Escolha a forma de Envio");
            return false;
        }
        if(spinnerData.getSelectedItem()==null){
            CustomAlert.getInstance().show(CarrinhoFragment.this.getActivity(), "Escolha a Data");
            return false;
        }
        if(spinnerHorario.getSelectedItem()==null){
            CustomAlert.getInstance().show(CarrinhoFragment.this.getActivity(), "Escolha o Horário");
            return false;
        }
        if(!(regraQuantidadePontosDisponiveis() && regraQuantidadePontosUtilizaveis())) {
            return false;
        }

        return true;
    }

    private boolean regraQuantidadePontosDisponiveis() {
        if(pontos.getText().toString() == null || pontos.getText().toString().isEmpty()){
            return true;
        }

        try {
            Integer pts = Integer.parseInt(pontos.getText().toString());

            Integer ptsAcumulados = Integer.parseInt(DashboardFragment.responseDashboard.getPts_acumulados());
            if(pts > ptsAcumulados){
                pontos.setText("");
                CustomAlert.getInstance().show(CarrinhoFragment.this.getActivity(), "Quantidade de pontos indisponível.");
                return false;
            }
        }catch(NumberFormatException e){
            CustomAlert.getInstance().show(CarrinhoFragment.this.getActivity(), "Quantidade de pontos indisponível.");
            e.printStackTrace();
            return false;
        }
        return true;
    }

    private boolean regraQuantidadePontosUtilizaveis() {
        if(pontos.getText().toString() == null || pontos.getText().toString().isEmpty()){
            return true;
        }

        try {
            Integer pts = Integer.parseInt(pontos.getText().toString());
            Double totalProdutos = CarrinhoComprasGlobal.getTotalProdutos();

            if(pts > totalProdutos){
                CustomAlert.getInstance().show(CarrinhoFragment.this.getActivity(), "Só é possível usar até " + totalProdutos + " pontos.");
                return false;
            }

        }catch(NumberFormatException e){
            CustomAlert.getInstance().show(CarrinhoFragment.this.getActivity(), "Quantidade de pontos indisponível.");
            e.printStackTrace();
            return false;
        }
        return true;
    }

    private void gravarPedido() {
        String dadosPedido = getJsonDadosPedido();
        PedidoComprasService.gravarNasPreferencias(getContext(),dadosPedido);
    }


    private void gravarCheckPedido() {
        String dadosPedido = getJsonDadosPedido();
        PedidoComprasService.gravarCheckNasPreferencias(getContext(),dadosPedido);
    }


    private String getJsonDadosPedido() {
        DadosRegistrarVenda dadosRegistrarVenda = new DadosRegistrarVenda();
        Cabecalho cabecalho = new Cabecalho();
        Formas formas = (Formas)spinnerFormaDeEnvio.getSelectedItem();

        cabecalho.setId_forma_entrega(formas.getId() + "");

        Formas_pagamento pagamento = (Formas_pagamento)spinnerFormaPagamento.getSelectedItem();
        cabecalho.setId_forma_pagamento(new Integer(pagamento.getId()));

        if(cupom!=null && cupom.getText() != null) {
            cabecalho.setCupom(cupom.getText().toString());
        }
        cabecalho.setPontos(pontos.getText().toString());
        cabecalho.setSt_paypal(1);
        cabecalho.setCustomer_id(LoginActivity.responseLogin.getUsuario().getId());
        cabecalho.setTotal(CarrinhoComprasGlobal.getTotal());
        cabecalho.setIp("0.0.0.0");
        cabecalho.setUser_agent("Mobile");
        cabecalho.setData_entrega(spinnerData.getSelectedItem().toString());
        cabecalho.setHora_entrega(spinnerHorario.getSelectedItem().toString());
        cabecalho.setObservacao("");
        if(spinnerListaEnderecos.getSelectedItem()!=null) {
            cabecalho.setAddress_id(((EnderecoUsuario) (spinnerListaEnderecos.getSelectedItem())).getAddress_id());
        }
        dadosRegistrarVenda.setCabecalho(cabecalho);
        dadosRegistrarVenda.setItens(carrinhoService.listaItens());

        String dadosPedido = new Gson().toJson(dadosRegistrarVenda);
        return dadosPedido;
    }


    @Override
    public void onResume() {
        super.onResume();
        configuraElementosVisuais();
        PedidoComprasService.enviarPedido(CarrinhoFragment.this);
    }

    private void configuraElementosVisuais() {
        if (CarrinhoComprasGlobal.isEmpty()) {
            textView.setText("Nenhum produto no carrinho!");
            linearLayoutFinalizarPedido.setVisibility(View.GONE);
        }else{
            textView.setText("");
            linearLayoutFinalizarPedido.setVisibility(View.VISIBLE);
        }
    }
    private void atualizarLista() {
        ProdutoAdapter adapter = new ProdutoAdapter( CarrinhoComprasGlobal.listaProdutos() , this.getActivity(), true);
        UtilsActivity.getInstance().initRecyclerView(this.getActivity(), recyclerView);
        recyclerView.setAdapter(adapter);
        adapter.notifyDataSetChanged();
    }


    public String getCalculoTotalComPontos(){
        Double totalRetorno = CarrinhoComprasGlobal.getTotalProdutos();
        if(pontos!=null && pontos.getText()!=null && pontos.getText().toString()!=null){
            try {
                Integer pontosDbl = Integer.parseInt(pontos.getText().toString());
                totalRetorno -= pontosDbl;
            }catch(NumberFormatException nfe){
                nfe.printStackTrace();
            }

            try {
                Formas formas = (Formas) spinnerFormaDeEnvio.getSelectedItem();
                if(formas!=null) {
                    Double priceFrete = Double.parseDouble(formas.getPrice());

                    totalRetorno += priceFrete;
                }
            }catch(NumberFormatException nfe){
                nfe.printStackTrace();
            }
        }
        String retorno = "" + totalRetorno.intValue();
        try {
            txtTotalProdutos.setText("Total: " + retorno);
        }catch (NullPointerException npe){
            npe.printStackTrace();
        }
        return retorno;
    }

}