package com.retrofitdemo.adapter;

import android.app.Activity;
import android.app.PendingIntent;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.support.customtabs.CustomTabsCallback;
import android.support.customtabs.CustomTabsClient;
import android.support.customtabs.CustomTabsIntent;
import android.support.customtabs.CustomTabsServiceConnection;
import android.support.customtabs.CustomTabsSession;
import android.support.v4.content.ContextCompat;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import com.retrofitdemo.app.R;
import com.retrofitdemo.api.response.StackOverflowUser;
import com.squareup.picasso.Picasso;

import java.util.List;

public class StackOverflowUserAdapter extends RecyclerView.Adapter<StackOverflowUserAdapter.RecyclerViewHolders> {

    private List<StackOverflowUser.Item> users;
    private Context mContext;

    private CustomTabsClient mClient;

    public StackOverflowUserAdapter(Context content, List<StackOverflowUser.Item> users) {
        this.mContext = content;
        this.users = users;

        CustomTabsServiceConnection mConnection = new CustomTabsServiceConnection() {
            @Override
            public void onCustomTabsServiceConnected(ComponentName componentName, CustomTabsClient customTabsClient) {
                mClient = customTabsClient;
            }

            @Override
            public void onServiceDisconnected(ComponentName componentName) {
                mClient = null;
            }
        };

        String packageName = "com.android.chrome";
        CustomTabsClient.bindCustomTabsService(content, packageName, mConnection);
    }

    @Override
    public StackOverflowUserAdapter.RecyclerViewHolders onCreateViewHolder(ViewGroup parent, int viewType) {
        View layoutView = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_row_result, null);
        RecyclerViewHolders rcv = new RecyclerViewHolders(mContext, layoutView);
        return rcv;
    }

    @Override
    public void onBindViewHolder(StackOverflowUserAdapter.RecyclerViewHolders holder, int position) {

        StackOverflowUser.Item userObj = users.get(position);
        StackOverflowUser.BadgeCounts userBadge = userObj.getBadgeCounts();

        holder.tvPerson_name.setText(userObj.getDisplayName());
        holder.tvReputation.setText(userObj.getReputation() + "");
        holder.tvGoldBadge.setText(userBadge.getGold() + "");
        holder.tvSilverBadge.setText(userBadge.getSilver() + "");
        holder.tvBronzeBadge.setText(userBadge.getBronze() + "");

        Picasso.with(mContext).load(userObj.getProfileImage())
                .error(R.drawable.profile_place_holder)
                .placeholder(R.drawable.profile_place_holder)
                .into(holder.personPhoto);
    }

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

    public class RecyclerViewHolders extends RecyclerView.ViewHolder implements View.OnClickListener {
        private Context context;

        TextView tvPerson_name, tvReputation, tvGoldBadge, tvSilverBadge, tvBronzeBadge;
        ImageView personPhoto;

        public RecyclerViewHolders(Context mContext, View layoutView) {
            super(layoutView);
            layoutView.setOnClickListener(this);
            tvPerson_name = (TextView) itemView.findViewById(R.id.tvPerson_name);
            tvReputation = (TextView) itemView.findViewById(R.id.tvReputation);
            personPhoto = (ImageView) itemView.findViewById(R.id.circleView);

            tvGoldBadge = (TextView) itemView.findViewById(R.id.tvGoldBadge);
            tvSilverBadge = (TextView) itemView.findViewById(R.id.tvSilverBadge);
            tvBronzeBadge = (TextView) itemView.findViewById(R.id.tvBronzeBadge);
        }

        @Override
        public void onClick(View v) {
            loadCustomTabs(users.get(getAdapterPosition()).getLink());
        }
    }

    public void loadCustomTabs(String url) {
        CustomTabsIntent.Builder mBuilder = new CustomTabsIntent.Builder(getSession());
        mBuilder.setToolbarColor(ContextCompat.getColor(mContext, R.color.colorPrimary));
        mBuilder.setCloseButtonIcon(BitmapFactory.decodeResource(mContext.getResources(),
                R.mipmap.ic_arrow_back_white_24dp));
        mBuilder.addMenuItem("Share", setMenuItem(url));
        mBuilder.setActionButton(BitmapFactory.decodeResource(mContext.getResources(),
                R.mipmap.ic_file_download_white_24dp), "Engineering @Lets Nurture", addActionButton());
        mBuilder.setStartAnimations(mContext, R.anim.slide_in_right, R.anim.slide_out_left);
        mBuilder.setExitAnimations(mContext, R.anim.slide_in_left, R.anim.slide_out_right);
        CustomTabsIntent mIntent = mBuilder.build();
        mIntent.launchUrl((Activity) mContext, Uri.parse(url));
    }

    private CustomTabsSession getSession() {
        return mClient.newSession(new CustomTabsCallback() {
            @Override
            public void onNavigationEvent(int navigationEvent, Bundle extras) {
                super.onNavigationEvent(navigationEvent, extras);
            }
        });
    }

    private PendingIntent setMenuItem(String url) {
        Intent shareIntent = new Intent(Intent.ACTION_SEND);
        shareIntent.setType("text/plain");
        shareIntent.putExtra(Intent.EXTRA_SUBJECT, "");
        shareIntent.putExtra(Intent.EXTRA_TEXT, url);
        return PendingIntent.getActivity(mContext, 0, shareIntent, 0);
    }

    private PendingIntent addActionButton() {
        Intent playStoreIntent = new Intent(Intent.ACTION_VIEW,
                Uri.parse("http://engineering.letsnurture.com/"));
        return PendingIntent.getActivity(mContext, 0, playStoreIntent, 0);
    }
}