package it.integry.integrywmsnative.gest.prod_accettazione_ord_produzione.ui;

import android.content.Context;
import android.text.Html;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import androidx.databinding.DataBindingUtil;
import androidx.databinding.ObservableArrayList;
import androidx.recyclerview.widget.RecyclerView;

import it.integry.integrywmsnative.R;
import it.integry.integrywmsnative.core.expansion.OnSingleClickListener;
import it.integry.integrywmsnative.core.expansion.RunnableArgs;
import it.integry.integrywmsnative.core.expansion.view.ExtendedSectionedRecyclerView;
import it.integry.integrywmsnative.core.utility.UtilityString;
import it.integry.integrywmsnative.databinding.FragmentProdOrdineProduzioneListGroupClientiBinding;
import it.integry.integrywmsnative.databinding.FragmentProdOrdineProduzioneListGroupModelBinding;
import it.integry.integrywmsnative.databinding.FragmentProdOrdineProduzioneListModelBinding;

public class OrdineProduzioneListAdapter extends ExtendedSectionedRecyclerView<MainListProdOrdineProduzioneElencoListModel, OrdineProduzioneListAdapter.SubheaderHolder, OrdineProduzioneListAdapter.SingleItemViewHolder> {


    private Context mContext;

    private RunnableArgs<String> mOnGroupItemClicked;
    private RunnableArgs<MainListProdOrdineProduzioneElencoListModel> mOnItemChecked;


    static class SubheaderHolder extends RecyclerView.ViewHolder {

        FragmentProdOrdineProduzioneListModelBinding binding;

        SubheaderHolder(FragmentProdOrdineProduzioneListModelBinding binding) {
            super(binding.getRoot());
            this.binding = binding;
        }

    }

    static class SingleItemViewHolder extends RecyclerView.ViewHolder {

        FragmentProdOrdineProduzioneListGroupModelBinding binding;

        SingleItemViewHolder(FragmentProdOrdineProduzioneListGroupModelBinding binding) {
            super(binding.getRoot());
            this.binding = binding;
        }
    }


    public OrdineProduzioneListAdapter(Context context, ObservableArrayList<MainListProdOrdineProduzioneElencoListModel> myDataset) {
        super(myDataset);
        mContext = context;
    }

    public OrdineProduzioneListAdapter setOnGroupItemClicked(RunnableArgs<String> onGroupItemClicked) {
        this.mOnGroupItemClicked = onGroupItemClicked;
        return this;
    }

    public OrdineProduzioneListAdapter setOnItemChecked(RunnableArgs<MainListProdOrdineProduzioneElencoListModel> onItemChecked) {
        this.mOnItemChecked = onItemChecked;
        return this;
    }



    @Override
    public SubheaderHolder onCreateSubheaderViewHolder(ViewGroup parent, int viewType) {
        FragmentProdOrdineProduzioneListModelBinding binding = DataBindingUtil.inflate(LayoutInflater.from(mContext), R.layout.fragment_prod_ordine_produzione__list_model, parent, false);
        return new SubheaderHolder(binding);
    }

    @Override
    public SingleItemViewHolder onCreateItemViewHolder(ViewGroup parent, int viewType) {
        FragmentProdOrdineProduzioneListGroupModelBinding binding = DataBindingUtil.inflate(LayoutInflater.from(mContext), R.layout.fragment_prod_ordine_produzione__list_group_model, parent, false);
        return new SingleItemViewHolder(binding);
    }


    @Override
    public void onBindSubheaderViewHolder(OrdineProduzioneListAdapter.SubheaderHolder subheaderHolder, int nextItemPosition) {
        subheaderHolder.binding.ordineProduzioneMainListGroupHeader.setText(mDataset.get(nextItemPosition).getGroupTitle());

        subheaderHolder.binding.getRoot().setOnClickListener(new OnSingleClickListener() {
            @Override
            public void onSingleClick(View v) {
                if(mOnGroupItemClicked != null) mOnGroupItemClicked.run(mDataset.get(nextItemPosition).getGroupTitle());
            }
        });
    }

    @Override
    public void onBindItemViewHolder(OrdineProduzioneListAdapter.SingleItemViewHolder holder, int itemPosition) {
        final MainListProdOrdineProduzioneElencoListModel ordine = mDataset.get(itemPosition);

        ordine.getSelectedObservable().resetOnPropertyChangedCallback();

        holder.binding.ordineProduzioneMainListGroupItemContainerClientiOrd.removeAllViews();
        holder.binding.ordineProduzioneMainListGroupItemContainerTestataOrd.setText(Html.fromHtml(ordine.getDescription()));


        for (MainListProdOrdineProduzioneElencoClienteListModel cliente : ordine.getClientiListModel()) {
            FragmentProdOrdineProduzioneListGroupClientiBinding binding = DataBindingUtil.inflate(LayoutInflater.from(mContext), R.layout.fragment_prod_ordine_produzione__list_group_clienti, holder.binding.ordineProduzioneMainListGroupItemContainerClientiOrd, false);

            binding.ordineProduzioneMainListGroupClientiComm.setText(cliente.getPrimaryText());

            if (!UtilityString.isNullOrEmpty(cliente.getRightText())) {
                binding.ordineProduzioneMainListGroupClientiDatacons.setText(cliente.getRightText());
            } else {
                binding.ordineProduzioneMainListGroupClientiDatacons.setText("");
            }

            holder.binding.ordineProduzioneMainListGroupItemContainerClientiOrd.addView(binding.getRoot());
        }

        holder.binding.setSelected(ordine.getSelectedObservable());
        holder.binding.executePendingBindings();
        holder.binding.ordineProduzioneMainListGroupItemContainerCheckBox.jumpDrawablesToCurrentState();

        ordine.getSelectedObservable().addOnPropertyChangedCallback(() -> {
            if(this.mOnItemChecked != null) this.mOnItemChecked.run(ordine);
        });

        holder.binding.getRoot().setOnClickListener(v -> {
            ordine.getSelectedObservable().set(!ordine.getSelectedObservable().get());
        });
    }


    @Override
    public boolean onPlaceSubheaderBetweenItems(int position) {
        if (getItemSize() == 1) return true;
        else if (getItemSize() > 1) {
            MainListProdOrdineProduzioneElencoListModel compare1 = this.mDataset.get(position);
            MainListProdOrdineProduzioneElencoListModel compare2 = this.mDataset.get(position + 1);

            if (UtilityString.equalsIgnoreCase(compare1.getGroupTitle(), compare2.getGroupTitle())) {
                return false;
            }
        }

        return true;
    }

    @Override
    public int getItemSize() {
        return mDataset.size();
    }

}
