package com.etiennelawlor.quickreturn.adapters;

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import com.etiennelawlor.quickreturn.R;
import com.etiennelawlor.quickreturn.library.utils.QuickReturnUtils;
import com.etiennelawlor.quickreturn.models.Tweet;
import com.squareup.picasso.Picasso;

import java.util.ArrayList;

import butterknife.Bind;
import butterknife.ButterKnife;

/**
 * Created by etiennelawlor on 7/17/14.
 */
public class TwitterAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

    // region Constants
    private static final int TYPE_HEADER = 0;
    private static final int TYPE_ITEM = 1;
    // endregion

    // region Member Variables
    private ArrayList<Tweet> mTweets;
    // endregion

    // region Constructors
    public TwitterAdapter(ArrayList<Tweet> tweets) {
        mTweets = tweets;
    }
    // endregion

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        if (viewType == TYPE_ITEM) {
            View v = LayoutInflater.from(parent.getContext())
                    .inflate(R.layout.twitter_row, parent, false);
            return new ItemViewHolder(v);
        } else if (viewType == TYPE_HEADER) {
            View v = LayoutInflater.from(parent.getContext())
                    .inflate(R.layout.view_header_placeholder, parent, false);
            return new HeaderViewHolder(v);
        }

        throw new RuntimeException("there is no type that matches the type " + viewType + " + make sure your using types correctly");
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        if (holder instanceof ItemViewHolder) {

            ItemViewHolder itemViewHolder = (ItemViewHolder) holder;

            Tweet tweet = getItem(position);

            if (tweet != null) {
                setUpDisplayName(itemViewHolder.mDisplayNameTextView, tweet);
                setUpRetweet(itemViewHolder.mRetweetTextView, tweet);
                setUpStar(itemViewHolder.mStarTextView, tweet);
                setUpTimestamp(itemViewHolder.mTimestampTextView, tweet);
                setUpUserImage(itemViewHolder.mUserImageView, tweet);
                setUpUsername(itemViewHolder.mUsernameTextView, tweet);
                setUpMessage(itemViewHolder.mMessageTextView, tweet);
            }
        } else if (holder instanceof HeaderViewHolder) {

        }
    }

    @Override
    public int getItemViewType(int position) {
        if (isPositionHeader(position))
            return TYPE_HEADER;

        return TYPE_ITEM;
    }

    @Override
    public int getItemCount() {
        return mTweets.size() + 1;
    }

    // region Helper Methods
    private boolean isPositionHeader(int position) {
        return position == 0;
    }

    private Tweet getItem(int position) {
        return mTweets.get(position - 1);
    }

    private void setUpUserImage(ImageView iv, Tweet tweet) {
        Context context = iv.getContext();
        String avatarUrl = tweet.getAvatarUrl();
        if (!TextUtils.isEmpty(avatarUrl)) {
            Picasso.with(context)
                    .load(avatarUrl)
                    .centerCrop()
                    .resize(QuickReturnUtils.dp2px(context, 50),
                            QuickReturnUtils.dp2px(context, 50))
//                    .placeholder(R.drawable.ic_facebook)
                    .error(android.R.drawable.stat_notify_error)
                    .into(iv);
        }
    }

    private void setUpDisplayName(TextView tv, Tweet tweet) {
        String displayName = tweet.getDisplayName();
        if (!TextUtils.isEmpty(displayName)) {
            tv.setText(displayName);
        }
    }

    private void setUpUsername(TextView tv, Tweet tweet) {
        String username = tweet.getUsername();
        if (!TextUtils.isEmpty(username)) {
            tv.setText(username);
        }
    }

    private void setUpTimestamp(TextView tv, Tweet tweet) {
        String timestamp = tweet.getTimestamp();
        if (!TextUtils.isEmpty(timestamp)) {
            tv.setText(timestamp);
        }
    }

    private void setUpRetweet(TextView tv, Tweet tweet) {
        int retweetCount = tweet.getRetweetCount();
        tv.setText(String.valueOf(retweetCount));
    }

    private void setUpStar(TextView tv, Tweet tweet) {
        int starCount = tweet.getStarCount();
        tv.setText(String.valueOf(starCount));
    }

    private void setUpMessage(TextView tv, Tweet tweet) {
        String message = tweet.getMessage();
        if (message.length() > 160) {
            message = message.substring(0, 159);
        }

        if (!TextUtils.isEmpty(message)) {
            tv.setText(message);
        }
    }
    // endregion

    // region Inner Classes

    public static class ItemViewHolder extends RecyclerView.ViewHolder {
        @Bind(R.id.user_iv)
        ImageView mUserImageView;
        @Bind(R.id.display_name_tv)
        TextView mDisplayNameTextView;
        @Bind(R.id.username_tv)
        TextView mUsernameTextView;
        @Bind(R.id.timestamp_tv)
        TextView mTimestampTextView;
        @Bind(R.id.message_tv)
        TextView mMessageTextView;
        @Bind(R.id.retweet_tv)
        TextView mRetweetTextView;
        @Bind(R.id.star_tv)
        TextView mStarTextView;

        public ItemViewHolder(View view) {
            super(view);
            ButterKnife.bind(this, view);
        }
    }

    public static class HeaderViewHolder extends RecyclerView.ViewHolder {
        public HeaderViewHolder(View itemView) {
            super(itemView);
        }
    }

    // endregion
}