package com.tysq.ty_android.feature.notification;

import android.content.Context;
import android.graphics.Color;
import android.net.Uri;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.text.SpannableStringBuilder;
import android.text.Spanned;
import android.text.TextPaint;
import android.text.method.LinkMovementMethod;
import android.text.style.ClickableSpan;
import android.text.style.ForegroundColorSpan;
import android.text.style.RelativeSizeSpan;
import android.text.style.ScaleXSpan;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;


import com.bit.utils.DateUtils;
import com.bit.view.fragment.BitBaseFragment;
import com.bumptech.glide.Glide;
import com.jerry.websocket.JWebSocket;
import com.jerry.websocket.WebSocketConstant;
import com.jerry.websocket.model.WsRemindModel;
import com.tysq.ty_android.R;
import com.tysq.ty_android.base.adapter.CommonHeaderSimpleAdapter;
import com.tysq.ty_android.config.Constant;
import com.tysq.ty_android.feature.articleDetail.activity.ArticleDetailActivity;
import com.tysq.ty_android.feature.editArticle.EditArticleActivity;
import com.tysq.ty_android.feature.notification.listener.OnClickNotificationRead;
import com.tysq.ty_android.feature.personalHomePage.PersonalHomePageActivity;
import com.tysq.ty_android.feature.reportDetail.ReportDetailActivity;
import com.tysq.ty_android.utils.MyLinkedMovementMethod;
import com.tysq.ty_android.utils.TyUtils;


import java.lang.ref.WeakReference;
import java.util.List;

import butterknife.BindView;
import butterknife.ButterKnife;
import response.notification.NotificationResp;
import response.common.TitleCountVO;

/**
 * author       : frog
 * time         : 2019-08-29 17:04
 * desc         : 通知的适配器
 * version      : 1.0.0
 */
public class NotificationAdapter
        extends CommonHeaderSimpleAdapter<TitleCountVO, NotificationResp> {

    private final WeakReference<BitBaseFragment> mFragment;
    private final WeakReference<Context> mContext;
    private OnClickNotificationRead mListener;

    public NotificationAdapter(BitBaseFragment fragment,
                               Context context,
                               TitleCountVO header,
                               List<NotificationResp> notificationResps,
                               OnClickNotificationRead listener) {
        super(context, header, notificationResps);
        this.mFragment = new WeakReference<>(fragment);
        this.mContext = new WeakReference<>(context);
        this.mListener = listener;
    }

    @Override
    protected RecyclerView.ViewHolder getHeaderViewHolder(@NonNull ViewGroup parent, int viewType) {
        return new TitleViewHolder(
                mInflater
                        .inflate(R.layout.item_notification_count_title, parent, false)
        );
    }

    @Override
    protected RecyclerView.ViewHolder getContentViewHolder(@NonNull ViewGroup parent, int viewType) {
        return new ContentViewHolder(
                mInflater
                        .inflate(R.layout.item_notification, parent, false)
        );
    }

    @Override
    protected RecyclerView.ViewHolder getEmptyViewHolder(@NonNull ViewGroup parent, int viewType) {
        return null;
    }

    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {

        if (holder instanceof TitleViewHolder) {

            TitleViewHolder titleViewHolder = (TitleViewHolder) holder;

            String format = String.format(mContext.get()
                    .getString(R.string.notification_count), String.valueOf(mHeader.getCount()));

            titleViewHolder.tvTitle.setText(format);

            titleViewHolder.tvRead.setOnClickListener(v -> mListener.onClickNotificationAllRead());

        } else if (holder instanceof ContentViewHolder) {

            ContentViewHolder contentViewHolder = (ContentViewHolder) holder;

            NotificationResp item = mDataList.get(position - 1);

            if (item.getAction().equals(Constant.NotificationType.ARTICLE_NEW_COMMENT)
                    || item.getAction().equals(Constant.NotificationType.COMMENT_NEW_REPLY)) {
                contentViewHolder.tvTitle.setText(item.getSenderName());
                contentViewHolder.tvTitle.setOnClickListener(view ->
                        PersonalHomePageActivity.startActivity(
                                mContext.get(), item.getSender())
                );
            } else {
                contentViewHolder.tvTitle.setText(item.getRemindType());
            }

            //设置头像
            if (item.getAction().equals(Constant.NotificationType.ARTICLE_REVIEW)
                    || item.getAction().equals(Constant.NotificationType.REVIEW_PASS)
                    || item.getAction().equals(Constant.NotificationType.REVIEW_UNPASS)) {
                Glide
                        .with(mContext.get())
                        .load(R.drawable.ic_verify_notify)
                        .into(contentViewHolder.ivPhoto);
            } else if (item.getAction().equals(Constant.NotificationType.REPORT_HANDLER)
                    || item.getAction().equals(Constant.NotificationType.EFFECTIVE_REPORT_HANDLER)
                    || item.getAction().equals(Constant.NotificationType.INVALID_REPORT_HANDLER)
                    || item.getAction().equals(Constant.NotificationType.NEW_REPORT_HANDLER)) {

                Glide
                        .with(mContext.get())
                        .load(R.drawable.ic_report_notify)
                        .into(contentViewHolder.ivPhoto);
            } else if (item.getAction().equals(Constant.NotificationType.DELETE_CATEGORY)){
                Glide
                        .with(mContext.get())
                        .load(R.drawable.ic_delete_notify)
                        .into(contentViewHolder.ivPhoto);
            } else{
                TyUtils.initUserPhoto(
                        mFragment.get(),
                        mContext.get(),
                        item.getAvatarUrl(),
                        contentViewHolder.ivPhoto);
            }

            //设置时间戳
            contentViewHolder.tvTime.setText(DateUtils.getY_M_D_H_M_S_ViaTimestamp(item.getTime() * 1000L));
            //设置通知内容
            setContent(item.getAction(),
                    item.getSenderName(),
                    item.getTitle(),
                    item.getReportNumber(),
                    item.getSender(),
                    contentViewHolder.tvContent);

            //判断是否为已读
            if (item.isRead()) {
                contentViewHolder.redDot.setVisibility(View.GONE);
            } else {
                contentViewHolder.redDot.setVisibility(View.VISIBLE);
            }

            contentViewHolder.itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {

                    if (item.getAction().equals(Constant.NotificationType.REPORT_HANDLER)
                            || item.getAction().equals(Constant.NotificationType.EFFECTIVE_REPORT_HANDLER)
                            || item.getAction().equals(Constant.NotificationType.INVALID_REPORT_HANDLER)) {
                        ReportDetailActivity.startActivity(mContext.get(), item.getReportId());

                    } else if (item.getAction().equals(Constant.NotificationType.DELETE_CATEGORY)){
                        EditArticleActivity.startActivity(mContext.get(), item.getArticleId(), false);
                    }
                    else{
                        ArticleDetailActivity.startActivity(mContext.get(),item.getArticleId());
                    }

                    if (!item.isRead()) {
                        mListener.onClickNotificationRead(item.getNotifyId());
                        contentViewHolder.redDot.setVisibility(View.GONE);
                    }

                }
            });
        }
    }


    private void setContent(String type,
                            String name,
                            String title,
                            String reportNumber,
                            int userId,
                            TextView textView) {
        String content;
        switch (type) {
            case Constant.NotificationType.REVIEW_PASS:
                setContextText(R.string.notification_review_pass, textView, title);
                break;
            case Constant.NotificationType.REVIEW_UNPASS:
                setContextText(R.string.notification_review_unpass, textView, title);
                break;
            case Constant.NotificationType.ARTICLE_REVIEW:
                String format = String.format(mContext.get().getString(R.string.notification_article_review), name, title);
                setContentAndNameClick(format, name, userId, textView);
                break;
            case Constant.NotificationType.ARTICLE_NEW_COMMENT:
                setContextText(R.string.notification_article_new_comment, textView, title);
                break;
            case Constant.NotificationType.COMMENT_NEW_REPLY:
                setContextText(R.string.notification_comment_new_reply, textView, title);
                break;
            case Constant.NotificationType.NEW_REPORT_HANDLER:
                content = String.format(
                        mContext.get()
                                .getString(R.string.notification_new_report_handler), name, title, reportNumber
                );

                setContentAndNameClick(content, name, userId, textView);
                break;
            case Constant.NotificationType.EFFECTIVE_REPORT_HANDLER:
                textView.setText(R.string.notification_effective_report_handler);
                break;
            case Constant.NotificationType.INVALID_REPORT_HANDLER:
                textView.setText(R.string.notification_invalid_report_handler);
                break;
            case Constant.NotificationType.DELETE_CATEGORY:
                setContextText(R.string.notification_delete_category, textView, title);
                break;

        }

    }

    /**
     * 设置富文本内容,并设置昵称的点击事件
     *
     * @param content  内容
     * @param name     昵称
     * @param userId   用户id
     * @param textView
     */
    private void setContentAndNameClick(String content, String name, int userId, TextView textView) {
        SpannableStringBuilder builder = new SpannableStringBuilder(content);
        ClickableSpan clickableSpan = new ClickableSpan() {
            @Override
            public void onClick(@NonNull View view) {
                PersonalHomePageActivity.startActivity(mContext.get(), userId);
            }

            @Override
            public void updateDrawState(@NonNull TextPaint ds) {
                ds.setColor(mContext.get().getResources().getColor(R.color.main_text_color));
            }
        };

        builder.setSpan(
                clickableSpan,
                0,
                name.length(),
                Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

        textView.setText(builder);
        textView.setMovementMethod(MyLinkedMovementMethod.getInstance());
    }

    /**
     * 设置富文本内容
     *
     * @param stringId 资源文件
     * @param textView
     * @param title    标题
     */
    private void setContextText(int stringId, TextView textView, String title) {
        String content = String.format(mContext.get().getString(stringId), title);
        textView.setText(content);
    }

    public static class TitleViewHolder extends RecyclerView.ViewHolder {

        @BindView(R.id.tv_title)
        TextView tvTitle;
        @BindView(R.id.tv_read)
        TextView tvRead;

        public TitleViewHolder(View itemView) {
            super(itemView);
            ButterKnife.bind(this, itemView);
        }

    }

    public static class ContentViewHolder extends RecyclerView.ViewHolder {

        @BindView(R.id.iv_photo)
        ImageView ivPhoto;
        @BindView(R.id.red_dot)
        View redDot;
        @BindView(R.id.tv_time)
        TextView tvTime;
        @BindView(R.id.tv_title)
        TextView tvTitle;
        @BindView(R.id.tv_content)
        TextView tvContent;
        @BindView(R.id.rl_notification)
        RelativeLayout relativeLayout;


        public ContentViewHolder(View itemView) {
            super(itemView);
            ButterKnife.bind(this, itemView);
        }

    }


}