package com.etiennelawlor.loop.adapters;

import android.content.Context;
import android.graphics.Typeface;
import android.support.v4.content.ContextCompat;
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.TextView;

import com.etiennelawlor.loop.R;
import com.etiennelawlor.loop.network.models.response.Comment;
import com.etiennelawlor.loop.network.models.response.User;
import com.etiennelawlor.loop.ui.AvatarView;
import com.etiennelawlor.loop.utilities.FontCache;
import com.etiennelawlor.trestle.library.Span;
import com.etiennelawlor.trestle.library.Trestle;

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

import butterknife.BindView;
import butterknife.ButterKnife;

/**
 * Created by etiennelawlor on 12/20/15.
 */

// Setup ReverseBaseAdapter for pagination
public class VideoCommentsAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

    // region Constants
    // endregion

    // region Static Variables
    private static Typeface boldFont;
    private static Typeface italicFont;
    // endregion

    // region Member Variables
    private List<Comment> comments;
    private OnItemLongClickListener onItemLongClickListener;
    // endregion

    // region Interfaces
    public interface OnItemLongClickListener {
        void onItemLongClick(int position);
    }
    // endregion

    // region Constructors
    public VideoCommentsAdapter(Context context) {
        comments = new ArrayList<>();

        boldFont = FontCache.getTypeface("Ubuntu-Bold.ttf", context);
        italicFont = FontCache.getTypeface("Ubuntu-Italic.ttf", context);
    }
    // endregion

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.comment_row, parent, false);
        final CommentViewHolder holder = new CommentViewHolder(v);

        holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View v) {
                int adapterPos = holder.getAdapterPosition();
                if(adapterPos != RecyclerView.NO_POSITION){
                    if (onItemLongClickListener != null) {
                        onItemLongClickListener.onItemLongClick(adapterPos);
                    }
                }

                return false;
            }
        });

        return holder;
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position) {
        CommentViewHolder holder = (CommentViewHolder) viewHolder;

        final Comment comment = comments.get(position);
        if (comment != null) {
            holder.bind(comment);
        }
    }

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

    // region Helper Methods
    public void add(Comment item) {
        comments.add(item);
        notifyItemInserted(comments.size() - 1);
    }

    public void addAll(List<Comment> comments) {
        for (Comment comment : comments) {
            add(comment);
        }
    }

    public void clear() {
        while (getItemCount() > 0) {
            remove(getItem(0));
        }
    }

    public boolean isEmpty() {
        return getItemCount() == 0;
    }

    public void remove(Comment item) {
        int position = comments.indexOf(item);
        if (position > -1) {
            comments.remove(position);
            notifyItemRemoved(position);
        }
    }

    public Comment getItem(int position) {
        return comments.get(position);
    }

    public void setOnItemLongClickListener(OnItemLongClickListener onItemLongClickListener) {
        this.onItemLongClickListener = onItemLongClickListener;
    }
    // endregion

    // region Inner Classes

    public static class CommentViewHolder extends RecyclerView.ViewHolder {
        // region Views
        @BindView(R.id.comment_tv)
        TextView commentTextView;
        @BindView(R.id.comment_iv)
        AvatarView commentImageView;
        // endregion

        // region Constructors
        public CommentViewHolder(View view) {
            super(view);
            ButterKnife.bind(this, view);
        }
        // endregion

        // region Helper Methods
        private void bind(Comment comment){
            setUpFullComment(commentTextView, comment);
            setUpCommentImage(commentImageView, comment);
        }

        private void setUpFullComment(TextView tv, Comment comment){
            String commentText = comment.getText();
            User user = comment.getUser();

            String commentDate = getCommentDate(comment);

            String displayName = "";

            if (user != null) {
                displayName = user.getName();
            }

            List<Span> spans = new ArrayList<>();

            if(!TextUtils.isEmpty(displayName)
                    && !TextUtils.isEmpty(commentText)
                    && !TextUtils.isEmpty(commentDate)){
                spans.add(new Span.Builder(String.format("%s ", displayName))
                        .foregroundColor(ContextCompat.getColor(tv.getContext(), R.color.primary))
                        .typeface(boldFont)
                        .build());
                spans.add(new Span.Builder(commentText)
                        .build());
                spans.add(new Span.Builder("\n")
                        .build());
                spans.add(new Span.Builder(commentDate)
                        .foregroundColor(ContextCompat.getColor(tv.getContext(), R.color.tertiary_text_dark))
                        .typeface(italicFont)
                        .build());
            } else if(!TextUtils.isEmpty(commentText)
                    && !TextUtils.isEmpty(commentDate)){
                spans.add(new Span.Builder(commentText)
                        .build());
                spans.add(new Span.Builder("\n")
                        .build());
                spans.add(new Span.Builder(commentDate)
                        .foregroundColor(ContextCompat.getColor(tv.getContext(), R.color.tertiary_text_dark))
                        .typeface(italicFont)
                        .build());
            }

            CharSequence formattedText = Trestle.getFormattedText(spans);
            tv.setText(formattedText);
        }

        private String getCommentDate(Comment comment){
            String formattedCreatedOn = comment.getFormattedCreatedOn();
            return formattedCreatedOn;
        }

        private void setUpCommentImage(AvatarView av, Comment comment){
            User user = comment.getUser();

            if(user != null){
                av.bind(user);
            } else {
                av.nullify();
            }
        }
        // endregion
    }

    // endregion

}
