package io.dwak.holohackernews.app.ui.storylist;

import android.content.Context;
import android.support.annotation.NonNull;
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.daimajia.swipe.SwipeLayout;

import butterknife.ButterKnife;
import butterknife.InjectView;
import io.dwak.holohackernews.app.R;
import io.dwak.holohackernews.app.models.Story;

public class StoryViewHolder extends RecyclerView.ViewHolder {
    @InjectView(R.id.story_title) TextView title;
    @InjectView(R.id.story_submitter) TextView submittedBy;
    @InjectView(R.id.story_long_ago) TextView submissionTime;
    @InjectView(R.id.story_domain) TextView domain;
    @InjectView(R.id.story_points) TextView points;
    @InjectView(R.id.comment_count) TextView commentsCount;
    @InjectView(R.id.bottom_container) View bottomContainer;
    @InjectView(R.id.top_container) View topContainer;
    @InjectView(R.id.save_story_button) TextView saveStory;
    SwipeLayout swipeLayout;
    public boolean isOpening;
    public boolean isReleased;
    public boolean hasBeenDragged;

    public StoryViewHolder(View itemView) {
        super(itemView);
        swipeLayout = (SwipeLayout) itemView;
        ButterKnife.inject(this, itemView);
    }

    public static StoryViewHolder create(@NonNull Context context, @NonNull ViewGroup parent) {
        return new StoryViewHolder(LayoutInflater.from(context).inflate(R.layout.comments_header, parent, false));
    }

    public static void bind(@NonNull StoryViewHolder viewHolder,
                            int position,
                            @NonNull Story story,
                            @NonNull StoryListAdapter.StoryListAdapterListener listener,
                            boolean nightMode) {
        viewHolder.topContainer.setOnClickListener(v -> {
            if (!viewHolder.isOpening && viewHolder.isReleased) {
                if (viewHolder.hasBeenDragged) {
                    viewHolder.hasBeenDragged = false;
                    return;
                }
                listener.onStoryClick(position);
            }
        });
        if(story.isRead()) {
            viewHolder.title
                    .setTextColor(viewHolder.itemView
                                          .getContext()
                                          .getResources()
                                          .getColor(R.color.readTextColor));
        }
        else {
            viewHolder.title
                    .setTextColor(viewHolder.itemView
                                          .getContext()
                                          .getResources()
                                          .getColor(nightMode ? android.R.color.white
                                                              : android.R.color.black));
        }
        viewHolder.title.setText(story.getTitle());
        viewHolder.submittedBy.setText(story.getSubmitter());
        viewHolder.submissionTime.setText(story.getPublishedTime());
        if ("link".equals(story.getType())) {
            String domain = story.getDomain();
            if (!TextUtils.isEmpty(domain)) {
                viewHolder.domain.setVisibility(View.VISIBLE);
                viewHolder.domain.setText(" | " + domain.substring(0, 20 > domain.length() ? domain.length() : 20) + " | ");
            }
            else {
                viewHolder.domain.setVisibility(View.GONE);
            }
        }
        else {
            viewHolder.domain.setText(" | " + story.getType() + " | ");
        }
        viewHolder.points.setText(String.valueOf(story.getPoints()));
        viewHolder.commentsCount.setText(story.getNumComments() + " comments");
        viewHolder.swipeLayout.setShowMode(SwipeLayout.ShowMode.LayDown);
        viewHolder.swipeLayout.addDrag(SwipeLayout.DragEdge.Right, viewHolder.bottomContainer);
        viewHolder.swipeLayout.addSwipeListener(new SwipeLayout.SwipeListener() {
            @Override
            public void onStartOpen(SwipeLayout swipeLayout) {
                viewHolder.isReleased = false;
                viewHolder.isOpening = true;
                viewHolder.hasBeenDragged = true;
            }

            @Override
            public void onOpen(SwipeLayout swipeLayout) {

            }

            @Override
            public void onStartClose(SwipeLayout swipeLayout) {
                viewHolder.isReleased = false;
            }

            @Override
            public void onClose(SwipeLayout swipeLayout) {
                viewHolder.isOpening = false;
            }

            @Override
            public void onUpdate(SwipeLayout swipeLayout, int i, int i1) {

            }

            @Override
            public void onHandRelease(SwipeLayout swipeLayout, float v, float v1) {
                viewHolder.isReleased = true;
            }
        });

        viewHolder.saveStory.setText(viewHolder.itemView
                                             .getContext()
                                             .getResources()
                                             .getString(story.isSaved() ? R.string.story_action_delete
                                                                        : R.string.story_action_save));
        if (nightMode) {
            viewHolder.saveStory.setCompoundDrawablesRelativeWithIntrinsicBounds(0,
                                                                                 story.isSaved() ? R.drawable.ic_delete_white
                                                                                                 : R.drawable.ic_archive_white,
                                                                                 0,
                                                                                 0);
        }
        else {
            viewHolder.saveStory.setCompoundDrawablesRelativeWithIntrinsicBounds(0,
                                                                                 story.isSaved() ? R.drawable.ic_delete_black
                                                                                                 : R.drawable.ic_archive_black,
                                                                                 0,
                                                                                 0);
        }
        viewHolder.saveStory.setOnClickListener(v -> listener.onStorySave(position, !story.isSaved()));

    }
}