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

import android.content.Context;
import android.content.DialogInterface;
import android.graphics.Color;
import android.os.Build;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.annotation.RequiresApi;
import androidx.appcompat.widget.LinearLayoutCompat;
import androidx.core.content.ContextCompat;
import androidx.recyclerview.widget.RecyclerView;

import com.squareup.picasso.Picasso;

import java.util.ArrayList;
import java.util.List;

import br.com.codetec.saudesabor.R;
import br.com.codetec.saudesabor.model.Produto;
import br.com.codetec.saudesabor.model.ResponseCodeTec;
import br.com.codetec.saudesabor.service.CarrinhoComprasGlobal;
import br.com.codetec.saudesabor.service.ServiceConector;
import br.com.codetec.saudesabor.ui.login.LoginActivity;
import br.com.codetec.saudesabor.ui.login.ui.notifications.FavoritosFragment;
import br.com.codetec.saudesabor.ui.login.ui.notifications.ListaAtualizavelInterface;
import br.com.codetec.saudesabor.utils.components.alert.CustomAlert;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;

public class ProdutoAdapter extends RecyclerView.Adapter<ProdutoAdapter.ProdutoViewHolder> {
    private List<Produto> listaProdutos = new ArrayList<>();
    private Context context;
    private boolean removerBotaoAdicionar = false;
    private boolean removerBotaoRemover = false;
    private boolean desfavoritar = false;
    private ListaAtualizavelInterface listaAtualizavel;

    public ProdutoAdapter(List<Produto> listaProdutos, Context context ) {
       this(listaProdutos, context, false);
    }

    public ProdutoAdapter(List<Produto> listaProdutos, Context context,  boolean removerBotaoAdicionar) {
        this.listaProdutos = listaProdutos;
        this.context = context;
        this.removerBotaoAdicionar = removerBotaoAdicionar;
    }

    public ProdutoAdapter(List<Produto> listaProdutos, Context context, boolean removerBotaoAdicionar, boolean removerBotaoRemover, boolean desfavoritar) {
        this(listaProdutos, context, removerBotaoAdicionar);
        this.removerBotaoRemover = removerBotaoRemover;
        this.desfavoritar = desfavoritar;
    }

    public ProdutoAdapter(List<Produto> listaProdutos, Context context, ListaAtualizavelInterface listaAtualizavel, boolean removerBotaoAdicionar, boolean removerBotaoRemover, boolean desfavoritar) {
        this(listaProdutos,context,removerBotaoAdicionar,removerBotaoRemover, desfavoritar);
        this.listaAtualizavel = listaAtualizavel;
    }

    @NonNull
    @Override
    public ProdutoViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_item_produto, parent, false);
        return new ProdutoViewHolder(itemView);
    }

    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
    @Override
    public void onBindViewHolder(@NonNull ProdutoViewHolder holder, int position) {
        final Produto produto = listaProdutos.get(position);

        holder.getTxtNome().setText(produto.getProduct());
        String descricao = context.getString(R.string.pontos) + ": " + produto.getPoints();

        if(produto.getDate() != null){
            descricao += " | Data: " + produto.getDate();
        }

        holder.getTxtDescricao().setText(descricao);
        holder.getTxtPreco().setText(produto.getValor());
        holder.getTxtQuantidade().setText("Quantidade: " + produto.getQuantity());

        Picasso.get().load(produto.getProduct_image()).into(holder.getImagem());

        if(removerBotaoAdicionar && removerBotaoRemover){
            holder.getBtnAdicionar().setVisibility(View.GONE);
        }else if(removerBotaoAdicionar){
            holder.getBtnAdicionar().setText("Remover");
            final int sdk = android.os.Build.VERSION.SDK_INT;
            if(sdk < android.os.Build.VERSION_CODES.JELLY_BEAN) {
                holder.getBtnAdicionar().setBackgroundDrawable(ContextCompat.getDrawable(context, R.drawable.background_btn_remover) );
            } else {
                holder.getBtnAdicionar().setBackground(ContextCompat.getDrawable(context, R.drawable.background_btn_remover));
            }
            holder.getBtnAdicionar().setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    CustomAlert.getInstance().show(
                        context, context.getString(R.string.app_name),
                        "Deseja remover uma unidade deste produto?",
                        "Não",
                        "Sim",
                        new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                listaProdutos =  new CarrinhoComprasGlobal(context).removerProduto(produto);
                                ProdutoAdapter.this.notifyDataSetChanged();
                                CustomAlert.getInstance().show(context, "Produto removido do carrinho.");
                            }
                        });
                }
            });
        }else{
            holder.getBtnAdicionar().setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    new CarrinhoComprasGlobal(context).adicionarProduto(produto);
                    CustomAlert.getInstance().show(context, "Produto adicionado ao carrinho.");
                }
            });
        }

        if(desfavoritar){
            holder.getBtnFavoritar().setText("Desfavoritar");
        }

        holder.getBtnFavoritar().setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Call<ResponseCodeTec> call = ServiceConector.getService(context).favoritarDesfavoritarProduto(produto.getProduct_id(), LoginActivity.responseLogin.getToken());
                call.enqueue(new Callback<ResponseCodeTec>() {
                    @Override
                    public void onResponse(Call<ResponseCodeTec> call, Response<ResponseCodeTec> response) {
                        if(response.body()!=null){
                            CustomAlert.getInstance().show(context, response.body().getMensagem());
                            if(listaAtualizavel != null) {
                                listaAtualizavel.atualizarLista();
                            }
                        }
                    }

                    @Override
                    public void onFailure(Call<ResponseCodeTec> call, Throwable t) {

                    }
                });
            }
        });
    }

    @Override
    public int getItemCount() {
        return this.listaProdutos.size();
    }

    public class ProdutoViewHolder extends RecyclerView.ViewHolder {
        protected TextView txtNome;
        protected TextView txtDescricao;
        protected TextView txtPreco;
        protected TextView txtQuantidade;
        protected ImageView imagem;
        protected Button btnAdicionar;
        protected Button btnFavoritar;
        protected LinearLayoutCompat itemLinearLayout;

        public ProdutoViewHolder(View itemView) {
            super(itemView);
            this.txtNome = (TextView) itemView.findViewById(R.id.txtNome);
            this.txtDescricao = (TextView) itemView.findViewById(R.id.txtDescricao);
            this.txtQuantidade = (TextView) itemView.findViewById(R.id.txtQuantidade);
            this.txtPreco = (TextView) itemView.findViewById(R.id.txtPreco);
            this.imagem = (ImageView) itemView.findViewById(R.id.imagem);
            this.btnAdicionar = (Button) itemView.findViewById(R.id.btnFinalizar);
            this.btnFavoritar = (Button) itemView.findViewById(R.id.btnFavoritar);
            this.itemLinearLayout = (LinearLayoutCompat) itemView.findViewById(R.id.itemLinearLayout);
        }

        public TextView getTxtNome() {
            return txtNome;
        }

        public void setTxtNome(TextView txtNome) {
            this.txtNome = txtNome;
        }

        public TextView getTxtDescricao() {
            return txtDescricao;
        }

        public void setTxtDescricao(TextView txtDescricao) {
            this.txtDescricao = txtDescricao;
        }

        public TextView getTxtPreco() {
            return txtPreco;
        }

        public void setTxtPreco(TextView txtPreco) {
            this.txtPreco = txtPreco;
        }

        public ImageView getImagem() {
            return imagem;
        }

        public void setImagem(ImageView imagem) {
            this.imagem = imagem;
        }

        public LinearLayoutCompat getItemLinearLayout() {
            return itemLinearLayout;
        }

        public void setItemLinearLayout(LinearLayoutCompat itemLinearLayout) {
            this.itemLinearLayout = itemLinearLayout;
        }
        public Button getBtnAdicionar() {
            return btnAdicionar;
        }

        public void setBtnAdicionar(Button btnAdicionar) {
            this.btnAdicionar = btnAdicionar;
        }

        public TextView getTxtQuantidade() {
            return txtQuantidade;
        }

        public void setTxtQuantidade(TextView txtQuantidade) {
            this.txtQuantidade = txtQuantidade;
        }

        public Button getBtnFavoritar() {
            return btnFavoritar;
        }

        public void setBtnFavoritar(Button btnFavoritar) {
            this.btnFavoritar = btnFavoritar;
        }
    }

}
