package com.ogaclejapan.qiitanium.presentation.view;

import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;

import com.norbsoft.typefacehelper.TypefaceHelper;
import com.ogaclejapan.qiitanium.R;
import com.ogaclejapan.qiitanium.presentation.activity.ArticleActivity;
import com.ogaclejapan.qiitanium.presentation.helper.PicassoHelper;
import com.ogaclejapan.qiitanium.presentation.viewmodel.ArticleViewModel;
import com.ogaclejapan.rx.binding.Rx;
import com.ogaclejapan.rx.binding.RxAction;
import com.ogaclejapan.rx.binding.RxActions;
import com.ogaclejapan.rx.binding.RxView;
import com.squareup.picasso.Transformation;

import rx.Subscription;
import rx.subscriptions.Subscriptions;

public class ArticleListItemView extends AppView<ArticleViewModel>
    implements View.OnClickListener {

  private Rx<TextView> titleText;
  private Rx<TextView> bodyText;
  private Rx<TextView> createdAtText;
  private Rx<TextView> authorNameText;
  private Rx<ImageView> authorThumbnailImage;
  private Rx<ImageView> bookmarkIcon;
  private Rx<TextView> tagText;
  private PicassoHelper picassoHelper;
  private Transformation roundedTransformation;

  public ArticleListItemView(Context context, AttributeSet attrs) {
    super(context, attrs);
    if (isInEditMode()) {
      return;
    }

    picassoHelper = PicassoHelper.create(context);
    roundedTransformation = picassoHelper.roundedTransformation().oval(true).build();
  }

  @Override
  protected void onViewCreated(final View view) {
    titleText = RxView.findById(view, R.id.list_item_article_title);
    bodyText = RxView.findById(view, R.id.list_item_article_body);
    createdAtText = RxView.findById(view, R.id.list_item_article_timeago);
    authorNameText = RxView.findById(view, R.id.list_item_article_author_text);
    authorThumbnailImage = RxView.findById(view, R.id.list_item_article_author_image);
    bookmarkIcon = RxView.findById(view, R.id.list_item_article_bookmark_icon);
    tagText = RxView.findById(view, R.id.list_item_article_tag);

    // Apply custom font
    TypefaceHelper.typeface(createdAtText.get());
    TypefaceHelper.typeface(tagText.get());

    setOnClickListener(this);
  }

  @Override
  protected Subscription onBind(final ArticleViewModel item) {
    return Subscriptions.from(
        titleText.bind(item.title(), RxActions.setText()),
        bodyText.bind(item.excerpt(), RxActions.setText()),
        createdAtText.bind(item.createdAt(), RxActions.setText()),
        authorNameText.bind(item.authorName(), RxActions.setText()),
        authorThumbnailImage.bind(item.authorThumbnailUrl(), loadThumbnailAction()),
        bookmarkIcon.bind(item.isBookmark(), RxActions.setVisibility()),
        tagText.bind(item.tag(), RxActions.setText())
    );
  }

  @Override
  public void onClick(View v) {
    final ArticleViewModel item = getItem();
    ArticleActivity.startActivity(getContext(), item.id());
  }

  protected RxAction<ImageView, String> loadThumbnailAction() {
    return new RxAction<ImageView, String>() {
      @Override
      public void call(final ImageView imageView, final String url) {
        picassoHelper
            .load(url)
            .placeholder(R.drawable.ic_person_outline_white_18dp)
            .error(R.drawable.ic_person_outline_white_18dp)
            .resizeDimen(R.dimen.thumbnail_small, R.dimen.thumbnail_small)
            .transform(roundedTransformation)
            .into(imageView);
      }
    };
  }

}