package com.novelbook.android;

import android.app.AlertDialog;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Build;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.TextView;

import com.novelbook.android.Activity_base;
import com.novelbook.android.R;
import com.novelbook.android.adapter.BookListAdapter;
import com.novelbook.android.bean.Cataloge;
import com.novelbook.android.db.Chapter;
import com.novelbook.android.db.DownloadTask;
import com.novelbook.android.db.Novel;
import com.novelbook.android.service.ServiceDownload;
import com.novelbook.android.utils.FileUtils;
import com.novelbook.android.utils.Fileutil;
import com.novelbook.android.utils.ImageUtil;

import org.litepal.LitePal;

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

import butterknife.BindView;
import butterknife.ButterKnife;

public class Activity_cache extends Activity_base {
    public static final String TAG=Activity_cache.class.getSimpleName();
    @BindView(R.id.recycleView)
    RecyclerView mRecyclerView;
    @BindView(R.id.tvMsg)
    TextView tvMsg;
    private List<DownloadTask> mData;
    private CacheAdapter mAdapter;
   // private String cacheSize;
    @Override
    public int getLayoutRes() {
        return R.layout.activitycache;
    }

    @Override
    protected void initViews() {

    }

    @Override
    protected void setTitle() {

    }

    @Override
    protected void initData() {
        initiDownloadReceiver();

        showProgressDialog(true,"正在加载...");

        new Thread() {

            @Override
            public void run() {
              //  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                    mData = LitePal.where("id >0").order("id desc").find(DownloadTask.class);//findAll(DownloadTask.class);

                    //cacheSize = FileUtils.getCachedSize();
                  /*  mData.sort(new Comparator<DownloadTask>(){
                        public int compare(DownloadTask arg0, DownloadTask arg1) {
                            int i = arg0.getFinishedChpats()/arg0.getTotalChapts() >  arg1.getFinishedChpats()/arg1.getTotalChapts() ?1:-1;

                            return i; }});*/

            //    }

                handler.sendEmptyMessage(1);

            }
        }.start();

    }

    @Override
    public void fillData() {

        mAdapter = new CacheAdapter(this,mData,R.layout.recycle_list_item_cache,new  OnItemClickLitener() {
            @Override
            public void onItemClick(View view, int position) {
                Novel novel = LitePal.find(Novel.class,mData.get(position).getNovelId());
                showBookDetail(novel);
            }

            @Override
            public void onItemLongClick(View view, int position)
            {
                final AlertDialog.Builder normalDialog =
                        new AlertDialog.Builder(Activity_cache.this);

                normalDialog.setTitle("删除此下载任务并清除缓存吗");
                normalDialog.setMessage("确定删除吗?");
                normalDialog.setPositiveButton("取消",
                        new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {

                            }
                        });
                normalDialog.setNegativeButton("删除",
                        new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                DownloadTask cl = mData.get(position);
                                cl.delete();
                                //   Chapter.deleteByTask();
                                //TODO:clear cache ?


                                mAdapter.removeData(position);

                            }
                        });

                normalDialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
                    @Override
                    public void onDismiss(DialogInterface dialog) {

                    }
                });
                // 显示
                normalDialog.show();
                // mAdapter.removeData(position);
            }

        });

        mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
        mRecyclerView.setAdapter(mAdapter );

      if( mData.size()>0){
        tvMsg.setText(String.format("共有%s条下载记录",mData.size()));
      }else{
          tvMsg.setText(R.string.noRecord);
      }
    }

    private IntentFilter filter;
    DownloadProcessReceiver receiver;
    void initiDownloadReceiver(){
        filter = new IntentFilter("ServiceDownload.ChapterContent.finished");
        filter.addCategory(Intent.CATEGORY_DEFAULT);
        receiver = new DownloadProcessReceiver();
    }
    class DownloadProcessReceiver extends BroadcastReceiver {

        @Override
        public void onReceive(Context context, Intent intent){
            int taskId =0;
            int progress=0;
            int status=0;

         //   tvMsg.setVisibility(View.GONE);
            if( intent.hasExtra("network")){
                String txt  = intent.getStringExtra("network");
                tvMsg.setText(txt);
                tvMsg.setVisibility(View.VISIBLE);
                return;

            }

            if( intent.hasExtra("progress")){
                progress = intent.getIntExtra("progress",0);
            }
            if( intent.hasExtra("taskId")){
                taskId = intent.getIntExtra("taskId",0);
            }
            if( intent.hasExtra("status")){
                status = intent.getIntExtra("status",0);
            }


            Log.d(TAG, String.format("onReceive: taskId %s progress %s ",taskId,progress));
            for(DownloadTask dt : mData){
                if(taskId == dt.getId()){
                   dt.setFinishedChpats(progress);
                   if(status==1){
                       dt.setStatus(1);
                        dt.setDownSatus(DownloadTask.DownStatus.下载完成);
                    }else
                  if(dt.getDownSatus()!=DownloadTask.DownStatus.暂停下载) {
                        dt.setDownSatus(DownloadTask.DownStatus.正在下载);
                      dt.setStatus(0);
                    }

                  // dt = LitePal.find(DownloadTask.class,taskId);

                }else{
                   if(dt.getDownSatus()==DownloadTask.DownStatus.正在下载) {
                        dt.setDownSatus(DownloadTask.DownStatus.排队中);
                    }
                }
            }

            mAdapter.setData(mData);


        }
    }
    private void startDownloadService(int taskId,boolean start) {
        Intent serviceIntent =  new Intent(this, ServiceDownload.class);
        serviceIntent.putExtra("taskId",taskId);
        serviceIntent.putExtra("start",start);
        startService(serviceIntent);
    }

    @Override
    protected void onResume() {
        super.onResume();
        registerReceiver(receiver, filter);
    }

    @Override
    public void onPause() {
        super.onPause();
        unregisterReceiver(receiver);
    }

    class CacheAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
        private final int EMPTY_VIEW = 1;
        private final int PROGRESS_VIEW = 2;
        private final int IMAGE_VIEW = 3;

        private Context context;
        private List<DownloadTask> mDatas = new ArrayList<DownloadTask>();
        private OnItemClickLitener mOnItemClickLitener;
        private int listItemID;
     //  private String norecord ="还没有下载记录";

        public CacheAdapter(Context context, List<DownloadTask> mDatas, int listItemID, OnItemClickLitener clickLitener) {
            this.context = context;
            this.mDatas = mDatas;
            this.mOnItemClickLitener = clickLitener;
            this.listItemID = listItemID;
        }

        public CacheAdapter(Context context, OnItemClickLitener clickLitener) {
            this.context = context;
            this.mOnItemClickLitener = clickLitener;

        }

        @Override
        public int getItemViewType(int position) {
            if (mDatas.size() == 0) {
                return EMPTY_VIEW;
            } else if (mDatas.get(position) == null) {
                return PROGRESS_VIEW;
            } else {
                return super.getItemViewType(position);
            }
        }

        @Override
        public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            if(viewType == EMPTY_VIEW){
                EmptyViewHolder  holder = new EmptyViewHolder (LayoutInflater.from(context).inflate(R.layout.recycle_list_empty_item, parent, false));
                return holder;
            }

            CacheAdapter.MyViewHolder holder = new CacheAdapter.MyViewHolder(LayoutInflater.from(
                    context).inflate(listItemID, parent,
                    false));
            return holder;
        }


        public void setParameters(List<DownloadTask> mDatas, int listItemID) {
            this.mDatas = mDatas;
            this.listItemID = listItemID;
        }

        public void setOnItemClickLitener(OnItemClickLitener mOnItemClickLitener) {
            this.mOnItemClickLitener = mOnItemClickLitener;
        }

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

            if   (hd instanceof  EmptyViewHolder) {
                EmptyViewHolder holder = ( EmptyViewHolder)hd;
                holder.tvEmpty.setVisibility(View.VISIBLE);
                holder.tvEmpty.setText(R.string.noRecord);
                return;
            }
           MyViewHolder holder = ( MyViewHolder)hd;
            holder.tvTitle.setText(mDatas.get(position).getNovelTitle());
            holder.tvSource.setText(mDatas.get(position).getDomainName());
            boolean finished = mData.get(position).getFinishedChpats() == mData.get(position).getTotalChapts();
            holder.tvSize.setText( FileUtils.getCacheSizeK(mData.get(position).getNovelId()));
           if( mData.get(position).getTotalChapts() >0) {
               float progress = mData.get(position).getFinishedChpats() * 100 / mData.get(position).getTotalChapts();
               holder.tvProgress.setText(String.format("%s/%s", mData.get(position).getFinishedChpats() > mData.get(position).getTotalChapts() ? mData.get(position).getTotalChapts() : mData.get(position).getFinishedChpats(), mData.get(position).getTotalChapts()));
               holder.barProgress.setProgress((int) progress);

               holder.tvStatus.setText(mData.get(position).getDownSatus() == DownloadTask.DownStatus.正在下载 ? "正在下载"
                       : mData.get(position).getDownSatus() == DownloadTask.DownStatus.暂停下载 ? "暂停下载" : "休眠中");

               holder.tvStatus.setText(mData.get(position).getStatus() == 1 || mData.get(position).getFinishedChpats() >= mData.get(position).getTotalChapts()
                       ? "下载完成" : holder.tvStatus.getText());


               holder.tvStatus.setText(mData.get(position).getDownSatus() == DownloadTask.DownStatus.排队中 ? "排队中" : holder.tvStatus.getText());

               int img = R.mipmap.play;
               img = mData.get(position).getDownSatus() == DownloadTask.DownStatus.正在下载 ? R.mipmap.pause : R.mipmap.play;

               holder.imgStart.setImageResource(img);
               holder.imgStart.setEnabled(true);
               if (mData.get(position).getStatus() == 1 || mData.get(position).getFinishedChpats() >= mData.get(position).getTotalChapts()) {
                   holder.tvStatus.setText("下载完成");
                   holder.imgStart.setEnabled(false);
                   holder.imgStart.setImageResource(R.mipmap.pause);

               }

           }
           // holder.imgStart.setVisibility(View.GONE);

           holder.imgStart.setOnClickListener(new View.OnClickListener() {
               @Override
               public void onClick(View v) {
                   int pos = holder.getLayoutPosition();

                    if(mData.get(position).getDownSatus() != DownloadTask.DownStatus.正在下载) {
                        startDownloadService(mData.get(pos).getId(),true);
                        holder.imgStart.setImageResource( R.mipmap.pause);
                        mData.get(pos).setDownSatus(DownloadTask.DownStatus.排队中);

                    }else{
                        startDownloadService(mData.get(pos).getId(),false);
                        holder.imgStart.setImageResource( R.mipmap.play);
                        mData.get(pos).setDownSatus(DownloadTask.DownStatus.暂停下载);
                    }
                   mData.get(pos).update( mData.get(pos).getId());


               }
           });

            // 如果设置了回调,则设置点击事件
            if (mOnItemClickLitener != null) {
                holder.itemView.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        int pos = holder.getLayoutPosition();
                        mOnItemClickLitener.onItemClick(holder.itemView, pos);
                    }
                });
            }

            holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
                @Override
                public boolean onLongClick(View v) {
                    int pos = holder.getLayoutPosition();
                    mOnItemClickLitener.onItemLongClick(holder.itemView, pos);
                    return false;
                }
            });
            
        }

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

        public void addData(int position) {
            //   mDatas.add(position, "Insert One");
            //    notifyItemInserted(position);
        }

        public void removeData(int position) {
            mDatas.remove(position);
            notifyItemRemoved(position);
            notifyDataSetChanged();
        }

        public void setData(List<DownloadTask> data) {
            mData = data;
            notifyDataSetChanged();
        }
        class EmptyViewHolder extends RecyclerView.ViewHolder {
            @BindView(R.id.tvLoadText)
            TextView tvEmpty;

            public EmptyViewHolder(View itemView) {
                super(itemView);
                ButterKnife.bind(this, itemView);
            }
        }
        class MyViewHolder extends RecyclerView.ViewHolder {
            @BindView(R.id.tvTitle)
            TextView tvTitle;
            @BindView(R.id.tvProgress)
            TextView tvProgress;
            @BindView(R.id.tvStatus)
            TextView tvStatus;
            @BindView(R.id.barProgress)
            ProgressBar barProgress;
            @BindView(R.id.imgStart)
            ImageView imgStart;
            @BindView(R.id.tvSource)
            TextView tvSource;
            @BindView(R.id.tvSize)
            TextView tvSize;
            public MyViewHolder(View view) {
                super(view);
                ButterKnife.bind(this, view);
                //tvTitle = (TextView) view.findViewById(R.id.title);
                // tvAuthor = (TextView) view.findViewById(R.id.author);

            }
        }
    }
    interface OnItemClickLitener
    {
        void onItemClick(View view, int position);

        void onItemLongClick(View itemView, int pos);
    }


}